机器学习实验一-多项式拟合
一、实验目的
掌握最小二乘法求解(无惩罚项的损失函数)、掌握加惩罚项(2范数)的损失函数优化、梯度下降法、共轭梯度法、理解过拟合、克服过拟合的方法(如加惩罚项、增加样本)
- 实验要求及实验环境
实验要求:
1. 生成数据,加入噪声;
2. 用高阶多项式函数拟合曲线;
3. 用解析解求解两种loss的最优解(无正则项和有正则项)
4. 优化方法求解最优解(梯度下降,共轭梯度);
5. 用你得到的实验数据,解释过拟合。
6. 用不同数据量,不同超参数,不同的多项式阶数,比较实验效果。
7. 语言不限,可以用matlab,python。求解解析解时可以利用现成的矩阵求逆。梯度下降,共轭梯度要求自己求梯度,迭代优化自己写。不许用现成的平台,例如pytorch,tensorflow的自动微分工具。
实验环境:
Windows 10 ;python 3.9.7;jupyter notebook 6.4.12
三、设计思想(本程序中的用到的主要算法及数据结构)
由高数中的泰勒级数可知,足够高阶的多项式可以拟合任意函数。因此,我们可以用多项式来拟合正弦函数sin(2πX)。在m阶多项式中,有m+1个待定系数,m+1个系数(由低到高)组成的(列)向量记作w。
为了确定w,分别使用最小二乘法与梯度下降法。
3.1 最小二乘法:
最下二乘法的代价函数为:
使用最小二乘法其中,X为多项式中各个未知项代入观测数据求得的矩阵,若记Xi为X的第i行的向量,则Xi[j]为第i个观测数据xi的j次方,记有n组观测数据,多项式最高次为m,易知X的维度为n * (m+1)。Y为观测标签向量。即Y[j]为第j组观测数据的标签值(即y值)。从而问题转化为:求向量w,使得E(w)最小。
下面分别分析添加惩罚项与否时的w取值。首先,我们令损失函数导数等于0,求此时的w。
图1-1 无惩罚项时的w求解过程
在前面的求解过程中,没有加惩罚项,此时随着阶数m的增大,w*往往具有较大的绝对值,从而赋予多项式函数E ( w )更强的变化能力。往往会为了更加贴合训练集中样本点,使得 w各维数值绝对值很大、很复杂,将一些不属于训练集的特征(如:噪声的影响)都学习到了,发生了过拟合。因此,我们可以增加惩罚项,迫使 w*的绝对值没有那么大。添加惩罚项,令损失函数导数等于0,求此时的w。
图1-2 有惩罚项时的w求解过程
3.1.2 最小二乘法核心算法如图所示:
图1-3 最小二乘法核心算法
3.2 梯度下降法
梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处,如图1-3所示:
图1-4 梯度下降法示例
梯度下降的基本过程就和下山的场景很类似。
首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向。
我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。
3.2.1 梯度下降法算法实现:
核心部分如图所示:
图3.2.1 梯度下降法核心算法
3.3 共轭梯度法
首先,我们考虑线性对称正定方程组: ,其等价于求解如下凸优化问题:
其中。
于是,假设已经有了一组共轭向量,我们把未知量表示为它们的线性组合,我们希望能够寻找一组系数,去极小化
求和中的每一项都是独立的,极小化之,那么我们就可以得到
通过共轭方向,把一个 n 维问题,拆解成了 n 个一维问题。
其伪代码如下:
3.2.2 共轭梯度法算法实现:
其核心部分如下:
图3.2.2 共轭梯度法核心代码
- 实验结果与分析
4.1 使用解析解求解不含有正则项的 loss 函数
4.1.1 求解最优解
根据如上算法,我们在使用 3 阶多项式的时候得到了如图4.1的曲线,同时得到了最终的解向量w,将该解向量与x轴坐标阶数矩阵点乘,得到如图4.1的曲线,它的 RMS 值是:0.074
图4.1 5阶多项式拟合曲线 图4.3 5阶多项式拟合loss值
4.1.2 过拟合
在这种情况下,非常容易出现过拟合的情况,只要将多项式的阶数值调到一个较大的时候,就会出现过拟合的现象,如图4.3所示,出现过拟合的时候该模型过多地拟合了图中的数据点(此时 RMS 为0.004)以至于该模型对其他的输入预测能力很弱。出现过拟合的时候该多项式的曲线很明显并不是一个和 sin(2πx) 相近的曲线。其损失函数如图4.4所示。
图4.3 13阶多项式拟合曲线 图4.4 13阶多项式拟合loss值
4.1.3 使用不用的数据量,不同的多项式阶数结果比较
为了完成本小节的实验,我选取了 M = 3,5,7,9,12共让该模型跑5次,得到随着 M阶数的变化,每一次的结果如图4.5所示。
- 3阶多项式 (b) 5阶多项式 (c) 7阶多项式
(d) 9阶多项式 (e) 12阶多项式
图4.5 不同阶数多项式下的拟合效果
可以看出,不改变数据集大小的情况下,随着模型复杂度的上升,出现了过拟合的现象。
对于不同的数据集大小,我分别选取了10,30,60,150,300的数据集大小,在多项式项数设置为5的时候进行了5次实验,得到的结果如图4.7所示。
- Sample=10 (b) Sample=30 (c) Sample=60
(d) Sample=150 (e) Sample=300 (f) 损失函数随数据集大小变化
图4.6 不同数据集下的多项式拟合效果
可以看出,当数据集大小开始增加的时候,模型预测的曲线逐渐向正确的 sin(2πx) 靠拢,说明增加数据集大小是一种克服过拟合的方法。
4.2 使用解析解求解带有正则项的 loss 函数
4.2.1 求解最优解
在上一小节中我们得到添加数据量可以减少过拟合的发生,但是在实际中获取数据常常是一个费时费力的过程,于是我们为了减少过拟合的发生,添加一个正则项(即惩罚项),在本实验中经过一番尝试,在 λ =e-5 的时候可以获得较好的结果。我分别选取M=5,10,15,25,共让该模型跑4次,得到随着 M阶数的变化,每一次的结果如图4.7所示。
- 5阶多项式 (b) 10阶多项式
- 15阶多项式 (d) 25阶多项式
图4.7 不同阶数多项式下的拟合效果
4.3 使用梯度下降法求解带有正则项的 loss 函数
4.3.1 求解最优解
经过一番尝试,我发现当步长设置在 0.1,λ 设置在 e-6 并且训练40万次的时候,可以得到如图4.8所示的较好结果,此时训练集上的 ERM S 是 0.03。
图4.8 learning_rate=0.1, λ=e-6
- λ=e-4 (b) λ=e-5 (c) λ=e-6
- λ=e-7 (e) λ=e-8 (f) λ=e-9
图4.9 梯度下降法带有正则项的 loss 函数改变超参数模型的输出
经过多次尝试发现,当 λ<=e-6时,最终形成的结果效果都很好,且随着λ的减小,迭代达到对应精度的所需次数逐渐减小,最终可在20万次左右达到对应精度。
接下来,我修改了学习率(即步长)lr,分别取值1的-1到-6次方,得到不同情况下的拟合效果和loss曲线。(由于设备原因,迭代次数上限依旧为40万次)
图4.11 不同lr下的loss曲线
最后我尝试了在learning_rate=0.0000001时迭代400万次后的结果如图所示:
其效果表现出当学习率过低时,足够的迭代次数可能也无法弥补效果的差距。
4.5 共轭梯度法求解带有正则项的 loss 函数
4.5.1 求解最优解
本小节中,我们使用共轭梯度法求解带有正则项的 loss 函数,得到的结果4.12如图所示。其相较于共轭梯度法最大区别在于运行时间大大缩短。(受限于要求的函数较为简单,面对复杂函数时共轭梯度法能比梯度下降法效果更佳未能体现)。其损失函数为0.03。
图4.12 共轭梯度法拟合效果,sample=8
- 结论
在本文中,我们尝试了解析解、梯度下降、随机梯度下降、共轭梯度共四种方法,体会了不同的数据集大小,不同的超参数,不同的多项式阶数对机器学习模型的影响,熟悉了 python 语言中和矩阵运算的相关模块,加深了对于多项式回归这一机器学习基本模型的理解和实现能力。
- 参考文献
共轭梯度法英文维基百科 https://en.wikipedia.org/wiki/Conjugate_gradient_method
梯度下降法英文维基百科 https://en.wikipedia.org/wiki/Gradient_descent
斯坦福机器学习课程讲义吴恩达 http://www.andrewng.org
- 附录:源代码(带注释)
- 最小二乘法(.ipynb)
- import numpy as np # 导入numpy库,此库用于进行矩阵运算等操作
- import matplotlib.pyplot as plt # 导入pyplot绘图库
- plt.rcParams['font.sans-serif']=['SimHei']#显示中文
- plt.rcParams['axes.unicode_minus']=False#显示负号
- %matplotlib inlineglobal poly_degree # 多项式次数
- def funcy(X): #定义初始函数
- return np.sin(2 * np.pi * X)
- def getData(X_range, X_num, func, noise_variance): #生成数据集
- X = np.linspace(X_range[0], X_range[1], num=sample_num) # 生成对应范围和数量的等距向量
- Y = funcy(X) + np.random.normal(loc=0, scale=noise_variance, size=sample_num)
- # 生成X对应函数的值向量,增加了高斯噪声
- return X, Y
- def get_matrix(x, M): #生成(sample_num,order)的参数矩阵
- X = pow(x, 0)
- for i in range(1, M + 1):
- X = np.column_stack((X, pow(x, i)))
- return X
- def LeastSquareM(X, T): # 最小二乘法求解向量
- s=X.size/sample_num
- regular = np.eye(int(s))
- regular[0][0] = 0
- lam=0.00001
- W = np.linalg.inv((X.T) @ X+lam*regular) @ (X.T) @ (T) # lam=0时认无惩罚项
- return W
- def loss(T, X, W): # 定义对应损失函数
- Y = np.transpose(W) @ X.T # 画出预测函数的值,X2·W得到的是一个样本数*1的向量
- a1 = Y.reshape(-1, 1).T @ X @ W
- a2 = Y.reshape(-1, 1).T @ T
- a31 = T.reshape(-1, 1).T @ X
- a32 = np.transpose(W).reshape(-1, 1)
- a3 = a31 @ a32
- a4 = T.reshape(-1, 1).T @ T.reshape(-1, 1)
- los = (a1 - a2 - a3 + a4).squeeze(-1).squeeze(-1)
- return los/sample_num
- # 常量区
- X_range = (0.0, 1.0)
- sample_num = 10
- funcName = funcy
- noise_variance = 0.1 # 噪声的方差
- level=26#多项式拟合阶数
- # x, y为两个向量,对应的x[k],y[k]则是图像上的一个点\
- x = np.linspace(0.0, 1.0, num=sample_num) # 生成从0.0开始到2.0结束的sample_num个等距向量
- y = funcy(x) # 同样是一个数列,x的sin函数,注意numpy中默认使用弧度制
- x2 = np.linspace(0.0, 1.0, num=1200) #以此画出真值弧线和拟合弧线
- y2 = funcy(x2)
- errorList = list() # 记录不同阶数的错误率List
- _X, _Y = getData(X_range, sample_num, funcName, noise_variance)
- # x 原始数据集的x坐标集合
- # X 由x的1到n次方构成的矩阵
- # W 求解的目标解向量
- for i in range(1, level):
- X = get_matrix(x, i)
- W = LeastSquareM(X, _Y) # W的计算使用样本的X
- errorList.append(loss(_Y, X, W)) # 计算这次循环的错误率,并加入到 errorList向量中
- # value=X @ W
- #plt.plot(x,value,"r-",x2,y2)
- X2 = get_matrix(x2, level-1) #画出拟合曲线所需的x坐标参数矩阵
- value=X2 @ W #得到拟合的y坐标
- print("Value.shape:",value.shape)
- plt.plot(x2,value.reshape(-1,1),"r-",x2,y2)
- x1=np.linspace(0.0, 1.0, num=sample_num)
- plt.plot(x1,_Y,"co",markersize=2.)
- plt.legend(["$Result$","$Y=sin(2
机器学习实验一-多项式拟合相关推荐
- java 多项式拟合最多的项数_机器学习(1)--线性回归和多项式拟合
机器学习(1)--线性回归和多项式拟合 机器学习(2)逻辑回归 (数学推导及代码实现) 机器学习(3)softmax实现Fashion-MNIST分类 一 线性回归 线性回归,顾名思义是利用线性模型对 ...
- 机器学习——多项式拟合
文章目录 一.多项式拟合 1.1 多项式函数拟合 1.2 过拟合与正则化 1.3 维数灾难 二.基于概率的曲线拟合 2.1 高斯分布 2.2 重新理解曲线拟合 最大似然 最大化后验概率(maximum ...
- 【机器学习实验】用Python进行机器学习实验
概要 本文是用Python编程语言来进行机器学习小实验的第一篇.主要内容如下: 读入数据并清洗数据 探索理解输入数据的特点 分析如何为学习算法呈现数据 选择正确的模型和学习算法 评估程序表现的准确性 ...
- 余弦多项式拟合_正交多项式简介及其应用
天空一片蔚蓝, 清风添上了浪漫 心里那份柔情蜜意, 似海无限 ---<最爱>李克勤 1 正交多项式的定义 1.1 正交多项式定义 定义:一个多项式序列 ,其阶数为 ,对于每一个 ,这个多项 ...
- NASA科学家联名求撤稿:金星有生命迹象是大乌龙,12阶多项式拟合不靠谱
萧箫 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 还记得9月14号那篇"金星上有生命"的Nature子刊论文吗? 天文学家在金星"大气层"中观测 ...
- mysql 多项式_多项式拟合和最小二乘问题
背景知识 The method of least squares is a standard approach in regression analysis to the approximate so ...
- 使用tensorflow实现机器学习中的线性拟合
使用tensorflow实现机器学习中的线性拟合 这个例子是模拟的单变量线性回归,通过提高单变量的阶数来增加特征数量,例如:4阶相当于分解为四个特征 这种思想同样适用于多变量线性回归 import t ...
- 多项式拟合缺点_拟合多项式的最小二乘法
T 20.5 32.7 51.0 73.0 95.7 R 765 826 873 942 1032 多项式拟合: 已知变量 x , y 之间的函数关系为: n n-1 1 2 n n+1 y=a x ...
- 多项式拟合缺点_多项式拟合
在网上看别人的心得 一 最小二乘法的基本原理 从整体上考虑近似函数同所给数据点(i=0,1,-,m)误差(i=0,1,-,m)的大小,常用的方法有以下三种:一是误差(i=0,1,-,m)绝对值的最 ...
最新文章
- 理解VMware Team中的虚拟网络
- mysql data目录 说明_mysql 更改数据目录
- java中从str1中删除所有str2_Java中str1.equals(str2)和str1==str2的区别
- JS(本身是)单线程和UI线程同步(互斥)
- exsist什么意思_exists是什么意思_exists的翻译_音标_读音_用法_例句_爱词霸在线词典...
- 电子游戏跟计算机有什么关联,电脑和电子游戏对小学生的影响
- android switch自定义样式,Android自定义Switch样式
- mysql sql长度限制_SQL限制– MySQL限制
- 17.卷1(套接字联网API)--- ioctl 操作
- 是什么意思网络语_互联网推广是什么意思?新手网络推广怎么干?
- 【Kotlin -- 知识点】学习资料
- python|文本文件的处理
- 微博上一些有用的话(六)
- Linux系统程序包管理工具-RPM
- 根据出生日期获取农历信息
- Vector-常用CAN工具(软件篇)-CANoe Trace
- k8s-滚动更新与健康检查
- 在冰山一角之下:情绪分析研究的当前挑战和新方向。
- 数据库SQL去重,保留一条数据
- html css修改span的字体的值,一、编辑网页文本(span标签与字体属性、文本属性)...
热门文章
- 关于模拟电子技术、考试的讲解:序章
- 【大数据】城市公交网络分析与可视化(三):获取公交站点信息并可视化站点重要程度
- 微信小程序用户数据的签名校验和加解密 - 后端nodejs
- ESP32 SNTP配置
- 职业高中计算机应用基础说课模板,职业教育:计算机应用基础类一等奖作品:《青春形象设计》说课课件.ppt...
- 磁盘碎片整理在哪?Win7磁盘碎片整理图解
- Cocos2d-x教程(16)-自定义动作 圆周运动
- 【JAVA程序设计】(C00089)基于SSM(非maven)的仓库出入库管理系统
- 【仙剑五前传】中的一点场景渲染问题
- 手机连接电脑可以看到便签吗,电脑和手机同步的便签怎么找到
- java 多项式拟合最多的项数_机器学习(1)--线性回归和多项式拟合