目标
掌握最小二乘法求解(无惩罚项的损失函数)、掌握加惩罚项(2范数)的损失函数优化、梯度下降法、共轭梯度法、理解过拟合、克服过拟合的方法(如加惩罚项、增加样本)。
要求
-
生成数据,加入噪声;
-
用高阶多项式函数拟合曲线;
-
用解析解求解两种loss的最优解(无正则项和有正则项);
-
优化方法求解最优解(梯度下降,共轭梯度);
-
用你得到的实验数据,解释过拟合。
-
用不同数据量,不同超参数,不同的多项式阶数,比较实验效果。
-
语言不限,可以用matlab,python。求解解析解时可以利用现成的矩阵求逆。梯度下降,共轭梯度要求自己求梯度,迭代优化自己写。不许用现成的平台,例如pytorch,tensorflow的自动微分工具。
实验环境
Windows 10
PyCharm 2020.3
Python 3.7.0
实验步骤
1. 生成实验数据
运用随机数生成器,生成一组满足在 [0, 1] 区间上均匀分布的(x, y)数据,其中
y = sin ( 2 π x ) + e y = \sin(2\pi x) + e y=sin(2πx)+e
而e即为为满足 (0, 0.01) 正态分布的一个噪声。
def generate_sin2pi_sample(number):
x = np.linspace(0, 1, number).T
y = np.sin(2 * np.pi * x) + np.random.normal(0, 0.1, number).T
return x, y
接下来将利用这组数据进行训练。
接下来为了便于矩阵计算,将会用到x的Vandermende矩阵X。
Vandermende矩阵的计算代码如下:
def vandermonde(x, order):
van = np.zeros(shape=(order + 1, x.size))
van[0] = 1
for i in range(order):
van[i + 1] = van[i] * x.T
return van
2. 利用解析解拟合正弦曲线
先通过最简单的思路解决问题。
当我们想要拟合一条曲线时,通常我们得到的只有几个离散的数据样本 (x, y),并且与实际的曲线之间还有一些误差。我们对于目标函数的了解仅此而已。
在这种已知条件受限的情况下,我们首先需要假设一个大概的模型,比如本次实验我们采用了多项式函数 Y(x, w) 作为拟合的模型。在此之上,还需要对这种模型的一些待定参数进行调整,使得模型能够在给定样本以外的输入上,也能做到与目标函数尽可能贴近。这种贴近的标准可以用一个与待定参数以及输入样本相关的函数来标定,称为loss函数。
这里我们采用了以下公式作为loss函数:
E ( w ) = 1 2 ∑ i = 1 n ( Y ( w , x i ) − y ( x i ) ) 2 E(w)=\frac{1}{2} \sum_{i=1}^n{(Y(w,x_i)-y(x_i))^2} E(w)=21i=1∑n(Y(