第1章 统计学习方法概论
1.统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行分析与预测的一门学科。统计学习包括监督学习、非监督学习、半监督学习和强化学习。
2.统计学习方法三要素——模型、策略、算法,对理解统计学习方法起到提纲挈领的作用。
3.本书主要讨论监督学习,监督学习可以概括如下:从给定有限的训练数据出发, 假设数据是独立同分布的,而且假设模型属于某个假设空间,应用某一评价准则,从假设空间中选取一个最优的模型,使它对已给训练数据及未知测试数据在给定评价标准意义下有最准确的预测。
4.统计学习中,进行模型选择或者说提高学习的泛化能力是一个重要问题。如果只考虑减少训练误差,就可能产生过拟合现象。模型选择的方法有正则化与交叉验证。学习方法泛化能力的分析是统计学习理论研究的重要课题。
5.分类问题、标注问题和回归问题都是监督学习的重要问题。本书中介绍的统计学习方法包括感知机、 k k k近邻法、朴素贝叶斯法、决策树、逻辑斯谛回归与最大熵模型、支持向量机、提升方法、EM算法、隐马尔可夫模型和条件随机场。这些方法是主要的分类、标注以及回归方法。它们又可以归类为生成方法与判别方法。
使用最小二乘法拟合曲线
高斯于1823年在误差
e
1
,
.
.
.
,
e
n
e_1,...,e_n
e1,...,en独立同分布的假定下,证明了最小二乘方法的一个最优性质:在所以无偏大线性估计类中,最小二乘方法是其中方差最小的!
对于数据
(
x
i
,
y
i
)
(
i
=
1
,
2
,
3...
,
m
)
(x_i, y_i) (i=1,2,3...,m)
(xi,yi)(i=1,2,3...,m)
拟合出函数 h ( x ) h(x) h(x)
有误差,即残差: r i = h ( x i ) − y i r_i=h(x_i)-y_i ri=h(xi)−yi 其中: y i y_i yi为目标函数值
此时 L 2 L2 L2范数(残差平方和)最小时, h ( x ) h(x) h(x) 和 y y y 相似度最高,更拟合
一般的 H ( x ) H(x) H(x)为 n n n次的多项式, H ( x ) = w 0 + w 1 x + w 2 x 2 + . . . + w n x n H(x)=w_0+w_1x+w_2x^2+...+w_nx^n H(x)=w0+w1x+w2x2+...+wnxn
w ( w 0 , w 1 , w 2 , . . . , w n ) w(w_0,w_1,w_2,...,w_n) w(w0,w1,w2,...,wn)为参数
最小二乘法就是要找到一组
w
(
w
0
,
w
1
,
w
2
,
.
.
.
,
w
n
)
w(w_0,w_1,w_2,...,w_n)
w(w0,w1,w2,...,wn),使得
∑
i
=
1
n
(
h
(
x
i
)
−
y
i
)
2
\sum_{i=1}^n(h(x_i)-y_i)^2
∑i=1n(h(xi)−yi)2(残差平方和)最小
即,求 m i n ∑ i = 1 n ( h ( x i ) − y i ) min\sum_{i=1}^n(h(x_i)-y_i) min∑i=1n(h(xi)−yi)
举例:我们用目标函数 y = s i n 2 π x y=sin2{\pi}x y=sin2πx,加上一个正太分布的噪声干扰,用多项式去拟合 【例1.1. 11页】
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])生成 1 x 2 + 2 x 1 + 3 x 0 1x^2+2x^1+3x^0 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)
#残差
#residuals残差
def residuals_func(p, x, y):
ret = fit_func(p, x) - y
return ret
- 多项式
# 1+2+3
fit_func([1,2,3],1)
6
# 1*4+2*2+3*1
fit_func([1,2,3],2)
11
fit_func([1,2,3],[1,2])
array([ 6, 11])
- 残差
fit_func([1,2,3],[1,2]) - 1
array([ 5, 10])
- np.linspace():产生从start到stop的等差数列,num为元素个数,默认50个
# 十个点
np.linspace(0,1,10)
array([0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
# 1000个点
# np.linspace(0,1,1000)
- numpy.random.normal(loc=0,scale=1e-2,size=shape)
- 参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布,
- 参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。
- 参数size(int 或者整数元组):输出的值赋在shape里,默认为None。
# 正态分布噪声值
np.random.normal(0, 0.1)
0.02216023479515041
# 随机生成0-1点数
np.random.rand(2)
array([0.53310027, 0.84547664])
- leastsq(func, x0, args=(), Dfun=None, full_output=0, col_deriv=0, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=0.0, factor=100, diag=None, warning=True)
一般我们只要指定前三个参数就可以了:
func 是我们自己定义的一个计算误差的函数,
x0 是计算的初始参数值
args 是指定func的其他参数
# 10个点
x = np.linspace(0,1,10)
# points点数
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)
# 最小二乘法,得到一组w0...wn(p0...pn,w=p)
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-9看看
p_lsq_9 = fitting(9)
Fitting Parameters [ 1.39172552e+04 -6.04771677e+04 1.09109118e+05 -1.05733491e+05
5.94279163e+04 -1.94821142e+04 3.56325410e+03 -3.45811133e+02
2.09840404e+01 -1.50675261e-01]
正则化
结果显示过拟合, 引入正则化项(regularizer),降低过拟合
Q ( x ) = ∑ i = 1 n ( h ( x i ) − y i ) 2 + λ ∣ ∣ w ∣ ∣ 2 Q(x)=\sum_{i=1}^n(h(x_i)-y_i)^2+\lambda||w||^2 Q(x)=∑i=1n(h(xi)−yi)2+λ∣∣w∣∣2。
回归问题中,损失函数是平方损失,正则化可以是参数向量的L2范数,也可以是L1范数。
-
L1: regularization*abs§
-
L2: 0.5 * regularization * np.square§
np.sqrt(4)
2.0
# square正方形;四方形;正方形物;(通常为方形的)广场;平方;二次幂
np.square(2)
4
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))) # L2范数作为正则化项
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()
<matplotlib.legend.Legend at 0x7fc329203250>