拟合多项式演示overfitting
# 预先导入库
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate
在本例中,输入变量\(x\)为一维,然后对应的输出\(y=sin(x)+ \epsilon\),其中\(\epsilon\)为噪声。那么生成数据的代码为:
def make_data():
"""生成一维数据并且返回,y=sin(4x) + noise"""
np.random.seed(1)
X = np.sort(np.random.rand(30))
y = np.sin(4 * X) + np.random.randn(30) * 0.3
return X, y
一维线性回归
一开始,我们先用直接用线性回归拟合曲线。众所周知,拟合出来应该是一条直线。实际跑出来结果如下:

多元线性回归
要使得拟合结果更好,就需要增加输入变量的维度。要如何增加维度比较科学?大学我们有学过正弦函数的级数表达,也就是说:
\[sin(x) = a_0 * x + a_1 * x^2 + a_2 * x^3 + ...\]
所以接下来的目标是给输入变量\(x\)添加幂次方维度,并分析随着维度的增加,拟合曲线会怎么变化。
给输入变量增加维度可以使用sklearn.preprocessing.PolynomialFeatures处理,具体代码如下:
def get_polynomial_feature(origin_features, deg):
"""
用于添加幂次方维度,最后以np.array形式返回
:param origin_features: 多维数组,本例中shape为(n,1),即类似于np.array([[1],[2]])
:param deg: 需要扩展的维度.比如deg=3,那就是x, x^2, x^3
:return: 扩展后的np.array
"""
polynomial = PolynomialFeatures(
degree=deg,
include_bias=False # 不生成常数项
)
polynomial_features = polynomial.fit_transform(origin_features)
return polynomial_features
然后,根据\(degree\)的不同,生成不同的输入变量\(H_{degree}(x)\),使用sklearn的LinearRegression来拟合即可。
if __name__ == '__main__':
# 生成数据
features, target = make_data()
features = features.reshape(-1, 1)
# 在图上画出点
plot_data(features, target)
for i in [1, 2, 4, 16]:
poly_data = get_polynomial_feature(features, i)
model = LinearRegression()
model.fit(poly_data, target)
# print(f"degree - {i}:", model.coef_) # 查看模型训练得到的参数
# 插值处理画图平滑曲线
x = features.squeeze() # 生成插值的数据只能是一维
pred_y = model.predict(poly_data)
new_x = np.arange(x.min(), x.max(), 0.0002) # 插值范围不能超过原数据的最小最大值
func = interpolate.interp1d(x, pred_y, kind='cubic') # kind方法:zero、slinear、quadratic、cubic
new_y = func(new_x)
# 画图
plt.plot(new_x, new_y, label='degree' + str(i))
plt.legend()
plt.axis([0, 1, -1.5, 2]) # 设置横轴纵轴长度
plt.show()
最后得到拟合曲线如下所示:

