机器学习实战:多项式回归建模——从模拟数据到模型评估

博主正在参加CSDN博客之星评选,需要您的支持!

投票链接:https://www.csdn.net/blogstar2025/detail/056


题目:多项式回归建模练习

1. 训练资料生成

给定函数:y = sin(x)
取样:在给定的 x 值(x = -3, -2, -1, 0, 1, 2, 3)计算对应的 y 值。
杂讯:对所计算的 y 值,加上高斯杂讯(mean=0, stdev=0.25)。

2. 多项式回归之实作

请使用 NumPy 和 scikit-learn 等函式库,从所计算的 x 和 y 值对多项式之系数进行回归。

要求写成一个独立函数:

  • 输入:x、y、以及所要回归的多项式的 degree
  • 输出:回归得到的所有多项式系数 ak(ak为多项式中 x^k 项的系数,k = 0, 1, …, degree)

3. 模型评估

将产生的训练资料输入到函数,得到多项式系数,并用这些系数对资料中的 x 值计算对应的 y’值:

y i ′ = ∑ k = 0 d a k x i k y_i' = \sum_{k=0}^{d} a_k x_i^kyi=k=0dakxik

其中 i 为资料的 index,d 为多项式的 degree,N 为资料个数。

将 y 和 y’比较,计算均方误差(mean-squared error; MSE):

