人工智能数学基础实验(三):最小二乘法-数值计算

一、实验目的

  1. 掌握最小二乘法核心原理:理解通过最小化误差平方和实现数据拟合的数学逻辑。
  2. 应用场景实践 :掌握最小二乘法在线性回归、加权回归及多项式拟合中的具体应用,分析不同场景下的拟合效果。
  3. Python 算法实现:使用 NumPy 库实现最小二乘算法,提升数据处理和模型调优能力。

二、实验要求

(一)基础线性拟合

(二)加权多项式拟合

(三)结果分析

  • 对比线性拟合与加权二次拟合的误差值,分析权重和模型复杂度对拟合效果的影响。
  • 可视化原始数据与拟合曲线,直观展示拟合效果差异。

三、实验原理

四、实验步骤

(一)数据准备

复制代码
import numpy as np  
import matplotlib.pyplot as plt  
plt.rcParams['font.sans-serif'] = ['SimHei']  # 支持中文显示  

# 原始数据  
x = np.array([8, 3, 2, 10, 11, 3, 6, 5, 6, 8])  
y = np.array([4, 12, 1, 12, 9, 4, 9, 6, 1, 14])  
weights = np.array([0.1, 0.03, 0.2, 0.07, 0.25, 0.05, 0.1, 0.05, 0.12, 0.03])  

(二)线性回归拟合

  1. 构造设计矩阵:将 x 与常数项堆叠为矩阵 A

    A_linear = np.vstack([x, np.ones(len(x))]).T # 形状为 (n, 2)

  2. 求解参数 :使用 NumPy 的 lstsq 函数计算系数 \(a, b\)

    coeffs_linear, residuals_linear, _, _ = np.linalg.lstsq(A_linear, y, rcond=None)
    a_linear, b_linear = coeffs_linear

  3. 计算总误差

    y_pred_linear = a_linear * x + b_linear
    Q_linear = np.sum((y - y_pred_linear) ** 2)

(三)加权二次多项式拟合

  1. 构造二次项设计矩阵:包含 \(x^2, x, 1\)

    A_poly = np.vstack([x**2, x, np.ones(len(x))]).T # 形状为 (n, 3)

  2. 引入权重矩阵:将权重对角化并左乘矩阵

    W = np.diag(weights)
    A_poly_weighted = W @ A_poly
    b_poly_weighted = W @ y

  3. 求解加权参数

    coeffs_poly = np.linalg.lstsq(A_poly_weighted, b_poly_weighted, rcond=None)[0]
    a_poly, b_poly, c_poly = coeffs_poly

  4. 计算加权总误差

    y_pred_poly = a_poly * x**2 + b_poly * x + c_poly
    Q_poly = np.sum(weights * (y - y_pred_poly) ** 2)

(四)结果可视化

复制代码
plt.figure(figsize=(10, 6))  
plt.scatter(x, y, color='red', label='原始数据点', s=100)  
plt.plot(x_vals, y_vals_linear, color='blue', label=f'线性拟合: y={a_linear:.2f}x+{b_linear:.2f}')  
plt.plot(x_vals, y_vals_poly, color='green', label=f'加权二次拟合: y={a_poly:.2f}x²+{b_poly:.2f}x+{c_poly:.2f}')  
plt.title('最小二乘拟合效果对比', fontsize=16)  
plt.legend()  
plt.grid(True)  
plt.show()  

(五)完整源代码:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 给定数据
x = np.array([8, 3, 2, 10, 11, 3, 6, 5, 6, 8])
y = np.array([4, 12, 1, 12, 9, 4, 9, 6, 1, 14])
weights = np.array([0.1, 0.03, 0.2, 0.07, 0.25, 0.05, 0.1, 0.05, 0.12, 0.03])

#1.最小二乘线性拟合
#构造矩阵A和向量b用于线性拟合
A_linear = np.vstack([x, np.ones(len(x))]).T
coeffs_linear, residuals_linear, _, _ = np.linalg.lstsq(A_linear, y, rcond=None)

# 提取系数
a_linear, b_linear = coeffs_linear

# 计算总误差 Q
y_pred_linear = a_linear * x + b_linear
Q_linear = np.sum((y - y_pred_linear) ** 2)

print("最小二乘线性拟合结果:")
print(f"方程: y = {a_linear:.4f}x + {b_linear:.4f}")
print(f"总误差 Q: {Q_linear:.4f}\n")

#2.带权重的最小二乘二次多项式拟合
#构造矩阵A和向量b用于二次拟合
A_poly = np.vstack([x**2, x, np.ones(len(x))]).T
b_poly = y

# 应用权重
W = np.diag(weights)
A_poly_weighted = W @ A_poly
b_poly_weighted = W @ b_poly

