统计学习方法概论
1.统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行分析与预测的一门学科。统计学习包括监督学习、非监督学习、半监督学习和强化学习。
2.统计学习方法三要素——模型、策略、算法,对理解统计学习方法起到提纲挈领的作用。
3.本书主要讨论监督学习,监督学习可以概括如下:从给定有限的训练数据出发, 假设数据是独立同分布的,而且假设模型属于某个假设空间,应用某一评价准则,从假设空间中选取一个最优的模型,使它对已给训练数据及未知测试数据在给定评价标准意义下有最准确的预测。
4.统计学习中,进行模型选择或者说提高学习的泛化能力是一个重要问题。如果只考虑减少训练误差,就可能产生过拟合现象。模型选择的方法有正则化与交叉验证。学习方法泛化能力的分析是统计学习理论研究的重要课题。
5.分类问题、标注问题和回归问题都是监督学习的重要问题。本书中介绍的统计学习方法包括感知机、kk近邻法、朴素贝叶斯法、决策树、逻辑斯谛回归与最大熵模型、支持向量机、提升方法、EM算法、隐马尔可夫模型和条件随机场。这些方法是主要的分类、标注以及回归方法。它们又可以归类为生成方法与判别方法。
使用最小二乘法拟合曲线
高斯于1823年在误差e1,…,ene1,…,en
独立同分布的假定下,证明了最小二乘方法的一个最优性质: 在所有无偏的线性估计类中,最小二乘方法是其中方差最小的! 对于数据(xi,yi)(i=1,2,3…,m)(xi,yi)(i=1,2,3…,m)
拟合出函数h(x)有误差,即残差:ri=h(xi)−yi
此时L2
范数(残差平方和)最小时,h(x) 和 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
)
2
min\sum_{i=1}^n(h(x_i)-y_i)^2
min∑i=1n(h(xi)−yi)2----一般的H(x)H(x)为n次的多项式,H(x)=w0+w1x+w2x2+…wnxn
w(w0,w1,w2,…,wn)为参数最小二乘法就是要找到一组 w(w0,w1,w2,…,wn)
,我们的损失函数最小。
举例实操
我们用目标函数y = sin2Πx,加上一个正态分布的噪声干扰,用多项式去拟合。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
import scipy as sp
首先我们引入一些必需的库帮助我进行运算,numpy,matplotlib大家都很熟悉了。下面我简单说一下leastsq这个库。这个库的作业是找出最小值,它会找出使某一个式子取得最小值时的参数,这正好满足我们在使损失函数最小时求w的需求。
def real_func(x):
return np.sin(2 * np.pi * x)
def fit_func(x,p):
f = np.ploy1d(p)
return f(x)
def residuals_func(p,x,y):
#求残差:我们用拟合的函数减去真实的y值
ret = fit_func(x,p) - y
return ret
这里我们声明三个函数:
1.real_func:是我们的真实函数,也就是y=2sinΠx
2.fit_func:是我们自己的拟合函数,我们的目的就是求出一个拟合函数使残差最小。这里我们说明一下np.poly1d§这个函数:
np.ploy1d([1,2,3]) = 1 * x^2 + 2 * x + 3,即我们将poly1d函数中传入的数组参数作为我们多项式的参数来拟合一个条曲线,我们的目标就是求出最小的这个数组,即poly1d中的参数p。
3.residuals_func:这个函数只是简单的残差函数,计算预测与真实之间的差,我们要让其最小
x = np.linspace(0,1,10)
x_points = np.linspace(0,1,1000)
y_ = real_func(x)
#在y值上在一些正态分布的噪声得到目标函数的y值
y = [np.random.normal(0,0.1) + y1 for y1 in y_]
def fitting(M = 0):
#M为多项式的次数
#随机产生参数p,参数的个数比次数多1
p_init = np.random.rand(M + 1)
#最小二乘法
#我们初始化了p_init作为我们的初始参数
#然后我们用之前讲解过的leastsq去选出最小的参数,使得residuals_func残差最小,这中间需要的参数是x,y
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=9的情况,看一下我们拟合的曲线
p_lsq_9 = fitting(9)
这里我们做的主要工作就是写出我们的拟合函数fitting,它的参数是M,是我们预测的拟合函数的次数,然后我们算出让残差最小的拟合函数系数数组即可。
正则化
结果显示过拟合, 引入正则化项(regularizer),降低过拟合
Q(x)=∑ni=1(h(xi)−yi)2+λ||w||^2
回归问题中,损失函数是平方损失,正则化可以是参数向量的L2范数,也可以是L1范数。
L1: regularization*abs()
L2: 0.5 * regularization * np.square()
首先我们现在我们的残差中加入我们的正则项
regularization = 0.0001
def residuals_func_regularization(p,x):
ret = fit_func(p,x) - y
ret = np.append(ret,np.sqrt(0.5 * regularization * np.square(p)))#L2范数项
return ret
这里我们在已经算出的残差数组中加入了正则化项,这会使得在我们找让ret最小的参数值时,会考虑到加入的这些正则化项,就会让我们忽略掉一些更精密的数值,因为正则化项本身就很小,因此可以有效地防止过拟合。
#这里我们以9次多项式为例进行说明:
p_init = np.random.rand(9 + 1)
p_lst_re = leastsq(residuals_func_regularization,p_init,args = (x,y))
return p_lst_re[0]
上面的代码是用来计算包含正则项的残差,使其最小时的参数。
这里有一点需要说明的是,如果大家在pycharm环境下运行我们的代码,可以查看一下leastsq的详细说明,尤其是它的返回值.我们会发现它会返回很多数值,具体是什么大家可以查阅一下官方文档,我自己也不是很清楚,但是最重要的就是一个返回值,也就是参数。所以我们每次都取p_lst_re[0]
#可视化
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()