Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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/3/sql-server-2005/2.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_Statistics_Scipy_Minimization_Chi Squared - Fatal编程技术网

Python-最小化卡方误差

Python-最小化卡方误差,python,statistics,scipy,minimization,chi-squared,Python,Statistics,Scipy,Minimization,Chi Squared,我一直试图通过最小化卡方误差,将线性模型拟合到一组应力/应变数据中。不幸的是,使用下面的代码并不能正确地最小化chisqfunc函数。它是在初始条件下求最小值,x0,这是不正确的。我浏览了scipy.optimize文档,并测试了其他正常工作的函数。请您建议如何修复下面的代码,或者建议我可以使用的另一种方法,通过最小化卡方误差使线性模型适合数据 import numpy import scipy.optimize as opt filename = 'data.csv' data = num

我一直试图通过最小化卡方误差,将线性模型拟合到一组应力/应变数据中。不幸的是,使用下面的代码并不能正确地最小化
chisqfunc
函数。它是在初始条件下求最小值,
x0
,这是不正确的。我浏览了
scipy.optimize
文档,并测试了其他正常工作的函数。请您建议如何修复下面的代码,或者建议我可以使用的另一种方法,通过最小化卡方误差使线性模型适合数据

import numpy
import scipy.optimize as opt

filename = 'data.csv'

data = numpy.loadtxt(open(filename,"r"),delimiter=",")

stress = data[:,0]
strain = data[:,1]
err_stress = data[:,2]

def chisqfunc((a, b)):
    model = a + b*strain
    chisq = numpy.sum(((stress - model)/err_stress)**2)
    return chisq

x0 = numpy.array([0,0])

result =  opt.minimize(chisqfunc, x0)
print result
感谢您阅读我的问题,如有任何帮助,我们将不胜感激

干杯,威尔


编辑:我当前使用的数据集:

问题是您最初的猜测与实际解决方案相差甚远。如果在
chisqfunc()
中添加一条print语句,比如
print(a,b)
,然后重新运行代码,您将得到如下结果:

(0, 0)
(1.4901161193847656e-08, 0.0)
(0.0, 1.4901161193847656e-08)
这意味着
minimize
仅在这些点计算函数

例如,如果您现在尝试对这3对值求值
chisqfunc()
,您将看到它们完全匹配

print chisqfunc((0,0))==chisqfunc((1.4901161193847656e-08,0))
True
这种情况的发生是因为四舍五入浮点算法。换句话说,在评估
应力-模型
时,var
应力
模型
大太多数量级,结果被截断

然后,您可以在使用
loadtxt
加载数据之后,通过写入
data=data.astype(np.float128)
来尝试对其进行强制操作,提高浮点精度<代码>最小化失败,结果为
结果。成功=错误
,但有一条有用的消息

由于精度损失,不一定达到预期误差

一种可能是提供更好的初始猜测,以便在减法
应力-模型中
模型
部分具有相同的数量级,另一种是重新缩放数据,以便解决方案更接近您的初始猜测
(0,0)

如果您只需重新缩放数据,例如相对于某个应力值(如该材料的剥落/开裂)进行无量纲化,效果会更好

这是一个配件示例,使用最大测量应力作为应力标度。您的代码中几乎没有更改:

import numpy
import scipy.optimize as opt

filename = 'data.csv'

data = numpy.loadtxt(open(filename,"r"),delimiter=",")

stress = data[:,0]
strain = data[:,1]
err_stress = data[:,2]


smax = stress.max()
stress = stress/smax
#I am assuming the errors err_stress are in the same units of stress.
err_stress = err_stress/smax

def chisqfunc((a, b)):
    model = a + b*strain
    chisq = numpy.sum(((stress - model)/err_stress)**2)
    return chisq

x0 = numpy.array([0,0])

result =  opt.minimize(chisqfunc, x0)
print result
assert result.success==True
a,b=result.x*smax
plot(strain,stress*smax)
plot(strain,a+b*strain)
你的线性模型非常好,即你的材料在这个变形范围内具有非常线性的行为(到底是什么材料?)

代码在我看来很好,在我的机器上创建的一些模拟数据上提供了很好的结果。只需注意一点:您的变量
err_stress
不同变形值的测量应力的不确定性是否正确?一个小问题:您正在使用
打印结果检查结果。x
对吗?最小化不会更新
x0
。感谢您的快速回复,我确实使用了
打印结果。x
。是
err\u stress
是测量应力数组的一组错误。什么是
result.success
result.status
调用
minimize
result.success
结果。status
为0和
结果。x
[0]/code>。感谢Warren的帮助。啊,我试着使用
stats.linregresse
的结果作为初始条件,但不幸的是,这也没有起作用。我认为它不起作用的原因是应力值太大,
chisqfunc
中没有太多变化,而
x0
中的变化很小。使用
smax
进行重新缩放效果很好。非常感谢你在这方面的帮助。该数据是Cu98%/Be2%导线延伸的数据集样本(仅线性截面)。