# 解带权重的最小二乘问题
coeffs_poly, residuals_poly, _, _ = np.linalg.lstsq(A_poly_weighted, b_poly_weighted, rcond=None)

# 提取系数
a_poly, b_poly, c_poly = coeffs_poly

# 计算总误差 Q
y_pred_poly = a_poly * x**2 + b_poly * x + c_poly
Q_poly = np.sum(weights * (y - y_pred_poly) ** 2)

print("带权重的最小二乘二次多项式拟合结果:")
print(f"方程: y = {a_poly:.4f}x^2 + {b_poly:.4f}x + {c_poly:.4f}")
print(f"总误差 Q: {Q_poly:.4f}\n")

# 绘图
plt.figure(figsize=(15, 12))

# 绘制原始数据点
plt.scatter(x, y, color='red', label='原始数据点')

# 绘制线性拟合曲线
x_vals = np.linspace(min(x), max(x), 100)
y_vals_linear = a_linear * x_vals + b_linear
plt.plot(x_vals, y_vals_linear, color='blue', label=f'线性拟合: y = {a_linear:.2f}*X + {b_linear:.2f}')

# 绘制二次多项式拟合曲线
y_vals_poly = a_poly * x_vals**2 + b_poly * x_vals + c_poly
plt.plot(x_vals, y_vals_poly, color='gold',label=f'二次多项式拟合: y = {a_poly:.2f}X**2 + {b_poly:.2f}*X + {c_poly:.2f}')

plt.title('最小二乘拟合结果',fontsize=30)
plt.xlabel('x')
plt.ylabel('y')
plt.legend(fontsize=20, loc='best')
plt.grid(True)
plt.show()

五、实验结果

(一)拟合方程与误差

模型类型 拟合方程 总误差 Q
普通线性拟合 (y = 0.6770x + 3.0024) 159.28
加权二次多项式拟合 (y = 0.0148x^2 + 0.6815x - 0.1535) 10.33

(二)结果分析

  1. 误差对比 :加权二次拟合的误差(\(Q=10.33\))远小于线性拟合(\(Q=159.28\)),说明引入权重和更高次项可显著提升拟合精度
  2. 权重作用:权重较大的数据点(如 \(w=0.25\) 的点)对拟合结果影响更大,模型更贴近高权重数据。
  3. 可视化效果
    • 线性拟合:用直线近似数据,无法捕捉曲线趋势,部分点偏离明显。
    • 加权二次拟合:曲线通过多数数据点,尤其在高权重区域拟合更紧密。

(三)核心结论

  1. 最小二乘法的有效性:通过数学优化实现数据拟合,适用于线性和非线性场景。
  2. 权重的意义:加权最小二乘法可根据数据重要性调整拟合策略,提升模型灵活性。
  3. 模型复杂度权衡:高次多项式能拟合复杂数据,但需避免过拟合(本实验数据量较小,二次拟合未出现过拟合)。

六、总结

本次实验通过最小二乘法实现了线性回归与加权多项式拟合,验证了数学优化在数据建模中的核心作用。通过调整权重和模型复杂度,我们学会了根据实际需求平衡拟合精度与模型合理性,为后续学习机器学习算法(如回归分析、支持向量机)奠定了基础。

相关推荐
jndingxin3 分钟前
OpenCV CUDA模块图像处理------颜色空间处理之GPU 上对两张带有 Alpha 通道的图像进行合成操作函数alphaComp()
图像处理·人工智能·opencv
从零开始学习人工智能4 分钟前
VectorNet:自动驾驶中的向量魔法
人工智能·机器学习·自动驾驶
oioihoii9 分钟前
C++23 <spanstream>:基于 std::span 的高效字符串流处理
c++·算法·c++23
IT信息技术学习圈14 分钟前
OpenAI大模型不听人类指令事件的技术分析与安全影响
人工智能·安全
白熊18833 分钟前
【机器学习基础】机器学习入门核心算法:朴素贝叶斯(Naive Bayes)
人工智能·算法·机器学习
Owen_Q35 分钟前
AtCoder Beginner Contest 407
开发语言·c++·算法
cainiao08060536 分钟前
《Scientific Reports撤稿门技术节分析》——从图像篡改检测到学术伦理重建的技术透视
人工智能
客卿12342 分钟前
力扣100题---字母异位词分组
算法·leetcode·职场和发展
JK0x071 小时前
代码随想录算法训练营 Day56 图论Ⅶ 最小生成树算法 Prim Kruskal
算法·图论
kovlistudio1 小时前
大模型应用开发第三讲:大模型是Agent的“大脑”,提供通用推理能力(如GPT-4、Claude 3)
人工智能·深度学习·学习·机器学习