我正在尝试根据我在实验室获得的离散数据集来优化函数。
Spectrum_1
和Spectrum_2
是长度为N
的实验数据集。这两个数组包含 lambdas
数组中每个 lambda(波长)值的值。
所以:
len(Spectrum_1) == len(Spectrum_2) == len(lambdas)
每个
Spectrum_1
和 Spectrum_2
都有符号形式
Spectrum = G(T,lambda) * E(lambda)
E(lambda) 未知,但已知不随 T 变化。E(lambda) 将是离散数据(在“lambda”数组中的每个值上定义的一组点)
G(T, lambda) 是 T 和波长 (lambda) 的已知函数(它是连续且定义的函数)。更具体地说,是关于波长的普朗克黑体辐射方程。
E_1
和 E_2
应相等:
E_1 = Spectrum_1/np.array([G(T_1, lamda) for lamda in lambdas])
E_2 = Spectrum_2/np.array([G(T_2, lamda) for lamda in lambdas])
T_1
和 T_2
未知,但我知道它们在 400 到 1000 范围内(两者)。 T_1
和 T_2
是两个标量值。
知道这一点,我需要最小化:
np.sum(np.array([(E_1[i] - E_2[i])**2 for i in lamdas]))
或者至少我认为我应该尽量减少这种情况。理想情况下
(E_1[i]-E_2[i])==0
但事实并非如此,因为 Spectrum_1
和 _2
中的实验数据包含由于大气传输而产生的噪声和失真。
我不太熟悉在Python中使用多个未知变量进行优化
(T_1 and T_2)
。我想我可以对 T_1
和 T_2
的数百万种组合进行强力测试,但我希望正确地做到这一点。
我想知道是否有人可以帮助我。
我听说 scipy.optimize 可以为我做到这一点,但是许多方法都要求雅可比矩阵和海森矩阵,并且我不确定如何继续,因为我有实验数据(
Spectrum_1
和Spectrum_2
)并且我不处理连续的/平滑功能。
鉴于数据和假设,我认为
scipy.optimize.minimize()
没有理由不起作用。
我听说 scipy.optimize 可以为我做到这一点,但很多方法都需要雅可比矩阵和海森矩阵
这些都不是必需的。如果您不提供它们,将使用数值微分来估计它们,即稍微改变输入并查看输出变化多少。不过,这假设函数是连续的。
鉴于我有实验数据(
和Spectrum_1
),我不确定如何继续,并且我不处理连续/平滑函数。Spectrum_2
据我了解,你确实具有连续函数。您说过 G(T, lambda) 是连续函数。事实上,您将其应用于许多不同的数据样本并不意味着它不再连续。类似地,其他运算符
-
、平方、/
和求和也是连续的。 (除以零除外。)
您可以尝试以下方法:
from scipy.optimize import minimize
# Put experimental data here
Spectrum_1 = np.array([...])
Spectrum_2 = np.array([...])
lambdas = np.array([...])
def loss(params):
T_1, T_2 = params
E_1 = Spectrum_1/np.array([G(T_1, lamda) for lamda in lambdas])
E_2 = Spectrum_2/np.array([G(T_2, lamda) for lamda in lambdas])
# Use vectorization to subtract every element of E_1 from E_2
difference = E_1 - E_2
return np.sum(difference**2)
result = minimize(
loss,
x0=[0, 0], # Put some reasonable initial guess here for T_1 and T_2
)
print(result)
如果您认为这是一个可能有许多局部最小值的函数,您可能还想尝试其中一个全局优化器。