在了解了最小二乘法的基本原理之后 python_numpy實(shí)用的最小二乘法理解 ,就可以用最小二乘法做曲線擬合了
創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的清水河網(wǎng)站建設(shè)公司,清水河接單;提供成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行清水河網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
從結(jié)果中可以看出,直線擬合并不能對(duì)擬合數(shù)據(jù)達(dá)到很好的效果,下面我們介紹一下曲線擬合。
b=[y1]
[y2]
......
[y100]
解得擬合函數(shù)的系數(shù)[a,b,c.....d]
CODE:
根據(jù)結(jié)果可以看到擬合的效果不錯(cuò)。
我們可以通過(guò)改變
來(lái)調(diào)整擬合效果。
如果此處我們把擬合函數(shù)改為最高次為x^20的多項(xiàng)式
所得結(jié)果如下:
矯正 過(guò)擬合 現(xiàn)象
在保持?jǐn)M合函數(shù)改為最高次為x^20的多項(xiàng)式的條件下,增大樣本數(shù):
通過(guò)結(jié)果可以看出,過(guò)擬合現(xiàn)象得到了改善。
任意波形的生成 (geneartion of arbitrary waveform) 在商業(yè),軍事等領(lǐng)域都有著重要的應(yīng)用,諸如空間光通信 (free-space optics communication), 高速信號(hào)處理 (high-speed signal processing),雷達(dá) (radar) 等。在任意波形生成后, 如何評(píng)估生成的任意波形 成為另外一個(gè)重要的話題。
假設(shè)有一組實(shí)驗(yàn)數(shù)據(jù),已知他們之間的函數(shù)關(guān)系:y=f(x),通過(guò)這些信息,需要確定函數(shù)中的一些參數(shù)項(xiàng)。例如,f 是一個(gè)線型函數(shù) f(x)=k*x+b,那么參數(shù) k 和 b 就是需要確定的值。如果這些參數(shù)用 p 表示的話,那么就需要找到一組 p 值使得如下公式中的 S 函數(shù)最小:
這種算法被稱(chēng)之為 最小二乘擬合 (least-square fitting)。scipy 中的子函數(shù)庫(kù) optimize 已經(jīng)提供實(shí)現(xiàn)最小二乘擬合算法的函數(shù) leastsq 。下面是 leastsq 函數(shù)導(dǎo)入的方式:
scipy.optimize.leastsq 使用方法
在 Python科學(xué)計(jì)算——Numpy.genfromtxt 一文中,使用 numpy.genfromtxt 對(duì)數(shù)字示波器采集的三角波數(shù)據(jù)導(dǎo)入進(jìn)行了介紹,今天,就以 4GHz三角波 波形的擬合為案例介紹任意波形的擬合方法。
在 Python科學(xué)計(jì)算——如何構(gòu)建模型? 一文中,討論了如何構(gòu)建三角波模型。在標(biāo)準(zhǔn)三角波波形的基礎(chǔ)上添加了 橫向,縱向的平移和伸縮特征參數(shù) ,最后添加了 噪聲參數(shù) 模擬了三角波幅度參差不齊的隨機(jī)性特征。但在波形擬合時(shí),并不是所有的特征參數(shù)都要納入考量,例如,噪聲參數(shù)應(yīng)是 波形生成系統(tǒng) 的固有特征,正因?yàn)樗拇嬖谑沟卯a(chǎn)生的波形存在瑕疵,因此,在進(jìn)行波形擬合并評(píng)估時(shí),不應(yīng)將噪聲參數(shù)納入考量,最終模型如下:
在調(diào)用 scipy.optimize.leastsq 函數(shù)時(shí),需要構(gòu)建誤差函數(shù):
有時(shí)候,為了使圖片有更好的效果,需要對(duì)數(shù)據(jù)進(jìn)行一些處理:
leastsq 調(diào)用方式如下:
合理的設(shè)置 p0 可以減少程序運(yùn)行時(shí)間,因此,可以在運(yùn)行一次程序后,用擬合后的相應(yīng)數(shù)據(jù)對(duì) p0 進(jìn)行修正。
在對(duì)波形進(jìn)行擬合后,調(diào)用 pylab 對(duì)擬合前后的數(shù)據(jù)進(jìn)行可視化:
均方根誤差 (root mean square error) 是一個(gè)很好的評(píng)判標(biāo)準(zhǔn),它是觀測(cè)值與真值偏差的平方和觀測(cè)次數(shù)n比值的平方根,在實(shí)際測(cè)量中,觀測(cè)次數(shù)n總是有限的,真值只能用最可信賴(lài)(最佳)值來(lái)代替.方根誤差對(duì)一組測(cè)量中的特大或特小誤差反映非常敏感,所以,均方根誤差能夠很好地反映出測(cè)量的精密度。
RMSE 用程序?qū)崿F(xiàn)如下:
擬合效果,模型參數(shù)輸出:
leastsq 函數(shù)適用于任何波形的擬合,下面就來(lái)介紹一些常用的其他波形:
首先分兩種情況:
1.交互窗口處執(zhí)行:這個(gè)時(shí)候由于python的強(qiáng)制縮進(jìn),因此想要結(jié)束函數(shù)的定義只需要按兩下enter即可。
2.在.py文件中編寫(xiě),結(jié)束函數(shù)只需要不再縮進(jìn)即可
調(diào)用函數(shù)方法相同,把函數(shù)名及參數(shù)寫(xiě)上就可以了,如果有返回值可以
r=functionA(var1)
附:測(cè)試代碼(python3運(yùn)行通過(guò))
# -*- coding:utf-8 -*-
#author:zfxcx
def pt():
print("hello")
pt()
很多業(yè)務(wù)場(chǎng)景中,我們希望通過(guò)一個(gè)特定的函數(shù)來(lái)擬合業(yè)務(wù)數(shù)據(jù),以此來(lái)預(yù)測(cè)未來(lái)數(shù)據(jù)的變化趨勢(shì)。(比如用戶(hù)的留存變化、付費(fèi)變化等)
本文主要介紹在 Python 中常用的兩種曲線擬合方法:多項(xiàng)式擬合 和 自定義函數(shù)擬合。
通過(guò)多項(xiàng)式擬合,我們只需要指定想要擬合的多項(xiàng)式的最高項(xiàng)次是多少即可。
運(yùn)行結(jié)果:
對(duì)于自定義函數(shù)擬合,不僅可以用于直線、二次曲線、三次曲線的擬合,它可以適用于任意形式的曲線的擬合,只要定義好合適的曲線方程即可。
運(yùn)行結(jié)果:
在函數(shù)擬合中,如果用p表示函數(shù)中需要確定的參數(shù),那么目標(biāo)就是找到一組p,使得下面函數(shù)S的值最?。?/p>
這種算法稱(chēng)為最小二乘法擬合。Python的Scipy數(shù)值計(jì)算庫(kù)中的optimize模塊提供了 leastsq() 函數(shù),可以對(duì)數(shù)據(jù)進(jìn)行最小二乘擬合計(jì)算。
此處利用該函數(shù)對(duì)一段弧線使用圓方程進(jìn)行了擬合,并通過(guò)Matplotlib模塊進(jìn)行了作圖,程序內(nèi)容如下:
Python的使用中需要導(dǎo)入相應(yīng)的模塊,此處首先用 import 語(yǔ)句
分別導(dǎo)入了numpy, leastsq與pylab模塊,其中numpy模塊常用用與數(shù)組類(lèi)型的建立,讀入等過(guò)程。leastsq則為最小二乘法擬合函數(shù)。pylab是繪圖模塊。
接下來(lái)我們需要讀入需要進(jìn)行擬合的數(shù)據(jù),這里使用了 numpy.loadtxt() 函數(shù):
其參數(shù)有:
進(jìn)行擬合時(shí),首先我們需要定義一個(gè)目標(biāo)函數(shù)。對(duì)于圓的方程,我們需要圓心坐標(biāo)(a,b)以及半徑r三個(gè)參數(shù),方便起見(jiàn)用p來(lái)存儲(chǔ):
緊接著就可以進(jìn)行擬合了, leastsq() 函數(shù)需要至少提供擬合的函數(shù)名與參數(shù)的初始值:
返回的結(jié)果為一數(shù)組,分別為擬合得到的參數(shù)與其誤差值等,這里只取擬合參數(shù)值。
leastsq() 的參數(shù)具體有:
輸出選項(xiàng)有:
最后我們可以將原數(shù)據(jù)與擬合結(jié)果一同做成線狀圖,可采用 pylab.plot() 函數(shù):
pylab.plot() 函數(shù)需提供兩列數(shù)組作為輸入,其他參數(shù)可調(diào)控線條顏色,形狀,粗細(xì)以及對(duì)應(yīng)名稱(chēng)等性質(zhì)。視需求而定,此處不做詳解。
pylab.legend() 函數(shù)可以調(diào)控圖像標(biāo)簽的位置,有無(wú)邊框等性質(zhì)。
pylab.annotate() 函數(shù)設(shè)置注釋?zhuān)柚辽偬峁┳⑨寖?nèi)容與放置位置坐標(biāo)的參數(shù)。
pylab.show() 函數(shù)用于顯示圖像。
最終結(jié)果如下圖所示:
用Python作科學(xué)計(jì)算
numpy.loadtxt
scipy.optimize.leastsq
求擬合函數(shù),首先要有因變量和自變量的一組測(cè)試或?qū)嶒?yàn)數(shù)據(jù),根據(jù)已知的曲線y=f(x),擬合出Ex和En系數(shù)。當(dāng)用擬合出的函數(shù)與實(shí)驗(yàn)數(shù)據(jù)吻合程度愈高,說(shuō)明擬合得到的Ex和En系數(shù)是合理的。吻合程度用相關(guān)系數(shù)來(lái)衡量,即R^2。首先,我們需要打開(kāi)Python的shell工具,在shell當(dāng)中新建一個(gè)對(duì)象member,對(duì)member進(jìn)行賦值。 2、這里我們所創(chuàng)建的列表當(dāng)中的元素均屬于字符串類(lèi)型,同時(shí)我們也可以在列表當(dāng)中創(chuàng)建數(shù)字以及混合類(lèi)型的元素。 3、先來(lái)使用append函數(shù)對(duì)已經(jīng)創(chuàng)建的列表添加元素,具體如下圖所示,會(huì)自動(dòng)在列表的最后的位置添加一個(gè)元素。 4、再來(lái)使用extend對(duì)來(lái)添加列表元素,如果是添加多個(gè)元素,需要使用列表的形式。 5、使用insert函數(shù)添加列表元素,insert中有兩個(gè)參數(shù),第一個(gè)參數(shù)即為插入的位置,第二個(gè)參數(shù)即為插入的元素。origin擬合中參數(shù)值是程序擬合的結(jié)果,自定義函數(shù)可以設(shè)置參數(shù)的初值,也可以不設(shè)定參數(shù)的初值。
一般而言,擬合結(jié)果不會(huì)因?yàn)槌踔档牟煌刑蟮钠睿绻詈艽?,說(shuō)明數(shù)據(jù)和函數(shù)不太匹配,需要對(duì)函數(shù)進(jìn)行改正。X0的迭代初始值選擇與求解方程,有著密切的關(guān)系。不同的初始值得出的系數(shù)是完全不一樣的。這要通過(guò)多次選擇和比較,才能得到較為合理的初值。一般的方法,可以通過(guò)隨機(jī)數(shù)并根據(jù)方程的特性來(lái)初選。