使用最小二乘法进行线性回归(Python)

已知测得某块地,当温度处于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()

posted @ 2024-10-30 09:37  你这过氧化氢掺水了  阅读(55)  评论(0编辑  收藏  举报