参考文献:李航.统计学习方法[M].北京:清华大学出版社,2018.
该部分笔记全部总结自这本书。
supervised learning:给定输入,预测输出。
输入空间可以是有限的,可以是整个欧氏空间,也可以在同一个空间,也可以不同空间‘通常输出空间远小于输入空间。
特征向量:所有特征向量存在的空间为特征空间。每一维对应一个特征。
模型实际上都是定义在特征空间的。
默认提到的向量均为列向量。
输入实例x的特征向量记作:
x = ( x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . , x ( n ) ) T x=(x^{(1)},x^{(2)},x^{(3)},...,x^{(n)})^{T} x=(x(1),x(2),x(3),...,x(n))T
x i x^{i} xi表示x的第i个特征。注意 x i x^{i} xi与 x i x_i xi不同, x i x_i xi表示多个输入变量中的第i个,即:
x i = ( x i ( 1 ) , x i ( 2 ) , x i ( 3 ) , . . . , x i ( n ) ) x_i=(x^{(1)}_i,x^{(2)}_i,x^{(3)}_i,...,x^{(n)}_i) xi=(xi(1),xi(2),xi(3),...,xi(n))
样本点( x i x_i xi, y i y_i yi),组成样本空间T。
对于学习系统来说,联合概率分布的具体定义是未知的。训练集与测试集被看作是依据联合分布P(X,Y)独立同分布产生的。
模型属于由输入空间到输出空间的映射的集合,这个集合就是假设空间(hypothesis space)。
之前总结过:点击这里!指标大全!传送门
方法=模型+策略+算法
这块主要就是损失函数和风险函数。
经验风险最小化和结构风险最小化。
当损失函数给定时,基于损失函数的模型的训练误差和模型的测试误差就成为了学习方法评估的准则。
常用的两个模型选择方法:正则化、交叉验证
在回归问题中:
L2范数的平方损失函数: L ( ω ) = 1 N ∑ i = 1 N ( f ( x i ; ω ) − y i ) 2 + λ 2 ∣ ∣ ω ∣ ∣ 2 L(\omega)=\frac1N \sum_{i=1}^{N}(f(x_i;\omega)-y_i)^2 + \frac{\lambda}{2} ||\omega||^2 L(ω)=N1i=1∑N(f(xi;ω)−yi)2+2λ∣∣ω∣∣2
L1范数: L ( ω ) = 1 N ∑ i = 1 N ( f ( x i ; ω ) − y i ) 2 + λ ∣ ∣ ω ∣ ∣ 1 L(\omega)=\frac1N \sum_{i=1}^{N}(f(x_i;\omega)-y_i)^2 + {\lambda} ||\omega||_1 L(ω)=N1i=1∑N(f(xi;ω)−yi)2+λ∣∣ω∣∣1
正则化符合奥卡姆剃刀原理:从所有可能选择的模型里面选择解释性很好的并且十分简单的模型。
从贝叶斯估计的角度看,正则化项对应于模型的先验概率。可以假设复杂的模型有较小的先验概率,简单的模型有较大的先验概率。
对于一个二分类问题,假设空间是有限个函数的集合 ϝ = { f 1 , f 2 , f 3 , . . . , f d } \digamma={\{f_1,f_2,f_3,...,f_d\} } ϝ={f1,f2,f3,...,fd}时,对于任意一个函数,至少以概率 1 − δ 1-\delta 1−δ,以下不等式成立:
R ( f ) = R ^ ( f ) + ε ( d , N , δ ) R(f)=\widehat R(f) + \varepsilon (d,N,\delta) R(f)=R (f)+ε(d,N,δ)
其中: ε ( d , N , δ ) = 1 2 N ( log d + log 1 δ ) \varepsilon(d,N,\delta)=\sqrt{\frac1{2N}(\log d + \log {\frac1{\delta}})} ε(d,N,δ)=2N1(logd+logδ1)
这里要用到Hoeffding 不等式:
设 S n = ∑ i = 1 n X i S_n=\sum_{i=1}^n X_i Sn=∑i=1nXi是独立随机变量 X 1 , X 2 , X 3 , . . . , X n X_1,X_2,X_3,...,X_n X1,X2,X3,...,Xn之和, X i ∈ [ a i , b i ] X_i \in [a_i,b_i] Xi∈[ai,bi],则对任意t>0,以下不等式成立:
P ( E S n − S n ≥ t ) ≤ e x p ( − 2 t 2 ∑ i = 1 n ( b i − a i ) 2 ) P(ES_n-S_n \geq t) \leq exp(\frac{-2t^2}{\sum_{i=1}^n (b_i-a_i)^2}) P(ESn−Sn≥t)≤exp(∑i=1n(bi−ai)2−2t2)
对任意函数 f ∈ ϝ f \in \digamma f∈ϝ, R ^ ( f ) \widehat R(f) R (f) 是N个独立的随机变量L(Y,f(X))的样本均值,R(f)是随机变量L(Y,f(x))的期望值。如果损失函数取值于区间[0,1],即对所有i, [ a i , b i ] = [ 0 , 1 ] [a_i,b_i]=[0,1] [ai,bi]=[0,1] ,那么,对于 ε > 0 \varepsilon > 0 ε>0,以下不等式成立:
P ( R ( f ) − R ^ ( f ) ≥ ε ) ≤ e x p ( − 2 N ε 2 ) P(R(f)-\widehat R(f) \geq \varepsilon) \leq exp(-2N \varepsilon ^2) P(R(f)−R (f)≥ε)≤exp(−2Nε2)
监督学习=生成模型:
P ( Y ∣ X ) = P ( X , Y ) P ( X ) P(Y|X)=\frac{P(X,Y)}{P(X)} P(Y∣X)=P(X)P(X,Y)
生成模型:模型表示给定输入X产生输出Y的生成关系,典型的是朴素贝叶斯法和隐马尔可夫模型。
判别模型:由数据直接学习决策函数f(X)或者条件概率分布P(Y|X)作为预测模型。典型的是:K近邻、感知机、决策树、logistic、支持向量机、提升树、条件随机场。
生成方法可以还原联合概率分布P(X,Y),而判别方式则不能;生成模型的学习收敛速度快。
TN,TP,FN,FP
这篇文章总结的特别详细:评价指标大全!点这里,传送门!
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=None, factor=100, diag=None)
这里会使用到的参数只有前三个:
这里目标拟合一个$y= \cos 2 \pi x$
,然后加上一个正太分布的噪声干扰,用多项式去拟合,并绘图
import numpy as np
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
## 定义函数
def func(x):
return np.cos(2*np.pi*x)
## 生成一个多项式
def polynomial(p,x):
f = np.polyld(p)
return f(x)
## 残差
def residuals(p,x,y):
return polynomial(p,x)-y ## 实际参数在这里设置好了
#20个点
x = np.linspace(0,1,20)
## 加上正态分布的噪声
y=func(x)
yi= [np.random.normal(0,0.1) + y1 for y1 in y]
def fitting(p):
para=np.random.rand(p+1) # 随便设置一组默认参数
r=leastsq(residuals,para,args=(x,yi))
print('fitting parameters:',r[0]) # 第一个是参数
# 可视化
a=np.linspace(0,1,1000)
plt.plot(a,func(a),label='real')
plt.plot(a,polynomial(r[0],a),label='fitted')
plt.plot(x,yi,'bo',label='noise')
plt.legend()
return r
用常数拟合
r_0=fitting(0)
用三阶、四阶、十九阶去拟合
这个绘图方法在matplotlib.plot总结过了,传送门这里,点击!
p1=plt.figure(figsize=(15,7),dpi=111)
pic1=p1.add_subplot(1,3,1) #一行三列的第一幅图
r_3=fitting(3)
pic2=p1.add_subplot(1,3,2)
r_4=fitting(4)
pic3=p1.add_subplot(1,3,3)
r_20=fitting(19)
这里引入L2范数,也就是岭回归。假设lambda=0.0001
def regularization(p,x,y):
reg= polynomial(p,x)-yi
reg=np.append(reg,np.sqrt(0.5*0.0001*np.square(p)))
return reg
def fitting1(p=19):
para=np.random.rand(p+1) # 随便设置一组默认参数
r_19=leastsq(regularization,para,args=(x,yi))
print('fitting parameters:',r_19[0]) # 第一个是参数
# 可视化
a=np.linspace(0,1,1000)
plt.plot(a,func(a),label='real')
plt.plot(a,polynomial(r_19[0],a),label='fitted')
plt.plot(x,yi,'bo',label='noise')
plt.legend()
return r_19
fitting1()