参考资料:
1.李航《统计学习方法》
2.github: https://github.com/fengdu78/lihang-code
1.统计学习的主要特点是:
(1)以数据为研究对象,是数据驱动的学科;(2)学习目的是:对数据进行预测和分析
统计学习包括:监督学习、非监督学习、半监督学习及强化学习
2.监督学习的任务是学习一个模型,使得模型能够对任意给定的输入,对其相应的输出作出一个好的预测
在监督学习过程中将输入与输出看做定义在输入(特征)空间与输出空间上的随机变量的取值
输入实例
x
x
x的特征向量记作
x
=
(
x
1
,
x
2
,
.
.
.
x
i
,
.
.
.
,
x
n
)
T
x=(x^{1},x^{2},...x^{i},...,x^{n})^{T}
x=(x1,x2,...xi,...,xn)T
x
i
x^{i}
xi表示
x
x
x的第
i
i
i个特征,
x
i
x^{i}
xi与
x
i
x_{i}
xi不同,
x
i
x_{i}
xi常用于表示多个输入变量中的第
i
i
i个,即:
x
i
=
(
x
i
1
,
x
i
2
,
.
.
.
x
i
i
,
.
.
.
,
x
i
n
)
T
x_{i}=(x^{1}_{i},x^{2}_{i},...x^{i}_{i},...,x^{n}_{i})^{T}
xi=(xi1,xi2,...xii,...,xin)T
3.统计学习常用的损失函数:
(1)0-1损失函数(0-1 loss function):
f
(
x
)
=
{
0
,
Y
̸
=
f
(
X
)
1
,
Y
=
f
(
X
)
f(x)= \begin{cases} 0&, Y\not=f(X)\\ 1&, Y=f(X) \end{cases}
f(x)={01,Y̸=f(X),Y=f(X)
(2)平方损失函数(quadratic loss function):
L
(
Y
,
f
(
x
)
)
=
(
Y
−
f
(
X
)
)
2
L(Y,f(x))=(Y-f(X))^{2}
L(Y,f(x))=(Y−f(X))2
(3)绝对损失函数(absolute loss function):
L
(
Y
,
f
(
x
)
)
=
∣
Y
−
f
(
X
)
)
∣
L(Y,f(x))=|Y-f(X))|
L(Y,f(x))=∣Y−f(X))∣
(4)对数损失函数(logarithmic loss function):
L
(
Y
,
P
(
Y
∣
X
)
)
=
−
l
o
g
p
(
Y
∣
X
)
L(Y,P(Y|X))=-logp(Y|X)
L(Y,P(Y∣X))=−logp(Y∣X)
4.经验风险与结构风险
风险函数或者期望损失(expected loss):
R
e
x
p
(
f
)
=
E
p
[
L
(
Y
,
f
(
X
)
)
]
=
∫
X
,
Y
L
(
y
,
f
(
x
)
)
P
(
x
,
y
)
 
d
x
d
y
R_{exp}(f)=E_{p}[L(Y,f(X))]=\int_{X,Y} L(y,f(x))P(x,y)\, dxdy
Rexp(f)=Ep[L(Y,f(X))]=∫X,YL(y,f(x))P(x,y)dxdy
经验风险(empirical risk):
R
e
m
p
(
f
)
=
1
N
∑
i
=
1
N
[
L
(
Y
,
f
(
X
)
)
]
R_{emp}(f)=\frac1N\sum_{i=1}^{N}[L(Y,f(X))]
Remp(f)=N1i=1∑N[L(Y,f(X))]
结构风险最小化(structural risk minimization): R s r m f ) = 1 N ∑ i = 1 N L ( y i , f ( x i ) ) + λ J ( f ) R_{srm}f)=\frac1N\sum_{i=1}^{N}L(y_{i},f(x_{i}))+\lambda J(f) Rsrmf)=N1i=1∑NL(yi,f(xi))+λJ(f)
5.最小二乘法
高斯于1823年在误差$e_{1} ,… , e_{n}}独立同分布的假定下,证明了最小二乘方法的一个最优性质:
在所有无偏的线性估计类中,最小二乘方法是其中方差最小的!
使用最小二乘法拟和曲线
对于数据 ( 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
此时L2范数(残差平方和)最小时, h ( x ) h(x) h(x) 和 y y y 相似度最高,更拟合
一般的
H
(
x
)
H(x)
H(x)为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
举例:
我们用目标函数 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
定义实际函数,拟合函数,以及残差计算
def real_func(x):
y = np.sin(2*np.pi*x)
return y
def fit_func(p, x):
# numpy.poly1d([1,2,3]) 生成 x^2+2x^1+3x^0
f = np.poly1d(p)
return f(x)
def residuals_func(p, x, y):
res = fit_func(p, x) - y
return res
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
plsq_0 = fitting(M=0)
plsq_0 = fitting(M=3)
正则化
对于过拟合现象, 引入正则化项(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=1∑n(h(xi)−yi)2+λ∣∣w∣∣2
回归问题中,损失函数是平方损失,正则化可以是参数向量的L2范数,也可以是L1范数。
regularization = 0.0001
def regularization_func(p, x, y):
res = fit_func(p, x) - y
res = np.append(res, np.sqrt(0.5*regularization*np.square(p))) # L2范数作为正则化项
return res
p_init = np.random.rand(9+1)
p_lsq1 = fitting(M=7)
p_lsq2 = leastsq(regularization_func, p_init, args=(x, y))
plt.plot(x_points, real_func(x_points), label='real')
plt.plot(x_points, fit_func(p_lsq1[0], x_points), label='fitted curve')
plt.plot(x_points, fit_func(p_lsq2[0], x_points), label='regularization curve')
plt.plot(x, y, 'bo', label='noise')
plt.legend()