多项式拟合(最小二乘法)
a基本原理:
b拟合函数原理:
c方法优缺点:
优点:
- 思想简单,实现容易。建模迅速,对于小数据量、简单的关系很有效。
- 解决回归问题,拥有很好的解释性。
- 是很多非线性模型的基础。
缺点:
- 对于非线性数据或者数据特征间具有相关性多项式回归难以建模。
- 当样本特征n非常大的时候会变的很耗时,难以很好的表达复杂的数据。
- 需要做预测的话需要数据大致满足多项式函数。
d算法入口:
该方法主要用到的函数是np.polyfit(x,y,deg,*args)
1.deg为需要拟合函数的最高次数。当deg=0时,y=a0。
2.其他参数*args在这里目前不需要讨论。
3.np.polyfit函数的返回值是拟合好之后的参数,按(an,……,a1)排序
4.该函数缺少对应的惩罚函数,待思考研究。
可以使用np.ploy1d()来加载函数,方便生成对应的y
e实例参考:
# -*- coding: utf-8 -*-
'''
多项式拟合(最小二乘法),这里的例子是三次方拟合
'''
import numpy as np
from matplotlib import pyplot as plt
def func(x): # 原函数
return x ** 3 - 3 * x + 1
def trendline(x, y, n):
model = np.polyfit(x, y, deg=n) # 拟合函数,输出参数
return np.poly1d(model)
# 作图,其中y1为原始数据,y2为拟合出来的数据
def PLT(x1, y1, x2, y2):
plt.scatter(x1, y1, color='blue')
plt.plot(x1, func(x1), color='yellow', label='real')
plt.plot(x2, y2, color='red', label='fit')
plt.legend()
plt.show()
if __name__ == '__main__':
# 生成300个时序坐标点(x,y),前250个点用于拟合,后50个点用于预测
x = np.linspace(-3, 3, 300)
y = func(x)
y += np.random.randn(300) * 0.5 # 加上噪声
ff = trendline(x[:250], y[:250], n=3)
print(ff)
PLT(x, y, x, np.poly1d(ff)(x))
运行结果如下
f参考文献:
机器学习--线性回归算法的原理及优缺点
https://www.cnblogs.com/lsm-boke/p/11746274.html
知乎 最小二乘法(least sqaure method)
https://zhuanlan.zhihu.com/p/38128785/
知乎 多项式曲线拟合
https://zhuanlan.zhihu.com/p/53056358