已知測得某塊地,當溫度處於15至40度之間時,數得某塊草地上小花朵的數量和溫度值的資料如下表所示。現在要來找出這些資料中蘊含的規律,用來預測其它未測溫度時的小花朵的數量。
測得資料如下圖所示:
import matplotlib.pyplot as plt
import numpy as np
temperatures = [15, 20, 25, 30, 35, 40]
flowers = [136, 140, 155, 160, 157, 175]
def least_square(X, Y):
'''
計算最小二乘法的迴歸係數
para X: 矩陣,樣本特徵矩陣,通常包含自變數
para Y: 矩陣,標籤向量,通常包含因變數
return: 矩陣,迴歸係數
'''
# 使用最小二乘法公式計算迴歸係數 W
# W = (X^T * X)^-1 * X^T * Y
W = (X * X.T).I * X * Y.T
return W
# 建立包含樣本的特徵矩陣 X
# 第一行是全1的陣列,用於截距項,第二行是 temperatures 列表中的元素
X = np.mat([[1, 1, 1, 1, 1, 1], temperatures])
# 建立標籤矩陣 Y,包含花朵數量資料
Y = np.mat(flowers)
# 計算迴歸係數 W
W = least_square(X, Y)
import matplotlib.pyplot as plt
# 設定 Matplotlib 的字型樣式,以支援中文顯示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 繪製散點圖,顯示溫度與花朵數量之間的關係
plt.scatter(temperatures, flowers, color="green", label="花朵數量", linewidth=2)
# 繪製資料點形成的線條
plt.plot(temperatures, flowers, linewidth=1)
# 建立 x1 資料,用於生成擬合直線
# linspace 生成15到40之間的100個均勻分佈的值
x1 = np.linspace(15, 40, 100)
# 根據迴歸係數 W 計算對應的 y1 值
y1 = W[1, 0] * x1 + W[0, 0]
# W[1, 0]為w,W[0, 0]為b,y1= w*x1 + b
# 繪製擬合直線
plt.plot(x1, y1, color="red", label="擬合直線", linewidth=2, linestyle='-.')
# 新增圖例,並設定位置
plt.legend(loc='lower right')
# 顯示圖形
plt.show()