机器学习【二】 最小二乘学习法

一、原理推导

回归问题(Regression)中

最小二乘学习法(Least Square)是对模型的输出$f\theta(\vec x_i)$和训练集输出${y_i}{i=1}^n$的平方误差

为最小时的参数$\theta$进行学习的方法。

因此也叫$l_2$损失最小化学习。

在求解最小值时,使用求微分令其为$0$的$\theta$值,因此在平方误差公式凑了一个$\frac{1}{2}$,将微分得到的$2$约去。

针对线性模型$f_\theta(\vec x)=\vec\theta^T\phi(\vec x)$,先给出结果:

推导过程:

根据$l_2$-Norm可得:

因此,

利用矩阵乘法,可将求导得到的$\phi_1(\vec x_1)$等提出来:

即得。

通过求解$\Phi^T\Phi\vec\theta-\Phi^T\vec y=0$即可得到通过最小二乘法学习的参数$\vec\theta$,但在大多数情况下,由于数据量远远大于参数数量,因此$\Phi$是一个奇异矩阵,并非方阵,我们不能通过简单的通过他的逆矩阵求出解,因此这里需要引入一个伪逆矩阵的新概念,用来解决此问题。

二、实践

学习了最小二乘法的原理之后,通过python程序来巩固一下。
本程序根据上面对线性模型的推导,基函数使用三角多项式形式,即:

而数据我们使用近似的$sinc(x) = \frac{\sin(\pi x)}{\pi x}$函数加上随机误差来生成得到。

程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

__author__ = 'shiheuan'

import numpy as np
import matplotlib.pyplot as plt


def LeastSquares():
N = 1000
n = 50 # len(x)
x = np.array([np.linspace(-3.,3.,n)])
# print(x)

X = np.array([np.linspace(-3.,3.,N)])
# 图像形态 + 随机误差
y = np.sin(np.pi*x)/(np.pi*x)+0.1*x+0.05*np.random.randn(1,n)

P = np.ones([31,N])
p = np.ones([31,n])

for i in range(15):
P[2*i+1,:] = np.sin((i+1)/2*X)
P[2*i+2,:] = np.cos((i+1)/2*X)
p[2*i+1,:] = np.sin((i+1)/2*x)
p[2*i+2,:] = np.cos((i+1)/2*x)

print(p)
p = p.T
print(p)
P = P.T
pp = np.linalg.pinv(p)
pp = np.dot(p.T, p)
# print(pp)
# pinv 与 inv 的区别
ppi = np.linalg.pinv(pp)
# print(ppi)
pp_ = np.dot(ppi, p.T)
# print(pp_)
t = np.dot(pp_, y.T)
# print(t)
# print(y)
F = np.dot(P, t).T

plt.plot(x[0,:],y[0,:],'.')
plt.plot(X[0,:],F[0,:])
plt.show()

LeastSquares()

执行结果:

最小二乘学习法运行结果图