scipy.optimize.minimize chi squared python

时间:2016-09-14 08:52:37

标签: python scipy statistics chi-squared

所以我正在做这个任务,我应该尽量减少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)

基斯

0 个答案:

没有答案