本博客是说明最小二乘拟合,在李航博士的《统计学习方法》中,在第11页的例1.1作为示例进行了演示。但是,文中所给出的答案明显是错误的。因此,在这里,我们试图给出正确的解法,以及利用Python语言来进行实验验证。
一、问题定义
给定一个数据训练集:
T={(x 1 ,y 2 ),(x 2 ,y 2 ),⋯,(x N ,y N )}
其中,
x i ∈R
是输入
x
的观测值,
y i ∈R
是输入
y
的观测值,
i=1,2,⋯,N
。多项式函数拟合的任务是假设给定数据由
M
次多项式函数生成,选择出最有可能产生这些数据的
设
M
次多项式为
其中, x 是单变量输入,
目标函数
二、求解过程
将
(x i ,y i )
看做已知值,为了求得
L(x,w)
的最小值,对每一个
w j
求偏导,即:
这里需要注意的是,左式
x j i ∗∑ M j=0 w j x j i
并不能直接计算为
∑ M j=0 w j x 2j i
,因为前面的
j
和后面的
则,该矩阵可以转换为
按照求极值的步骤,先求偏导,令其为0,解出 w 。即,对每个 w j 求偏导,令其为0,总共得到 M 个 M 元线性方程,求解该方程,得出 w 。
三、实验
下面就是利用python来做实验了。
实验代码
import random
import matplotlib.pyplot as plt
import numpy as np
#get 10 randomized points
x = range(10)
y = np.zeros(10)
for w in range(10) :
y[w] = random.randint(5,10)
z = np.zeros(5)
#first get Y(10)
for i in range(5):
for j in range(10):
z[i] = z[i] + y[j]*x[j]**(i)
matrix = np.zeros((5,5))
for i in range(5):
for j in range(5):
for k in range(10):
matrix[i][j] = matrix[i][j] + x[k]**(i+j)
out = np.linalg.solve(matrix,z)
output = np.zeros(10)
for i in range(10):
for j in range(5):
output[i] = output[i] + out[j]*x[i]**(j)
#display the points and curve
plt.plot(range(10),y,'bo',range(10),output,'r-')
plt.legend()
plt.show()
在上面的代码中,我们随机生成10个点,然后生成 M=4 的多项式。
实验结果
Talking is cheap, show me the code. YOU KNOW!!!
吴小同
2016-5-16
2016-5-17