当假设空间含有不同复杂度(例如,不同的参数个数)的模型时,就要面临模型选择(model selection)的问题.我们希望选择或学习一个合适的模型.如果在假设空间中存在“真”模型,那么所选择的模型应该逼近真模型.具体地,所选择的模型要与真模型的参数个数相同,所选择的模型的参数向量与真模型的参数向量相近.
如果一味追求提高对训练数据的预测能力,所选模型的复杂度则往往会比真模型更高.这种现象称为过拟合(over- fiting).过拟合是指学习时选择的模型所包含的参数过多,以致于出现这一模型对已知数据预测得很好,但对未知数据预测得很差的现象,可以说模型选择旨在避免过拟合并提高模型的预测能力.
用最小二乘法拟合曲线
我们用目标函数𝑦=𝑠𝑖𝑛2𝜋𝑥, 加上一个正态分布的噪音干扰,用多项式去拟合【例1.1 11页】
import numpy as np
import scipy as sp
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
%matplotlib inline
# 十个点
x = np.linspace(0, 1, 10)
x_points = np.linspace(0, 1, 1000)
# 加上正态分布噪音的目标函数的值
y_ = real_func(x)
y = [np.random.normal(0, 0.1) + y1 for y1 in y_]
#numpy.random.normal(loc=0.0, scale=1.0, size=None)
#loc:float 概率分布的均值,对应着整个分布的中心center
# scale:float 概率分布的标准差,对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高
def fitting(M=0):
"""
M 为 多项式的次数
"""
# 随机初始化多项式参数
p_init = np.random.rand(M + 1)
# 最小二乘法
p_lsq = leastsq(residuals_func, p_init, args=(x, y))
print('Fitting Parameters:', p_lsq[0])
# 可视化
plt.plot(x_points, real_func(x_points), label='real')
plt.plot(x_points, fit_func(p_lsq[0], x_points), label='fitted curve')
plt.plot(x, y, 'bo', label='noise')
plt.legend()
return p_lsq
# M=0
p_lsq_0 = fitting(M=0)
# M=1
p_lsq_1 = fitting(M=1)
# M=3
p_lsq_3 = fitting(M=3)
# M=9
p_lsq_9 = fitting(M=9)
当M=9时,多项式曲线通过了每个数据点,但是造成了过拟合。M=3是最好的选择。
代码来自链接
https://github.com/wzyonggege/statistical-learning-method/blob/master/LeastSquaresMethod/least_sqaure_method.ipynb