matplotlib演示最小二乘法擬合過程

最小二乘法擬合直線

生成樣本點

首先,咱們在直線 y = 3 + 5x 附近生成服從正態分佈的隨機點,做爲擬合直線的樣本點。python

import numpy as np
import matplotlib.pyplot as plt

# 在直線 y = 3 + 5x 附近生成隨機點
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()複製代碼

樣本點如圖所示:app

擬合直線

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

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

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。接下來,咱們繪製出這條直線,並與樣本點作對比。spa

# 生成擬合直線的繪製點
_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()複製代碼

擬合效果以下:
3d

最小二乘法擬合曲線

生成樣本點

與生成直線樣本點相同,咱們在曲線 y = 2 + 3x + 4x^2 附近生成服從正態分佈的隨機點,做爲擬合曲線的樣本點。code

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()複製代碼

樣本點如圖所示:orm

擬合曲線

設該曲線的方程爲 y = a0 + a1*x + a2*x^2,一樣,咱們經過正則方程組來求解未知量 a0、a1 和 a2。cdn

# 生成係數矩陣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)複製代碼

繪製曲線

咱們根據求得的曲線方程,繪製出曲線的圖像。blog

# 生成擬合曲線的繪製點
_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()複製代碼

擬合效果以下:

做者:Wray Zheng
原文: www.codebelief.com/article/201…

相關文章
相關標籤/搜索