M S E = 1 N ∑ i = 1 N ( y i − y i ′ ) 2 MSE = \frac{1}{N} \sum_{i=1}^{N} (y_i - y_i')^2MSE=N1i=1N(yiyi)2

针对回归多项式的 degree 为 1, 2, 4, 6 的情形,重复以上的评估步骤。结果以文字列出。

4. 可视化

使用 Matplotlib 等函式库,对上述步骤产生的回归多项式,以及输入的数据点,进行绘图。将所有不同 degree 的结果画在同一张图。

为了绘出平滑的多项式曲线,你需要取一组密集的 x 值(例如每隔 0.01 取一个 x 值),用多项式系数计算对应的 y’值,再用来绘出曲线。


答案与详细解释

完整代码实现

importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.linear_modelimportLinearRegressionfromsklearn.metricsimportmean_squared_error# 设置随机种子以确保结果可重复np.random.seed(42)# 1. 训练资料生成defgenerate_training_data():x=np.array([-3,-2,-1,0,1,2,3])y_true=np.sin(x)# 真实值noise=np.random.normal(0,0.25,len(x))# 高斯杂讯y_noisy=y_true+noise# 加入杂讯后的y值returnx,y_true,y_noisy# 2. 多项式回归函数defpolynomial_regression(x,y,degree):""" 多项式回归函数 参数: x: 输入特征值,形状为 (n_samples,) y: 目标值,形状为 (n_samples,) degree: 多项式阶数 返回: coefficients: 多项式系数 [a0, a1, ..., ad] """# 重塑x为2D数组x_reshaped=x.reshape(-1,1)# 生成多项式特征poly=PolynomialFeatures(degree=degree)X_poly=poly.fit_transform(x_reshaped)# 训练线性回归模型model=LinearRegression()model.fit(X_poly,y)# 获取系数coefficients=model.coef_ coefficients[0]=model.intercept_# 截距项returncoefficients# 3. 模型评估defevaluate_polynomial_model(x,y_true,coefficients):""" 评估多项式模型 参数: x: 输入特征值 y_true: 真实目标值 coefficients: 多项式系数 返回: y_pred: 预测值 mse: 均方误差 """degree=len(coefficients)-1y_pred=np.zeros_like(y_true)# 计算预测值fori,xiinenumerate(x):forkinrange(degree+1):y_pred[i]+=coefficients[k]*(xi**k)# 计算均方误差mse=mean_squared_error(y_true,y_pred)returny_pred,mse# 4. 可视化函数defvisualize_results(x_train,y_train,y_true,all_coefficients,degrees):""" 可视化多项式回归结果 参数: x_train: 训练数据x值 y_train: 训练数据y值(含杂讯) y_true: 真实y值(无杂讯) all_coefficients: 所有degree的系数列表 degrees: 多项式的degree列表 """plt.figure(figsize=(12,8))# 绘制训练数据点plt.scatter(x_train,y_train,color='black',s=100,label='训练数据(含杂讯)',zorder=5)# 绘制真实函数曲线x_smooth=np.arange(-3.5,3.5,0.01)y_smooth_true=np.sin(x_smooth)plt.plot(x_smooth,y_smooth_true,'k-',linewidth=3,label='真实函数: sin(x)',alpha=0.7)# 为每个degree绘制多项式曲线colors=['red','blue','green','orange']line_styles=['--','-.',':','-']foridx,(degree,coefficients)inenumerate(zip(degrees,all_coefficients)):# 计算平滑曲线上的预测值y_smooth_pred=np.zeros_like(x_smooth)forkinrange(len(coefficients)):y_smooth_pred+=coefficients[k]*(x_smooth**k)# 绘制多项式曲线plt.plot(x_smooth,y_smooth_pred,color=colors[idx],linestyle=line_styles[idx],linewidth=2,label=f'Degree{degree}多项式')plt.xlabel('x',fontsize=14)plt.ylabel('y',fontsize=14)plt.title('多项式回归拟合结果对比',fontsize=16)plt.legend(fontsize=12,loc='best')plt.grid(True,alpha=0.3)plt.xlim(-3.5,3.5)plt.ylim(-1.5,1.5)plt.show()# 主程序defmain():# 1. 生成训练资料x_train,y_true,y_train=generate_training_data()print("训练数据生成完成!")print(f"x值:{x_train}")print(f"真实y值 (sin(x)):{y_true}")print(f"加入杂讯后的y值:{y_train}")print()# 2. & 3. 对不同的degree进行多项式回归和评估degrees=[1,2,4,6]all_coefficients=[]mse_results=[]print("="*60)print("多项式回归结果")print("="*60)fordegreeindegrees:print(f"\nDegree{degree}多项式回归:")# 执行多项式回归coefficients=polynomial_regression(x_train,y_train,degree)all_coefficients.append(coefficients)# 评估模型y_pred,mse=evaluate_polynomial_model(x_train,y_train,coefficients)mse_results.append(mse)# 显示结果print(f"多项式系数:{coefficients}")print(f"多项式方程: y = ",end="")forkinrange(len(coefficients)):ifk==0:print(f"{coefficients[k]:.4f}",end="")else:print(f" +{coefficients[k]:.4f}x^{k}",end="")print()print(f"训练集上的MSE:{mse:.6f}")print(f"预测值:{y_pred}")print("\n"+"="*60)print("MSE结果汇总")print("="*60)fordegree,mseinzip(degrees,mse_results):print(f"Degree{degree}: MSE ={mse:.6f}")# 4. 可视化visualize_results(x_train,y_train,y_true,all_coefficients,degrees)if__name__=="__main__":main()

模块导入

pipinstallscikit-learn

运行结果

详细解释

1. 训练资料生成

我们首先生成训练数据:

  • x值:[-3, -2, -1, 0, 1, 2, 3]
  • 真实y值:sin(x)
  • 加入高斯杂讯(mean=0, stdev=0.25)

这是机器学习中的常见做法,模拟真实世界数据往往包含测量误差或随机扰动的情况。

2. 多项式回归函数

多项式回归的基本思想是将特征转换为多项式特征,然后使用线性回归进行拟合。对于单变量x,d阶多项式回归模型为:

y = a 0 + a 1 x + a 2 x 2 + . . . + a d x d y = a_0 + a_1x + a_2x^2 + ... + a_dx^dy=a0+a1x+a2x2+...+adxd

在我们的实现中:

  • 使用PolynomialFeatures将x转换为多项式特征矩阵
  • 使用LinearRegression拟合线性模型
  • 系数按升幂顺序排列:a₀, a₁, …, a_d
3. 模型评估

我们使用均方误差(MSE)作为评估指标:

M S E = 1 N ∑ i = 1 N ( y i − y i ′ ) 2 MSE = \frac{1}{N} \sum_{i=1}^{N} (y_i - y_i')^2MSE=N1i=1N(yiyi)2

MSE越小表示模型拟合越好。由于我们使用相同的训练数据进行训练和评估,这里计算的是训练误差。

4. 可视化

可视化帮助我们直观理解不同阶数多项式的拟合效果:

  • 黑色点:原始训练数据(含杂讯)
  • 黑色实线:真实函数sin(x)
  • 彩色曲线:不同阶数多项式的拟合结果

运行结果分析

根据随机种子42的运行结果,我们会看到:

  1. Degree 1(线性回归)
    • 只能拟合直线,对sin(x)这样弯曲的函数拟合效果较差
    • MSE通常较大
  2. Degree 2(二次多项式)
    • 可以拟合抛物线形状,比线性回归有所改善
    • 但对sin(x)的周期性变化仍无法很好捕捉
  3. Degree 4(四次多项式)
    • 有足够的灵活性来近似sin(x)在给定区间的形状
    • MSE显著降低
  4. Degree 6(六次多项式)
    • 理论上可以完美拟合7个数据点(6阶多项式有7个系数)
    • 可能出现过拟合现象:在训练数据上MSE非常小,但对新数据的泛化能力可能较差

重要概念解析

偏差-方差权衡(Bias-Variance Tradeoff)
  • 低阶多项式(如degree=1,2):高偏差,低方差,可能欠拟合
  • 高阶多项式(如degree=6):低偏差,高方差,可能过拟合
  • 适度阶数(如degree=4):在偏差和方差之间取得平衡
过拟合(Overfitting)

当模型过于复杂(如degree=6)时,它会完美拟合训练数据,包括其中的噪声,导致对新数据的预测性能下降。

模型复杂度与泛化能力

模型复杂度(多项式阶数)需要根据具体问题和数据量来选择。在实践中,我们通常使用交叉验证来选择最佳的多项式阶数。

扩展思考

  1. 如果增加更多训练数据点,不同阶数多项式的表现会如何变化?
  2. 如何确定最佳的多项式阶数?
  3. 如果真实函数不是sin(x)而是更复杂的函数,多项式回归是否仍然有效?
  4. 如何避免高阶多项式的数值不稳定问题?

该练习展示了多项式回归的基本原理和应用,是理解模型复杂度、过拟合/欠拟合等机器学习核心概念的绝佳示例。


博主正在参加CSDN博客之星评选,需要您的支持!

如果我的博文曾帮您解决过问题,或带来过一些灵感,诚邀您为我投上一票。
投票链接:https://www.csdn.net/blogstar2025/detail/056
感谢每一位阅读、点赞和收藏的朋友,更感谢此刻为我投票的您!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英特尔AI双赛走出的万名开发者,正在弥合AI人才缺口

作者:金旺近日,据央视新闻报道,我国人工智能企业数量已突破6200家,2025年我国人工智能核心产业规模已经突破1万亿元,人工智能大模型正在融入千行百业。与此同时,另一个来自人力资源社会保障部的统计数据显示…

【网安区块链项目参考】基于区块链的安全日志防篡改系统的设计与实现

整个系统资料包含:全套源码注释开发文档部署指导说明,需要的话可以私信博主获取,伸手党勿扰基于区块链的安全日志防篡改系统的设计与实现摘要随着信息系统规模的不断扩大,系统安全日志在网络安全审计、入侵检测与事后取证中发挥着…

【计算机毕业设计案例】基于django定制化ERP系统APP企业客户设备进销存系统小程序(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

无线网络仿真:蓝牙网络仿真_(15).蓝牙网络仿真研究前沿

蓝牙网络仿真研究前沿 1. 蓝牙网络仿真的背景与意义 1.1 无线网络仿真的重要性 无线网络仿真是一种重要的研究工具,用于评估和优化无线通信系统的性能。通过仿真,研究人员可以模拟真实世界中的各种无线通信场景,从而分析网络的行为和性能。无…

用提示工程让大模型自己检查自己:CoVe方法有效减少幻觉

LLM幻觉问题至今没有根治方案。RAG能缓解一部分,但成本高、架构复杂,而且只适用于有外部知识源的场景。而对于模型"应该知道但经常搞错"的那类问题,比如历史事件的时间线、人物履历的细节,RAG帮不上什么…

Flink 流处理从入门到精通:DataStream 转换与窗口操作实战

💡 Flink DataStream API 实战全解析:Map、FlatMap、Filter 与 Window 窗口操作详解 封面图建议:深蓝科技感背景,中央 Flink logo,流动线条展示数据流动,关键词“Map / FlatMap / Filter / Window Processing”,简洁直观。 目录 Flink 执行环境与时间语义 基础转换操作…

Java 27 首获后量子混合密钥交换功能提案

计划于9月发布的标准Java版本——Java开发工具包(JDK)27已经获得了首个功能提案:后量子混合密钥交换能力,用于加强网络安全。该功能名为"TLS 1.3的后量子混合密钥交换",已于1月13日在OpenJDK的JDK 27页面上列…

深入 Flink 数据源:RichSourceFunction 的设计与最佳实践

Flink DataStream API 实战:从 SourceFunction 到 RichSourceFunction 的进阶与优化 本文详细讲解了 Apache Flink 中源函数(Source Function)的演进,从最基础的 SourceFunction 到功能更强大的 RichSourceFunction,并结合数据库、Kafka 仿真及可配置化场景提供实战示例,…

小程序毕设项目推荐-基于django+小程序的工厂定制化ERP办公系统APP小程序【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

新手友好 Linux Mint 22.3“Zena“正式发布,带来系统全面升级

如果你想尝试 Linux Mint,现在正是时候。全新改进的"Zena"版本已经到来——仍然基于 Ubuntu Noble,但现在配备了 Cinnamon 6.6、改进的 Wayland 支持,以及更好的国际化功能、新的系统信息和系统管理工具,还有更清晰的图…

什么是挖矿木马?我猜你还不知道

前言 挖矿木马主要就是通过利用各种手段,将挖矿程序植入到用户的计算机中,在用户不知情的情况下,偷偷利用用户的计算机进行执行挖矿功能,从而获取收益。 以下情况是用户中木马的高频事件: 1.用户往往在不注意的时候…

2026校招薪资报告:AI/大模型岗位领跑,附完整学习路径与资料包

2026届校招分析显示:AI/大模型岗位薪资最高(60w-90w),需求激增需掌握Transformer、RAG等技术。测试开发和客户端是性价比之选。学历显著影响薪资起点(双非本科6k至985硕30k)。文章提供大模型学习四阶段路径,从初阶应用到商业闭环,…

云厂商与软件供应商承担万亿美元AI投资,但长期成本终将转向用户

根据Gartner预测,软件供应商和云服务提供商正在承担今年预期万亿美元AI支出增长的主要负担,总投资将达到2.52万亿美元。这家全球技术分析公司预测,AI支出将比去年的1.76万亿美元增长44%。这一数字较9月份估计的1.5万亿美元有所上调。到2029年…

MySQL + MQ 最终一致性终极方案:Outbox + 幂等 + 补偿 + 对账全解析

适用对象:后端架构师 / 高级开发 / 分布式系统设计者 适用场景:订单系统、支付系统、库存系统、账户系统、积分系统、异步解耦系统 MQ 示例:RocketMQ(Kafka、Pulsar 原理一致) 一、问题背景:为什么分布式系统一定会“不一致”? 在微服务架构中,最常见的模式是: 业务服…

小程序计算机毕设之基于django智能制造业ERP系统定制化ERP系统APP小程序(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

在360干了3年网络安全工程师,30岁即将退休的我,告诉你网络安全的真实就业前景

文章目录 前景 网络安全行业真实前景有那么好吗?网络安全人才一将难求,缺口高达 95%安全岗位选择多,薪酬福利高,发展前景好网络安全上升至国家战略,相关政策相继出台 如何入门学习网络安全【黑客】 【----帮助网安学习…

计算机小程序毕设实战-基于django定制化ERP系统APP小程序员工管理、客户管理、设备管理【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

红蓝对抗 网络安全 网络安全红蓝对抗演练

什么是红蓝对抗 在军事领域,演习是专指军队进行大规模的实兵演习,演习中通常分为红军、蓝军,演习多以红军守、蓝军进攻为主。类似于军事领域的红蓝军对抗,网络安全中,红蓝军对抗则是一方扮演黑客(蓝军&…

Web应用防火墙(WAF)核心功能特性汇总

Web应用防火墙(WAF)是聚焦HTTP/HTTPS应用层的安全防护设备,专门弥补传统防火墙(如USG6525E)在Web业务防护上的短板,核心功能覆盖攻击拦截、流量管控、数据安全、Bot治理等多个维度,具体特性如下: 一、 核心Web攻击防护(对标OWASP Top 10) 针对Web应用的高频高危攻击…

DEMO:Canal实时同步MySQL内容到Elasticsearch

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …