第一章 统计学习方法概论--最小二乘法

参考资料:

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))=(Yf(X))2
(3)绝对损失函数(absolute loss function): L ( Y , f ( x ) ) = ∣ Y − f ( X ) ) ∣ L(Y,f(x))=|Y-f(X))| L(Y,f(x))=Yf(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(YX))=logp(YX)

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=1N[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=1NL(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 mini=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=1n(h(xi)yi)2+λw2

回归问题中,损失函数是平方损失,正则化可以是参数向量的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()

正则化图片

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值