Python numpy中的无环卡方网格搜索

Python numpy中的无环卡方网格搜索,python,numpy,multidimensional-array,vectorization,curve-fitting,Python,Numpy,Multidimensional Array,Vectorization,Curve Fitting,最佳拟合线性参数A和B(y=Ax+B)对应于这些参数上卡方函数的最小值。我想对全局卡方最小值进行蛮力网格搜索(保证,因为2参数线性卡方是抛物面),并通过3个嵌套循环(如下)实现了它,但希望避免循环(即,使用Numpy的阵列广播属性进行矢量化) 卡方(加权最小二乘)定义为: Chi-square(k,j) = sum (y[i]-(A[k]*x[i]+B[j]))/yerr[i])^2 下面是Python Numpy代码,它用卡方值填充100 x 100的网格,这些卡方值超过a和B参数值的100

最佳拟合线性参数A和B(y=Ax+B)对应于这些参数上卡方函数的最小值。我想对全局卡方最小值进行蛮力网格搜索(保证,因为2参数线性卡方是抛物面),并通过3个嵌套循环(如下)实现了它,但希望避免循环(即,使用Numpy的阵列广播属性进行矢量化)

卡方(加权最小二乘)定义为:

Chi-square(k,j) = sum (y[i]-(A[k]*x[i]+B[j]))/yerr[i])^2
下面是Python Numpy代码,它用卡方值填充100 x 100的网格,这些卡方值超过a和B参数值的10000个组合(每个100个值)。有三个数据数组:x、y和YER

感谢您在PythonNumpy中提供无环版本的2参数线性卡方网格搜索

注意:我想进行网格搜索,而不是使用scipy.optimize.minimize——谢谢

基思


这里有一种矢量化方法,利用-

这是另一个可能更快的有-


最后一行的缩进看起来是错误的。另外,它不应该是
chi2[k,j]+=chi2a
吗?两个注释都是(现在已编辑)。谢谢你抓到这个!我想我们还需要两个制表符缩进,因为我们需要对
chi2a
的每次计算的更新求和。而且,
range(1100)
应该是
range(100)
,然后再加上子来覆盖所有元素。是的,谢谢!刚刚用您的更正测试了脚本,现在看起来运行良好。再次感谢。
# create parameter grid
a = np.linspace(80,120,100)
b = np.linspace(10,40,100)
A,B = np.meshgrid(a,b)

# calculate chi-square over parameter grid
chi2=np.zeros((100,100))

for k in range(100):
    for j in range(100):
        for i in range (len(y)):
            chi2a = ((y[i]-a[k]*x[i]-b[j])/yerr[i])**2;
            chi2[k,j]+=chi2a;
subs = (y-a[:,None,None]*x-b[:,None])/yerr
chi2 = (subs**2).sum(2)
chi2 = np.einsum('ijk,ijk->ij',subs,subs) #subs from previous one