为了画图好看,我用插值方法画出了更平滑的曲线,使用方法在代码中都有注释,完整代码可以访问我的github。
最后总结一下,随着维度的增加,对于这些点的拟合情况逐渐变好,甚至趋于“变形”。这种模型的泛化能力不会太好。凭心而论,我觉得在\(deg=6\)左右的情况下,拟合效果可能会比较好。有兴趣试验的小伙伴可以在make_data生成更多的数据,然后使用交叉验证测试一下。
拟合多项式演示overfitting的更多相关文章
- 数据拟合:多项式拟合polynomial curve fitting
http://blog.csdn.net/pipisorry/article/details/49804441 常见的曲线拟合方法 1.使偏差绝对值之和最小 2.使偏差绝对值最大的最小 3 ...
- numpy多项式拟合
关于解决使用numpy.ployfit进行多项式拟合的时候请注意数据类型,解决问题的思路就是统一把数据变成浮点型,就可以了.这是numpy里面的一个bug,非常low希望后面改善. # coding: ...
- 【转】Matlab多项式拟合
转:https://blog.csdn.net/hwecc/article/details/80308397 例: x = [0.33, 1.12, 1.41, 1.71, 2.19] y = [0. ...
- Apache Commons Math3学习笔记(2) - 多项式曲线拟合(转)
多项式曲线拟合:org.apache.commons.math3.fitting.PolynomialCurveFitter类. 用法示例代码: // ... 创建并初始化输入数据: double[] ...
- 建模算法(九)——拟合
一.线性最小二乘法 1.基本思路 令,其r(x)是事先选定的一组线性无关的函数.ak是待定系数.然后拟合的准则就是使得yi与f(xi)的距离的平方和最小,称之为最小二乘准则 2.系数的确定 ,要使距离 ...
- matlab最小二乘法数据拟合函数详解
定义: 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可 以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小. ...
- 最小二乘法拟合java实现源程序(转)
因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用./** * <p>函数功能:最小二乘法曲线拟合</p> * @ ...
- 最小二乘法多项式曲线拟合原理与实现 zz
概念 最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y= φ(x). 原理 [原理部分由个人根据互联网上的资料进行总结,希望对大家能有用] ...
- 用Python开始机器学习(3:数据拟合与广义线性回归)
机器学习中的预测问题通常分为2类:回归与分类. 简单的说回归就是预测数值,而分类是给数据打上标签归类. 本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析. 本例中使用一个 ...
随机推荐
- windows Service 之调试过程(附加到进程里调试,而且启动时间不能超过30秒)
最近第一次用C#写了一个windows service ,其实实现的内容比较简单.就是启动remoting 连接,但是调试相对初次写windws service 的我来说,比较烦.没有经验,而且没办法 ...
- “多团队大规模”开发模式 - 基于SAP HANA平台的多团队产品研发
应用SAP HANA “官方”开发模式的伙伴们在转到“多团队大规模”开发模式时会遇到各式各样的心理不适应的状况,各种纠结.比如GIT Repository和HANA Repository冲突什么的. ...
- J2EE--Struts2基础开发
内容中包含 base64string 图片造成字符过多,拒绝显示
- 使用Arcgis Pro 发布矢量切片
ArcGIS Pro 中的任何地图或底图都可以创建矢量切片,但是有一些局限性和特殊注意事项.为创建矢量切片制作地图的重点是构建一个有效的地图,以快速绘制生成的切片. 软件环境 操作系统:Windows ...
- JS数据结构第三篇---双向链表和循环链表之约瑟夫问题
一.双向链表 在上文<JS数据结构第二篇---链表>中描述的是单向链表.单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点的地 ...
- 设计模式之单例模式的几种写法——java
对于设计模式的使用场景和好处,之前有介绍一篇,今天主要是单例模式的编写方式,直接看代码吧 单例模式之饿汉模式,不会懒加载.线程安全 /** * @Author wangtao * @Descripti ...
- element-ui源码之组件通信那些事
最近在用element-ui重构前端项目,无意之中翻阅到一个比较好用的组件间通信方式,借助于vue的封装的发布-订阅消息模式与mixin语法.在开始之前先总结下vue常用的组件间通信方式,具体如下: ...
- Vim入门操作整理
根据小甲鱼的vim入门视频整理,供查阅 移动指令:上下左右 k j h l 翻页: ctrl + b ctrl + f 保存退出:ZZ 普通模式:vim fileName 首次进入的就是普通模式 从 ...
- GIS热力图制作与位置大数据分析
最近有很多朋友咨询位置数据.热力图等等东西,我一一进行了解答,但是个人精力实在有限,特写一个博客进行详细技术说明,其实这个东西位置数据.百度地图POI.高德地图POI等数据爬取.存储都较为简单,热力图 ...
- Android前沿技术
一.热升级Tinker源码解析与手写二.热修复阿里百川Sophix内核原理三.App Instantgoogle8.0 类似热更新技术原理与实战四.强制更新1.银行应用非对称加密对称加密五.组件化框架 ...