第1章 统计学习方法概论
使用最小二乘法拟和曲线
高斯于1823年在误差e1,…,en独立同分布的假定下,证明了最小二乘方法的一个最优性质: 在所有无偏的线性估计类中,最小二乘方法是其中方差最小的。
对于数据(xi,yi)(i=1,2,3...,m)
拟合出函数h(x)
有误差,即残差:ri=h(xi)−yi
此时L2范数(残差平方和)最小时,h(x) 和 y 相似度最高,更拟合
一般的H(x)为n次的多项式:
H(x)=w0+w1x+w2x2+...wnxn
w(w0,w1,w2,...,wn)为参数
最小二乘法就是要找到一组 w(w0,w1,w2,...,wn) ,使得∑i=1n(h(xi)−yi)2 (残差平方和) 最小
即,求
mini=1∑n(h(xi)−yi)2
举例:用目标函数y=sin2πx, 加上一个正态分布的噪音干扰,用多项式去拟合
import numpy as np import scipy as sp from scipy.optimize import leastsq import matplotlib.pyplot as plt %matplotlib inline
|
- ps:
numpy.poly1d([1,2,3])
生成 1x2+2x1+3x0*
def real_func(x): return np.sin(2*np.pi*x)
def fit_func(p, x): f = np.poly1d(p) return f(x)
def residuals_func(p, x, y): ret = fit_func(p, x) - y return ret
|
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_]
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
Output[ ]
Fitting Parameters: [0.02515259]
M=1
Output[ ]
Fitting Parameters: [-1.50626624 0.77828571]
M=3
Output[ ]
Fitting Parameters: [ 2.21147559e+01 -3.34560175e+01 1.13639167e+01 -2.82318048e-02]
M=9
Output[ ]
Fitting Parameters: [-1.70872086e+04 7.01364939e+04 -1.18382087e+05 1.06032494e+05
-5.43222991e+04 1.60701108e+04 -2.65984526e+03 2.12318870e+02
-7.15931412e-02 3.53804263e-02]
当M=9时,多项式曲线通过了每个数据点,但是造成了过拟合
正则化
结果显示过拟合, 引入正则化项(regularizer)
,降低过拟合
Q(x)=i=1∑n(h(xi)−yi)2+λ∣∣w∣∣2
回归问题中,损失函数是平方损失,正则化可以是参数向量的L2
范数,也可以是L1
范数。
regularization = 0.0001
def residuals_func_regularization(p, x, y): ret = fit_func(p, x) - y ret = np.append(ret, np.sqrt(0.5 * regularization * np.square(p))) return ret
|
p_init = np.random.rand(9 + 1) p_lsq_regularization = leastsq( residuals_func_regularization, p_init, args=(x, y))
|
plt.plot(x_points, real_func(x_points), label='real') plt.plot(x_points, fit_func(p_lsq_9[0], x_points), label='fitted curve') plt.plot( x_points, fit_func(p_lsq_regularization[0], x_points), label='regularization') plt.plot(x, y, 'bo', label='noise') plt.legend()
|
Output[ ]
<matplotlib.legend.Legend at 0x295a5c757b8>
第1章统计学习方法概论-习题
习题1.1
说明伯努利模型的极大似然估计以及贝叶斯估计中的统计学习方法三要素。伯努利模型是定义在取值为0与1的随机变量上的概率分布。假设观测到伯努利模型n次独立的数据生成结果,其中k次的结果为1,这时可以用极大似然估计或贝叶斯估计来估计结果为1的概率。
解答:
伯努利模型的极大似然估计以及贝叶斯估计中的统计学习方法三要素如下:
- 极大似然估计
模型: F={f∣fp(x)=px(1−p)(1−x)}
策略: 最大化似然函数
算法: argminpL(p)=argminp(kn)pk(1−p)(n−k)
- 贝叶斯估计
模型: F={f∣fp(x)=px(1−p)(1−x)}
策略: 求参数期望
算法:
Eπ[p∣∣∣y1,⋯,yn]=∫01pπ(p∣y1,⋯,yn)dp=∫01p∫ΩfD(y1,⋯,yn∣p)π(p)dpfD(y1,⋯,yn∣p)π(p)dp=∫01∫01pk(1−p)(n−k)dppk+1(1−p)(n−k)dp
伯努利模型的极大似然估计:
定义P(Y=1)概率为p,可得似然函数为:
L(p)=fD(y1,y2,⋯,yn∣θ)=(kn)pk(1−p)(n−k)
方程两边同时对p求导,则:
0=(kn)[kpk−1(1−p)(n−k)−(n−k)pk(1−p)(n−k−1)]=(kn)[p(k−1)(1−p)(n−k−1)(m−kp)]
可解出p的值为
p=0,p=1,p=k/n
显然
P(Y=1)=p=nk
伯努利模型的贝叶斯估计:
定义P(Y=1)概率为p,p在[0,1]之间的取值是等概率的,因此先验概率密度函数π(p)=1,可得似然函数为:
L(p)=fD(y1,y2,⋯,yn∣θ)=(kn)pk(1−p)(n−k)
根据似然函数和先验概率密度函数,可以求解p的条件概率密度函数:
π(p∣y1,⋯,yn)=∫ΩfD(y1,⋯,yn∣p)π(p)dpfD(y1,⋯,yn∣p)π(p)=∫01pk(1−p)(n−k)dppk(1−p)(n−k)=B(k+1,n−k+1)pk(1−p)(n−k)
所以p的期望为:
Eπ[p∣y1,⋯,yn]=∫pπ(p∣y1,⋯,yn)dp=∫01B(k+1,n−k+1)p(k+1)(1−p)(n−k)dp=B(k+1,n−k+1)B(k+2,n−k+1)=n+2k+1
∴P(Y=1)=n+2k+1
习题1.2
通过经验风险最小化推导极大似然估计。证明模型是条件概率分布,当损失函数是对数损失函数时,经验风险最小化等价于极大似然估计。
解答:
假设模型的条件概率分布是Pθ(Y∣X),现推导当损失函数是对数损失函数时,极大似然估计等价于经验风险最小化。
极大似然估计的似然函数为:
L(θ)=D∏Pθ(Y∣X)
两边取对数:
lnL(θ)=D∑lnPθ(Y∣X)argmaxθD∑lnPθ(Y∣X)=argminθD∑(−lnPθ(Y∣X))
反之,经验风险最小化等价于极大似然估计,亦可通过经验风险最小化推导极大似然估计。