总结:
数据拟合的方法有很多种,如最小二乘法、遗传算法、神经网络等,它们各有各的优缺点。函数的拟合问题本质上是一个最优化问题。
最小二乘法拟合:
最小二乘法能得到任何散点的拟合曲线,但是不能拿到最优最高次项次数。训练数据的时候次数越高拟合度约好,但是预测的时候不准确,震荡比较大。
r方:
https://blog.csdn.net/yoggieCDA/article/details/106543375
由已知函数求参数:
高斯函数拟合(正态分布)等
神经网络拟合
缺点:不能得到方程
代码:
不足:
不能根据实际值和预测值的差方和作为误差值,因为次数越高拟合度越好,但是预测越差,
import numpy as np
import matplotlib.pyplot as plt
from numpy import polyval
def error(yhat,label):
yhat = np.array(yhat)
label = np.array(label)
error_sum = ((yhat - label)**2).sum()
return error_sum
def huigui(xyuce,p1):
xyuce = np.array(xyuce)
yuceyvals = p1(xyuce)
print('预测y值 is :\n', yuceyvals)
plot1 = plt.plot(xyuce, yuceyvals, 's',label='original values')
plot2 = plt.plot(xyuce, yuceyvals, 'r',label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('polyfitting')
plt.show()
def finalhuigui(x,y,erxiangNum):
x = np.array(x)
# print('x is :\n',x)
y = np.array(y)
# print('y is :\n',y)
erroCountDict=dict()
#
# 在使用polyfit函数时,由于polyfit内部机制,当自变量 X (也就是你的数据n)出现以下几种情形,就会出现你所得到的警告:
# 1. 拟合多项式次数 大于或等于 X 的长度
# 2. 自变量 X 有重复数值或很相近的数值
# 3. X 可能需要变得更集中或者缩放一下
for i in range(erxiangNum):
# 使用np.polyfit拟合,np.polyld得到多项式系数
#用3次多项式拟合
f1 = np.polyfit(x, y, i)
# print('f1 is :\n',f1)
p1 = np.poly1d(f1)
# 显示多项式
# print('p1 is :\n',p1)
#也可使用yvals=np.polyval(f1, x)
yvals = p1(x)#拟合y值
# print('yvals is :\n',yvals)
# sumNum=error(yvals,y)
y5 = polyval(p1,x)
print(y5)
erroCountDict[i]=y5
print(erroCountDict)
finaFitNum=min(erroCountDict, key=erroCountDict.get)
print(finaFitNum)
#
f1 = np.polyfit(x, y, finaFitNum)
# print('f1 is :\n',f1)
p1 = np.poly1d(f1)
# 显示多项式
print('最佳多项式 is :\n',p1)
# 也可使用yvals=np.polyval(f1, x)
# p1为模型
yvals = p1(x)#拟合y值
print('训练y值 is :\n', yvals)
print('最佳多项式的拟合y值 is :\n',yvals)
#绘图1
plot1 = plt.plot(x, y, 's',label='original values')
plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('polyfitting')
plt.show()
return p1, finaFitNum
if __name__ == "__main__":
x = [10, 20, 30, 40, 50, 60, 70, 80]
y = [174, 236, 305, 334, 349, 351, 342, 323]
p1, finaFitNum=finalhuigui(x,y,7)
# yuce=[10,15,20,25, 30,35, 40,45, 50,55, 60,65, 70,75, 80]
yuce = [10, 20, 30, 40,50,55,60,70,80]
huigui(yuce,p1)
参考文档:
https://blog.csdn.net/changdejie/article/details/83089933?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2
https://www.cnblogs.com/qi-yuan-008/p/12323535.html
https://www.jb51.net/article/180660.htm
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.polyfit.html
https://wenku.baidu.com/view/cda9e384a0116c175f0e4879.html
https://zhidao.baidu.com/question/311173277.html
定义了一个计算损失的函数:
https://blog.csdn.net/dake13/article/details/80917932
字典取最小值
https://blog.csdn.net/weixin_41770169/article/details/80816886