当前位置: 首页 > news >正文

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

一、实验目的

  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)  
  1. 求解参数:使用 NumPy 的 lstsq 函数计算系数 \(a, b\)
coeffs_linear, residuals_linear, _, _ = np.linalg.lstsq(A_linear, y, rcond=None)  
a_linear, b_linear = coeffs_linear  
  1. 计算总误差
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)  
  1. 引入权重矩阵:将权重对角化并左乘矩阵
W = np.diag(weights)  
A_poly_weighted = W @ A_poly  
b_poly_weighted = W @ y  
  1. 求解加权参数
coeffs_poly = np.linalg.lstsq(A_poly_weighted, b_poly_weighted, rcond=None)[0]  
a_poly, b_poly, c_poly = coeffs_poly  
  1. 计算加权总误差
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()  

  (五)完整源代码:

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. 模型复杂度权衡:高次多项式能拟合复杂数据,但需避免过拟合(本实验数据量较小,二次拟合未出现过拟合)。

六、总结

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

相关文章:

  • 以下是修改Java版《我的世界》字体的分步指南(DeepSeek)
  • 后经济时代开源链动2+1模式AI智能名片S2B2C商城小程序驱动零售企业转型研究
  • 基于Spring Boot的高校科研绩效管理的设计与实现
  • Java线程同步:从多线程协作到银行账户安全
  • Linux核心技术:Linux文件系统与bootFS/rootFS
  • 进程通信-内存共享
  • 【目标检测】【医学图像目标检测】BGF-YOLO:脑肿瘤检测的多尺度注意力特征融合
  • Flink 常用算子详解与最佳实践
  • Python数据可视化实战:让数据从「数字堆」变成「故事书」
  • NestJS——重构日志、数据库、配置
  • Javase 基础加强 —— 08 IO流
  • 【Python 命名元祖】collections.namedtuple 学习指南
  • Java中关于数组的使用(下)
  • springboot中过滤器配置使用
  • 《爱的艺术》
  • python打卡训练营打卡记录day36
  • 电梯调度算法详解与Python实现
  • 简单数学板子和例题
  • 【短距离通信】【WiFi】WiFi7关键技术之4096-QAM、MRU
  • LLMs之Qwen:《Qwen3 Technical Report》翻译与解读
  • 哪几个网站做acm题目比较好/百度如何优化
  • 我的世界做圆网站/搜狗网站提交入口
  • 游戏网站搭建需要多少钱/百度权重什么意思
  • 自己如何做独立网站/广告外链平台
  • 国外做的好的医疗网站设计/网站维护
  • 宁波网站建设 熊掌号/seo技术好的培训机构