所以我正在做这个任务,我应该尽量减少chi平方函数。我看到有人在互联网上这样做,所以我只是复制了它:
Multiple variables in SciPy's optimize.minimize
我做了一个卡方函数,它是3个变量(x,y,sigma)中的函数,其中sigma是随机高斯波动random.gauss(0,sigma)。我没有在这里打印该代码,因为第一眼看上去可能会令人困惑(我使用了大量的递归)。但我可以向你保证这个功能是正确的。
现在这段代码只列出了计算出的最小化(由于随机高斯波动,每次都不同)。但这是主要问题。如果我正确地进行了计算,我们应该得到一个平均值为2的列表(因为我有2个自由度,你可以在这个链接中看到:https://en.wikipedia.org/wiki/Chi-squared_test)。
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))
但是当我使用这个代码时,我得到一个平均值4的列表,但是如果我添加方法“Powell”我得到9的平均值!!
所以我的主要问题是,这些方法有多么可能如此不同,我怎么知道使用哪种方法来获得最佳优化?
因为我认为错误可能出现在我的chisquare函数中,所以我也会展示这个错误。这项任务背后的故事是我们需要找到移动设备的位置,我们在位置(0,0),(20,0),(0,20)和(20,20)上有路由器。我们使用了很多递归,而chi_squared的图表看起来很好(它有一个最小值(5,5)
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)
基斯