scipy.optimize.minimize卡方python
所以我在做这个任务,我应该最小化卡方函数。我在互联网上看到有人这样做,所以我只是复制了它: 我做了一个卡方函数,它是三个变量(x,y,sigma)中的函数,其中sigma是随机的高斯波动随机的。高斯(0,sigma)。我没有在这里打印这些代码,因为乍一看可能会让人困惑(我使用了很多递归)。但是我可以向你保证这个函数是正确的 现在这段代码只是列出了计算出的最小值(由于随机高斯波动,每次都不同)。但主要问题来了。如果我的计算正确,我们应该得到一个平均值为2的列表(因为我有2个自由度,正如你在这个链接中看到的:) 但是当我使用这个代码时,我得到了一个平均值为4的列表,但是如果我加上方法“Powell”,我得到的平均值是9 所以我的主要问题是,这些方法怎么可能如此不同,我如何知道使用哪种方法来获得最佳优化 因为我认为错误可能在我的平方函数中,所以我也将展示这个函数。这项任务背后的故事是,我们需要找到移动设备的位置,并且在位置(0,0)、(20,0)、(0,20)和(20,20)上有路由器。我们使用了很多递归,卡方图看起来很好(它在(5,5)上有一个最小值)scipy.optimize.minimize卡方python,python,scipy,statistics,chi-squared,Python,Scipy,Statistics,Chi Squared,所以我在做这个任务,我应该最小化卡方函数。我在互联网上看到有人这样做,所以我只是复制了它: 我做了一个卡方函数,它是三个变量(x,y,sigma)中的函数,其中sigma是随机的高斯波动随机的。高斯(0,sigma)。我没有在这里打印这些代码,因为乍一看可能会让人困惑(我使用了很多递归)。但是我可以向你保证这个函数是正确的 现在这段代码只是列出了计算出的最小值(由于随机高斯波动,每次都不同)。但主要问题来了。如果我的计算正确,我们应该得到一个平均值为2的列表(因为我有2个自由度,正如你在这个链
Kees你能用一个额外的关键字参数调用optimize吗:options={'disp':True}?这将打开例程的调试消息传递。您将能够看到是否有任何隐藏的投诉。警告:由于精度损失,不一定会达到预期的错误。当前函数值:6.883043迭代次数:0函数评估:56梯度评估:11这是我所看到的:它将d比较4和9的结果是错误的,因为这两个结果都不收敛(就像你为至少一个问题指出的那样)。请记住,你的问题可能是非凸的,所有这些解算器只能给出一些局部最优解(没有关于全局解的信息)。它们也非常依赖于起点。我认为你应该展示你的
Chi
函数!如果你在优化一个函数时使用exp
而不限制变量,则会出现数值错误,我认为这是非常可能的。更受约束的优化器可能在这方面遇到困难。我将展示我的Chi_平方代码:d是否可以使用其他关键字参数调用optimize:options={'disp':True}?这将打开例程的调试消息传递。您将能够看到是否有任何隐藏的投诉。警告:由于精度损失,不一定会达到预期的错误。当前函数值:6.883043迭代次数:0函数评估:56梯度评估:11这是我所看到的:它将d比较4和9的结果是错误的,因为这两个结果都不收敛(就像你为至少一个问题指出的那样)。请记住,你的问题可能是非凸的,所有这些解算器只能给出一些局部最优解(没有关于全局解的信息)。它们也非常依赖于起点。我认为你应该展示你的Chi
函数!如果你在优化一个函数时使用exp
而不限制变量,则会出现数值错误,我认为这是非常可能的。更受约束的优化器可能在这方面遇到困难。我将展示我的Chi_平方代码:D
def Chi2(pos):
return Chi(pos[0],pos[1],1)
x_list= []
y_list= []
chi_list = []
for i in range(1000):
result = scipy.optimize.minimize(Chi2,[5,5]).x
x_list.append(result[0])
y_list.append(result[1])
chi_list.append(Chi2(result))
def perfectsignal(x_m,y_m,x_r,y_r):
return 20*np.log10(c / (4 * np.pi * f)) - 10 * np.log((x_m-x_r)**2 + (y_m-y_r)**2 + 2**2)
def signal(x_m,y_m,x_r,y_r,sigma):
return perfectsignal(x_m,y_m,x_r,y_r) + random.gauss(0,sigma)
def res(x_m,y_m,x_r,y_r,sigma,sigma2):
x = (signal(x_m,y_m,x_r,y_r,sigma) - perfectsignal(x_m,y_m,x_r,y_r))/float(sigma2);
return x
def Chi(x,y,sigma):
return(res(x,y,0,0,sigma,1)**2+res(x,y,20,0,sigma,1)**2+res(x,y,0,20,sigma,1)**2+res(x,y,20,20,sigma,1)**2)