统计学习方法 p12 多项式拟合 python实现

看李航老师《统计学习方法》这本书,第12页举了一个多项式拟合的问题,自己怎么都推导不出来,上网查发现书上有误。
拟合问题描述如下:

1607963-20190318131658579-903576898.png
1607963-20190318131707074-717202041.png

书上的推导就不贴了。
正确推导在知乎上有具体解答:

1607963-20190318144828203-1806173368.png

W即通过求解1607963-20190318145151076-1847815830.png方程得到

上面方程矩阵展开如下:
1607963-20190318145609717-573416885.png

按照这个思路的python代码实现如下:

import numpy as np
import matplotlib.pyplot as plt

# 原始曲线
x_plot = np.linspace(-0.05, 1.05, 100)
y_plot = 6 * x_plot ** 3 - 5 * x_plot ** 2 + 2
# 样本点
x_train = np.linspace(0, 1, 10)
y_train = 6 * x_train ** 3 - 5 * x_train ** 2 + 2
# 加入噪声
x_train_noise = x_train * (1 + (np.random.random(10) - 0.5) * 0.2)
y_train_noise = y_train * (1 + (np.random.random(10) - 0.5) * 0.2)

# 拟合函数
def curve_fitting(order, x_train_noise, y_train_noise):
    # 求各阶xi的值 
    x_element = np.ones((2*order+1, len(x_train_noise)))
    for i in range(2*order):
        x_element[i+1,:] = x_element[i, :] * x_train_noise
    # 求各阶xi值的和
    x_element_sum = x_element.sum(axis=1)
    # 构建XTX矩阵
    x_matrix = np.ones((order+1, order+1))
    for i in range(x_matrix.shape[0]):
        x_matrix[i, :] = np.asarray(x_element_sum[i:i+order+1])
    
    # 构建y矩阵
    y_matrix = x_element[:order+1, :] @ np.asarray(y_train_noise)
    
    # 求W矩阵
    w_matrix = np.linalg.solve(x_matrix, y_matrix)
    
    # 求拟合曲线上的坐标点
    x_split = np.linspace(-0.02, 1.0, 100)
    y_split = []
    for x in x_split:
        x_acum = 1
        y = 0
        for i in range(order+1):
            y += x_acum * w_matrix[i]
            x_acum *= x
        y_split.append(y)
        
    return x_split, y_split


x_order_3, y_order_3 = curve_fitting(3, x_train_noise, y_train_noise)
x_order_9, y_order_9 = curve_fitting(9, x_train_noise, y_train_noise)

# 绘图
plt.plot(x_plot, y_plot, label='original')
plt.scatter(x_train_noise, y_train_noise)
plt.plot(x_order_3, y_order_3, label='order=3')
plt.plot(x_order_9, y_order_9, label='order=9')
plt.legend()

绘图结果如下:
1607963-20190318151333172-602597450.png

吴恩达老师的机器学习的视频中也举了这么个例子,看视频时有一丝怀疑高阶多项式拟合真的像老师手画的那样么,通过python实现确认就是那样的!

参考:

  1. 李航. (2012). 统计学习方法. 清华大学出版社. 北京
  2. https://www.zhihu.com/question/23483726
  3. https://blog.csdn.net/xiaolewennofollow/article/details/46757657

转载于:https://www.cnblogs.com/frodo-x/p/10551514.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值