Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多项式拟合的最优阶的卡方_Python_Python 3.x - Fatal编程技术网

Python 多项式拟合的最优阶的卡方

Python 多项式拟合的最优阶的卡方,python,python-3.x,Python,Python 3.x,我有以下代码,其中DGauss是一个生成预期值的函数。另一方面,这两个数组允许我生成一个分布,作为观察值。 代码根据观察到的值,提取一个描述其趋势的多项式(七次矩) import matplotlib.pyplot as plt import numpy as np from scipy.optimize import curve_fit def DGauss(x,I1,I2,sigma1,sigma2): return I1*np.exp(-x*x/(2*sigma1*sigma1)

我有以下代码,其中DGauss是一个生成预期值的函数。另一方面,这两个数组允许我生成一个分布,作为观察值。 代码根据观察到的值,提取一个描述其趋势的多项式(七次矩)

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

def DGauss(x,I1,I2,sigma1,sigma2):
    return I1*np.exp(-x*x/(2*sigma1*sigma1)) + I2*np.exp(-x*x/(2*sigma2*sigma2))

Pos = np.array([3.28, 3.13, 3.08, 3.03, 2.98, 2.93, 2.88, 2.83, 2.78, 2.73, 2.68,
       2.63, 2.58, 2.53, 2.48, 2.43, 2.38, 2.33, 2.28, 2.23, 2.18, 2.13,
       2.08, 2.03, 1.98, 1.93, 1.88, 1.83, 1.78, 1.73, 1.68, 1.63, 1.58,
       1.53, 1.48, 1.43, 1.38, 1.33, 1.28, 1.23, 1.18, 1.13, 1.08, 1.03,
       0.98, 0.93, 0.88, 0.83, 0.78, 0.73, 0.68, 0.63, 0.58, 0.53, 0.48,
       0.43, 0.38, 0.33, 0.28, 0.23, 0.18, 0.13, 0.08, 0.03])

Val = np.array([0.00986279, 0.01529543, 0.0242624 , 0.0287456 , 0.03238484,
       0.03285927, 0.03945234, 0.04615091, 0.05701618, 0.0637672 ,
       0.07194268, 0.07763934, 0.08565687, 0.09615262, 0.1043281 ,
       0.11350606, 0.1199406 , 0.1260062 , 0.14093328, 0.15079665,
       0.16651464, 0.18065023, 0.1938894 , 0.2047541 , 0.21794024,
       0.22806706, 0.23793043, 0.25164404, 0.2635118 , 0.28075974,
       0.29568682, 0.30871501, 0.3311846 , 0.34648062, 0.36984661,
       0.38540666, 0.40618835, 0.4283945 , 0.45002014, 0.48303911,
       0.50746062, 0.53167057, 0.5548792 , 0.57835128, 0.60256181,
       0.62566436, 0.65704847, 0.68289386, 0.71332794, 0.73258027,
       0.769608  , 0.78769989, 0.81407275, 0.83358852, 0.85210239,
       0.87109068, 0.89456217, 0.91618782, 0.93760247, 0.95680234,
       0.96919757, 0.9783219 , 0.98486193, 0.9931429 ])

f = np.linspace(-9,9,2*len(Pos))    

plt.errorbar(Pos, Val, xerr=0.02, yerr=2.7e-3, fmt='o')
popt, pcov = curve_fit(DGauss, Pos, Val)
plt.plot(xfull, DGauss(f, *popt), '--', label='Double Gauss')

x = Pos
y = Val
#z, w = np.polyfit(x, y, 7, full=False, cov=True)
p = np.poly1d(z)
u = np.array(p)
xp = np.linspace(1, 6, 100)
_ = plt.plot(xp, p(xp), '-', color='darkviolet')
x = symbols('x')
list = u[::-1]
poly = sum(S("{:7.3f}".format(v))*x**i for i, v in enumerate(list))
eq_latex = sympy.printing.latex(poly)
print(eq_latex)

#LOOP SUGGESTED BY @Fourier
dof = [1,2,3,4,5,6,7,8,9,10]
for i in dof:
    z = np.polyfit(x, y, i, full=False, cov=True)
    chi = np.sum((np.polyval(z, x) - y) ** 2)
    chinorm = chi/i
    plt.plot(chinorm)
我现在想做的是通过改变多项式的阶数来进行拟合,以找出我需要的最小阶数,以便进行良好的拟合,并且不超过自由参数的数量。特别是,我想用不同的顺序来拟合,并绘制卡方图,卡方图必须根据自由度的数量进行标准化。 有人能帮我一下吗


谢谢

根据发布的代码,这应该适用于您的目的:

chiSquares = []

dofs = 10
for i in np.arange(1,dofs+1):
    z = np.polyfit(x, y, i, full=False, cov=False)
    chi = np.sum((np.polyval(z, x) - y) ** 2) / np.std(y) #ideally you should divide this using an error for Val array
    chinorm = chi/i
    chiSquares.append(chinorm)

plt.plot(np.arange(1,dofs+1),chiSquares)
如果从图中看不明显,可以进一步使用F-test检查实际需要多少自由度:

n = len(y)
for d, (rss1,rss2) in enumerate(zip(chiSquares,chiSquares[1:])):
    p1 = d + 1
    p2 = d + 2        
    F = (rss1-rss2/(p2-p1)) / (rss2/(n-p2))
    p = 1.0 - scipy.stats.f.cdf(F,p1,p2)
    print 'F-stats: {:.3f},  p-value: {:.5f}'.format(F,p)

您可以简单地循环使用多项式项递增的
dof
(即数据点的总数-1),并使用like
numpy.sum((numpy.polyval(z,x)-y)**2)计算相应的卡方误差(
)并通过该循环中相应的
dof
值进行归一化。您可以编写一个助手函数来比较这些规范化值。最好是存储它们,并绘制
dof
norm的相关性。卡方检验
以找到最佳解决方案。感谢您的回复,我尝试实现了您建议的循环,您可以在我的问题的代码中找到更改。不幸的是,当我尝试运行该运行时,出现以下错误:AttributeError:“Symbol”对象没有属性“ndim”,引用polyfit命令。但是,我没有想到的是,如果我从循环中删除polyfit语句,然后在循环外再次插入它,它不会给我任何错误。问题的关键是,您没有提供一个。我们只有你发布的信息。但出现错误消息的原因似乎是您没有明显的原因集成了一些Symphy函数。@XaBla删除协方差矩阵。对于这个特定的任务,您不需要它。看到我的答案了吗