最小二乘拟合

本博客是说明最小二乘拟合,在李航博士的《统计学习方法》中,在第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 次多项式函数。
M  次多项式为

f M (x,w)=w 0 +w 1 x 1 +w 2 x 2 ++w M x M = j=0 M w j x j  

其中, x  是单变量输入,w={w 0 ,w 1 ,,w M }  M+1  个参数。

目标函数

w=argminL(x,w)=12  i=1 N ( j=0 M w j x j i y i ) 2  

二、求解过程

(x i ,y i )  看做已知值,为了求得 L(x,w)  的最小值,对每一个 w j   求偏导,即:

Lw j  =12  i=1 N [2( j=0 M w j x j i y i )x j i ]= i=1 N (x j i  j=0 M w j x j i ) i=1 N y i x j i  

这里需要注意的是,左式 x j i  M j=0 w j x j i   并不能直接计算为  M j=0 w j x 2j i   ,因为前面的 j  和后面的j 并不是同一个概念,不能混淆。为了区分这一点,我们用矩阵来代表左式:

(x j 1  x j 2   x j N  )⎛ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ x 0 1 x 0 2 x 0 N  x 1 1 x 1 2 x 1 N   x M 1 x M 2 x M N  ⎞ ⎠ ⎟ ⎟ ⎟ ⎟ ⎟ ⎛ ⎝ ⎜ ⎜ ⎜ ⎜ w 0 w 1 w M  ⎞ ⎠ ⎟ ⎟ ⎟ ⎟  

则,该矩阵可以转换为

⎛ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ x j 1 +x j 2 ++x j N x j+1 1 +x j+1 2 ++x j+1 N x j+M 1 +x j+M 2 ++x j+M N  ⎞ ⎠ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟  T ⎛ ⎝ ⎜ ⎜ ⎜ ⎜ w 0 w 1 w M  ⎞ ⎠ ⎟ ⎟ ⎟ ⎟  

按照求极值的步骤,先求偏导,令其为0,解出 w  。即,对每个 w j   求偏导,令其为0,总共得到 M  M  元线性方程,求解该方程,得出 w 

⎛ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜  i=1 N x 0 i  i=1 N x 1 i  i=1 N x M i   i=1 N x 1 i  i=1 N x 2 i  i=1 N x M+1 i    i=1 N x M i  i=1 N x M+1 i  i=1 N x 2M i  ⎞ ⎠ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎛ ⎝ ⎜ ⎜ ⎜ ⎜ w 0 w 1 w M  ⎞ ⎠ ⎟ ⎟ ⎟ ⎟ =⎛ ⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜  i=1 N y i x 0 i  i=1 N y i x 1 i  i=1 N y i x M i  ⎞ ⎠ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟  

三、实验

下面就是利用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  的多项式。

实验结果
训练集数量为10个

Talking is cheap, show me the code. YOU KNOW!!!

吴小同
2016-5-16
2016-5-17

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值