如何使用Python最小二乘法擬合曲線代碼詳解
一、背景描述
在一個(gè)普通的摸魚早晨,群里居然出現(xiàn)了一個(gè)不合時(shí)宜頗為突兀的正經(jīng)問題,原來是一個(gè)博士同學(xué)需要対實(shí)驗(yàn)數(shù)據(jù)進(jìn)行曲線擬合并且批量計(jì)算出多項(xiàng)式方程
一般來說,這種問題對(duì)于經(jīng)常做實(shí)驗(yàn)的同學(xué)來說并不陌生,通常使用MATLAB或者Origin Pro這類專業(yè)的數(shù)據(jù)計(jì)算軟件,甚至Excel也可以實(shí)現(xiàn).
但是作為程序員肯定第一想到的還是使用強(qiáng)大的Python來實(shí)現(xiàn),但是因?yàn)楸救酥饕鰆ava開發(fā),python知之甚少,但也知道python強(qiáng)大在各種現(xiàn)成的類庫,所以實(shí)現(xiàn)估計(jì)并不難,按我們就上手試試?
再來一張圖更直觀的表述下,博士同學(xué)就是有多組實(shí)驗(yàn)數(shù)據(jù),可以分布在坐標(biāo)系,例如圖中的各個(gè)散點(diǎn),而他想做的就是將散點(diǎn)擬合為一條曲線,獲得曲線的方程式,從而可以通過輸入其他x坐標(biāo)的值預(yù)測(cè)結(jié)果數(shù)據(jù).這在非常多的地方都有極大的用處
二、前期準(zhǔn)備
在開始前還是需要対一些基本概念和類庫進(jìn)行了解和介紹,因?yàn)椴⒉皇菍I(yè)做研究的,所以對(duì)于以下名詞只做簡單的描述,達(dá)到理解并且可以使用的目的即可
最小二乘法
最小二乘法(又稱最小平方法)是一種數(shù)學(xué)優(yōu)化技術(shù)。它通過最小化誤差的平方和尋找數(shù)據(jù)的最佳函數(shù)匹配。利用最小二乘法可以簡便地求得未知的數(shù)據(jù),并使得這些求得的數(shù)據(jù)與實(shí)際數(shù)據(jù)之間誤差的平方和為最小
最小二乘法是解決曲線擬合問題最常用的方法。
其基本思路是:事先選定的一組線性無關(guān)的函數(shù), 是待定系數(shù) ,擬合準(zhǔn)則是使實(shí)驗(yàn)數(shù)據(jù)(笛卡爾坐標(biāo)系的坐標(biāo)數(shù)據(jù))與待擬合曲線的距離的平方和最小,稱為最小二乘準(zhǔn)則.
總結(jié)來說,我們通常就是使用最小二乘法來做曲線擬合,通過計(jì)算最小值來獲得多項(xiàng)式的系數(shù)與誤差數(shù)值.
(關(guān)于最小二乘法的原理大家可以自行了解,甚至可以讓你重新感知到數(shù)學(xué)邏輯之美)
Python類庫
NumPy
NumPy 是一個(gè) Python 包。 它代表 “Numeric Python”。 它是一個(gè)由多維數(shù)組對(duì)象和用于處理數(shù)組的例程集合組成的庫。支持大量的維度數(shù)組與矩陣運(yùn)算,此外也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫。
Matplotlib
Matplotlib 是 Python 的繪圖庫。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。
三、代碼實(shí)現(xiàn)
這里我們舉一個(gè)例子來展示下,相信下面這道數(shù)學(xué)題大家一定不陌生.
某公司為合理定價(jià),在試銷期間得到單價(jià)x(單位:元)與銷售量y(單位:件)的數(shù)據(jù)如表:
單價(jià)(x) 80 82 84 86 88 90
銷量(y) 90 84 83 80 75 68
如果換做之前,我們肯定就熟練的直接開始列方程解未知數(shù)了,但是現(xiàn)在我已經(jīng)失去了這項(xiàng)能力,那么不妨使用我們準(zhǔn)備好的擬合曲線讓程序來幫我們計(jì)算下.
話不多說,直接上代碼
import matplotlib.pyplot as plt import numpy as np # 準(zhǔn)備數(shù)據(jù),將(x,y)坐標(biāo)點(diǎn)進(jìn)行輸入 x = np.arange(80, 92, 2) # x = 80,82,84,86,88,90 y = np.array([90, 84, 83, 80, 75, 68]) # 使用polyfit方法來擬合,并選擇多項(xiàng)式,這里先使用2次方程 z1 = np.polyfit(x, y, 2) # 使用poly1d方法獲得多項(xiàng)式系數(shù),按照階數(shù)由高到低排列 p1 = np.poly1d(z1) # 在屏幕上打印擬合多項(xiàng)式 print(p1) # 求對(duì)應(yīng)x的各項(xiàng)擬合函數(shù)值 fx = p1(x) # 繪制坐標(biāo)系散點(diǎn)數(shù)據(jù)及擬合曲線圖 plot1 = plt.plot(x, y, '*', label='origin data') plot2 = plt.plot(x, fx, 'r', label='polyfit data') plt.xlabel('x-price') plt.ylabel('y-amount') plt.legend(loc=4) # 指定legend的位置,類似象限的位置 plt.title('polyfit') plt.show() plt.savefig('polyfit.png')
代碼其實(shí)比較簡單,輸入坐標(biāo)數(shù)據(jù),使用polyfit擬合曲線,輸出方程并且將圖標(biāo)畫出來,我們來執(zhí)行下看看結(jié)果如何
左邊那個(gè)就是擬合出來的二次方程,因?yàn)楦袷絾栴},2次方在上面一行,大家能看懂就行,右邊就是這個(gè)曲線的圖,但是可以看出曲線并不能非常好的貼合散點(diǎn)數(shù)據(jù)
這里我們將多項(xiàng)式改為3次方式再試一下
z1 = np.polyfit(x, y, 3)
再試一下
可以看出三次方程對(duì)于數(shù)據(jù)的貼合度還是比較好的,而如何選擇合適的多項(xiàng)式,或者其他類型函數(shù),比如指數(shù)函數(shù),冪函數(shù)等就需要人自己的合理選擇了.
好了,文章就到這里了,在python強(qiáng)大類庫的幫助下,總體還是比較簡單的
總結(jié)
到此這篇關(guān)于如何使用Python最小二乘法擬合曲線的文章就介紹到這了,更多相關(guān)Python最小二乘法擬合曲線內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用matlab 判斷兩個(gè)矩陣是否相等的實(shí)例
這篇文章主要介紹了使用matlab 判斷兩個(gè)矩陣是否相等的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05python web自制框架之接受url傳遞過來的參數(shù)實(shí)例
今天小編就為大家分享一篇python web自制框架之接受url傳遞過來的參數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python運(yùn)行報(bào)錯(cuò)UnicodeDecodeError的解決方法
本文給大家分享的是在Python項(xiàng)目中經(jīng)常遇到的關(guān)于編碼問題的一個(gè)小bug的解決方法以及分析方法,有相同遭遇的小伙伴可以來參考下2016-06-06python通過opencv實(shí)現(xiàn)批量剪切圖片
這篇文章主要介紹了python通過opencv實(shí)現(xiàn)批量剪切圖片,還是挺不錯(cuò)的,這里分享個(gè)大家,供需要的朋友參考。2017-11-11使用tensorflow框架在Colab上跑通貓狗識(shí)別代碼
這篇文章主要介紹了使用tensorflow框架在Colab上跑通貓狗識(shí)別代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04用 Django 開發(fā)一個(gè) Python Web API的方法步驟
這篇文章主要介紹了用 Django 開發(fā)一個(gè) Python Web API的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12linux系統(tǒng)使用python獲取內(nèi)存使用信息腳本分享
這篇文章主要介紹了linux系統(tǒng)使用python獲取內(nèi)存使用情況信息,大家參考使用吧2014-01-01