python中matplotlib實現最小二乘法擬合的過程詳解

來源:互聯網
上載者:User

標籤:border   regress   add   ber   .com   關於   for   orm   key   

這篇文章主要給大家介紹了關於python中matplotlib實現最小二乘法擬合的相關資料,文中通過範例程式碼詳細介紹了關於最小二乘法擬合直線和最小二乘法擬合曲線的實現過程,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

最小二乘法Least Square Method,做為分類迴歸演算法的基礎,有著悠久的曆史(由馬里·勒讓德於1806年提出)。它通過最小化誤差的平方和尋找資料的最佳函數匹配。利用最小二乘法可以簡便地求得未知的資料,並使得這些求得的資料與實際資料之間誤差的平方和為最小。最小二乘法還可用於曲線擬合。其他一些最佳化問題也可通過最小化能量或最大化熵用最小二乘法來表達。

下面這篇文章主要跟大家介紹了關於python中matplotlib實現最小二乘法擬合的相關內容,下面話不多說,來一起看看詳細的介紹:

一、最小二乘法擬合直線

產生樣本點

首先,我們在直線 y = 3 + 5x 附近產生服從常態分佈的隨機點,作為擬合直線的樣本點。

?
12345678910 import numpy as np  import matplotlib.pyplot as plt   # 在直線 y = 3 + 5x 附近產生隨機點 X = np.arange(0, 5, 0.1Z = [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()

樣本點:

擬合直線

設 y = a0 + a1*x,我們利用最小二乘法的正則方程組來求解未知係數 a0 與 a1。

numpy 的 linalg 模組中有一個 solve 函數,它可以根據方程組的係數矩陣和方程右端構成的向量來求解未知量。

?
12345678910111213 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)

繪製直線

此時,我們已經得到了擬合後的直線方程係數 a0 和 a1。接下來,我們繪製出這條直線,並與樣本點做對比。

?
1234567 # 產生擬合直線的繪製點 _X = [0, 5_Y = [a0 + a1 * x for x in _X]   plt.plot(X, Y, ‘ro‘, _X, _Y, ‘b‘, linewidth=2plt.title("y = {} + {}x".format(a0, a1))  plt.show()

擬合效果如下:

二、最小二乘法擬合曲線

產生樣本點

與產生直線樣本點相同,我們在曲線 y = 2 + 3x + 4x^2 附近產生服從常態分佈的隨機點,作為擬合曲線的樣本點。

?
12345678910 import numpy as np  import matplotlib.pyplot as plt   # y = 2 + 3x + 4x^2 X = np.arange(0, 5, 0.1Z = [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()

樣本點:

擬合曲線

設該曲線的方程為 y = a0 + a1*x + a2*x^2,同樣,我們通過正則方程組來求解未知量 a0、a1 和 a2。

?
123456789101112131415161718192021222324252627 # 產生係數矩陣A def gen_coefficient_matrix(X, Y):   N = len(X)  m = 3 A = []  # 計算每一個方程的係數  for i in range(m):   a = []   # 計算當前方程中的每一個係數   for j in range(m):    a.append(sum(X ** (i+j)))   A.append(a)  return A   # 計算方程組的右端向量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)

繪製曲線

我們根據求得的曲線方程,繪製出曲線的映像。

?
1234567 # 產生擬合曲線的繪製點 _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=2plt.title("y = {} + {}x + {}$x^2$ ".format(a0, a1, a2))  plt.show()

擬合效果如下:

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流,謝謝大家對指令碼之家的支援。

您可能感興趣的文章:
  • Python中實現最小二乘法思路及實現代碼
 

原文連結:http://www.codebelief.com/article/2017/04/matplotlib-demonstrate-least-square-regression-process/

python中matplotlib實現最小二乘法擬合的過程詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.