重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
本文實例講述了Python基于最小二乘法實現(xiàn)曲線擬合。分享給大家供大家參考,具體如下:
十年建站經(jīng)驗, 成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計客戶的見證與正確選擇。成都創(chuàng)新互聯(lián)提供完善的營銷型網(wǎng)頁建站明細(xì)報價表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。
這里不手動實現(xiàn)最小二乘,調(diào)用scipy庫中實現(xiàn)好的相關(guān)優(yōu)化函數(shù)。
考慮如下的含有4個參數(shù)的函數(shù)式:
構(gòu)造數(shù)據(jù)
?
123456789101112131415
import numpy as npfrom scipy import optimizeimport matplotlib.pyplot as pltdef logistic4(x, A, B, C, D):??return (A-D)/(1+(x/C)**B)+Ddef residuals(p, y, x):??A, B, C, D = p??return y - logisctic4(x, A, B, C, D)def peval(x, p):??A, B, C, D = p??return logistic4(x, A, B, C, D)A, B, C, D = .5, 2.5, 8, 7.3x = np.linspace(0, 20, 20)y_true = logistic4(x, A, B, C, D)y_meas = y_true + 0.2 * np.random.randn(len(y_true))
調(diào)用工具箱函數(shù),進(jìn)行優(yōu)化
?
1234
p0 = [1/2]*4plesq = optimize.leastsq(residuals, p0, args=(y_meas, x))????????????# leastsq函數(shù)的功能其實是根據(jù)誤差(y_meas-y_true)????????????# 估計模型(也即函數(shù))的參數(shù)
繪圖
?
12345678
plt.figure(figsize=(6, 4.5))plt.plot(x, peval(x, plesq[0]), x, y_meas, 'o', x, y_true)plt.legend(['Fit', 'Noisy', 'True'], loc='upper left')plt.title('least square for the noisy data (measurements)')for i, (param, true, est) in enumerate(zip('ABCD', [A, B, C, D], plesq[0])):??plt.text(11, 2-i*.5, '{} = {:.2f}, est({:.2f}) = {:.2f}'.format(param, true, param, est))plt.savefig('./logisitic.png')plt.show()
希望本文所述對大家Python程序設(shè)計有所幫助。
很多業(yè)務(wù)場景中,我們希望通過一個特定的函數(shù)來擬合業(yè)務(wù)數(shù)據(jù),以此來預(yù)測未來數(shù)據(jù)的變化趨勢。(比如用戶的留存變化、付費變化等)
本文主要介紹在 Python 中常用的兩種曲線擬合方法:多項式擬合 和 自定義函數(shù)擬合。
通過多項式擬合,我們只需要指定想要擬合的多項式的最高項次是多少即可。
運行結(jié)果:
對于自定義函數(shù)擬合,不僅可以用于直線、二次曲線、三次曲線的擬合,它可以適用于任意形式的曲線的擬合,只要定義好合適的曲線方程即可。
運行結(jié)果:
用polyfit(X,Y,1)得到的擬合函數(shù)只能得到a,b,但不能得到線性相關(guān)系數(shù)R^2。如想要得到其線性相關(guān)系數(shù),可以用regress(y,X),其使用格式
[b,bint,r,rint,stats]
=
regress(y,X);
b——擬合系數(shù)
bint——b的置信區(qū)間
r——殘差值
rint——r的置信區(qū)間
stats——檢驗統(tǒng)計量,第一個就是相關(guān)系數(shù)
例如:
x=[。。。];y=[。。。]
X=[x
ones(n,1)];
%x的行數(shù)(列數(shù))
[b,bint,r,rint,stats]
=
regress(y,X);