python中matplotlib實(shí)現(xiàn)最小二乘法擬合的過(guò)程詳解
前言
最小二乘法Least Square Method,做為分類(lèi)回歸算法的基礎(chǔ),有著悠久的歷史(由馬里·勒讓德于1806年提出)。它通過(guò)最小化誤差的平方和尋找數(shù)據(jù)的最佳函數(shù)匹配。利用最小二乘法可以簡(jiǎn)便地求得未知的數(shù)據(jù),并使得這些求得的數(shù)據(jù)與實(shí)際數(shù)據(jù)之間誤差的平方和為最小。最小二乘法還可用于曲線擬合。其他一些優(yōu)化問(wèn)題也可通過(guò)最小化能量或最大化熵用最小二乘法來(lái)表達(dá)。
下面這篇文章主要跟大家介紹了關(guān)于python中matplotlib實(shí)現(xiàn)最小二乘法擬合的相關(guān)內(nèi)容,下面話不多說(shuō),來(lái)一起看看詳細(xì)的介紹:
一、最小二乘法擬合直線
生成樣本點(diǎn)
首先,我們?cè)谥本€ y = 3 + 5x 附近生成服從正態(tài)分布的隨機(jī)點(diǎn),作為擬合直線的樣本點(diǎn)。
import numpy as np import matplotlib.pyplot as plt # 在直線 y = 3 + 5x 附近生成隨機(jī)點(diǎn) X = np.arange(0, 5, 0.1) Z = [3 + 5 * x for x in X] Y = [np.random.normal(z, 0.5) for z in Z] plt.plot(X, Y, 'ro') plt.show()
樣本點(diǎn)如圖所示:
擬合直線
設(shè) y = a0 + a1*x,我們利用最小二乘法的正則方程組來(lái)求解未知系數(shù) a0 與 a1。
numpy 的 linalg 模塊中有一個(gè) solve 函數(shù),它可以根據(jù)方程組的系數(shù)矩陣和方程右端構(gòu)成的向量來(lái)求解未知量。
def linear_regression(x, y): N = len(x) sumx = sum(x) sumy = sum(y) sumx2 = sum(x**2) sumxy = sum(x*y) A = np.mat([[N, sumx], [sumx, sumx2]]) b = np.array([sumy, sumxy]) return np.linalg.solve(A, b) a0, a1 = linear_regression(X, Y)
繪制直線
此時(shí),我們已經(jīng)得到了擬合后的直線方程系數(shù) a0 和 a1。接下來(lái),我們繪制出這條直線,并與樣本點(diǎn)做對(duì)比。
# 生成擬合直線的繪制點(diǎn) _X = [0, 5] _Y = [a0 + a1 * x for x in _X] plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2) plt.title("y = {} + {}x".format(a0, a1)) plt.show()
擬合效果如下:
二、最小二乘法擬合曲線
生成樣本點(diǎn)
與生成直線樣本點(diǎn)相同,我們?cè)谇€ y = 2 + 3x + 4x^2 附近生成服從正態(tài)分布的隨機(jī)點(diǎn),作為擬合曲線的樣本點(diǎn)。
import numpy as np import matplotlib.pyplot as plt # y = 2 + 3x + 4x^2 X = np.arange(0, 5, 0.1) Z = [2 + 3 * x + 4 * x ** 2 for x in X] Y = np.array([np.random.normal(z,3) for z in Z]) plt.plot(X, Y, 'ro') plt.show()
樣本點(diǎn)如圖所示:
擬合曲線
設(shè)該曲線的方程為 y = a0 + a1*x + a2*x^2,同樣,我們通過(guò)正則方程組來(lái)求解未知量 a0、a1 和 a2。
# 生成系數(shù)矩陣A def gen_coefficient_matrix(X, Y): N = len(X) m = 3 A = [] # 計(jì)算每一個(gè)方程的系數(shù) for i in range(m): a = [] # 計(jì)算當(dāng)前方程中的每一個(gè)系數(shù) for j in range(m): a.append(sum(X ** (i+j))) A.append(a) return A # 計(jì)算方程組的右端向量b def gen_right_vector(X, Y): N = len(X) m = 3 b = [] for i in range(m): b.append(sum(X**i * Y)) return b A = gen_coefficient_matrix(X, Y) b = gen_right_vector(X, Y) a0, a1, a2 = np.linalg.solve(A, b)
繪制曲線
我們根據(jù)求得的曲線方程,繪制出曲線的圖像。
# 生成擬合曲線的繪制點(diǎn) _X = np.arange(0, 5, 0.1) _Y = np.array([a0 + a1*x + a2*x**2 for x in _X]) plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2) plt.title("y = {} + {}x + {}$x^2$ ".format(a0, a1, a2)) plt.show()
擬合效果如下:
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Python的數(shù)據(jù)結(jié)構(gòu)與算法的隊(duì)列詳解(3)
這篇文章主要為大家詳細(xì)介紹了Python的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03matplotlib繪圖實(shí)例演示標(biāo)記路徑
這篇文章主要介紹了matplotlib繪圖實(shí)例演示標(biāo)記路徑,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01使用python求解迷宮問(wèn)題的三種實(shí)現(xiàn)方法
關(guān)于迷宮問(wèn)題,常見(jiàn)會(huì)問(wèn)能不能到達(dá)某點(diǎn),以及打印到達(dá)的最短路徑,下面這篇文章主要給大家介紹了關(guān)于如何使用python求解迷宮問(wèn)題的三種實(shí)現(xiàn)方法,需要的朋友可以參考下2022-03-03淺談對(duì)python中if、elif、else的誤解
這篇文章主要介紹了淺談對(duì)python中if、elif、else的誤解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08在Python3中初學(xué)者應(yīng)會(huì)的一些基本的提升效率的小技巧
這篇文章主要介紹了在Python3中的一些基本的小技巧,有利于剛剛上手Python的初學(xué)者提升開(kāi)發(fā)效率,需要的朋友可以參考下2015-03-03Python爬蟲(chóng)實(shí)現(xiàn)模擬點(diǎn)擊動(dòng)態(tài)頁(yè)面
這篇文章主要介紹了Python爬蟲(chóng)實(shí)現(xiàn)模擬點(diǎn)擊動(dòng)態(tài)頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03解決jupyter notebook import error但是命令提示符import正常的問(wèn)題
這篇文章主要介紹了解決jupyter notebook import error但是命令提示符import正常的問(wèn)題,具有很好的參考2020-04-04