[英]Python - Minimizing Chi-squared
我一直試圖通過最小化卡方來擬合線性模型到一組應力/應變數據。 不幸的是,使用下面的代碼並沒有正確地最小化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
這是因為舍入浮點算術。 換句話說,在評估stress - model
,var stress
比model
大許多個數量級,結果被截斷。
然后可以嘗試強制它,增加浮點精度,在使用loadtxt
加載數據之后寫入data=data.astype(np.float128)
。 minimize
失敗, result.success=False
,但有一個有用的消息
由於精度損失,不一定能實現所需的誤差。
一種可能性是提供更好的初始猜測,以便在減法stress - model
中model
部分具有相同的數量級,另一種重新縮放數據,因此解決方案將更接近您的初始猜測(0,0)
。
它是好得多 ,如果你只是重新縮放數據,使得例如無量綱相對於一定的應力值(如yelding /該材料的開裂)
這是擬合的一個示例,使用最大測量應力作為應力標度。 您的代碼中的更改很少:
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)
你的線性模型非常好,即你的材料在這個變形范圍內具有非常線性的行為(無論如何它都是什么材料?):
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.