回归方程
总结:
数据拟合的方法有很多种,如最小二乘法、遗传算法、神经网络等,它们各有各的优缺点。函数的拟合问题本质上是一个最优化问题。
最小二乘法拟合:
最小二乘法能得到任何散点的拟合曲线,但是不能拿到最优最高次项次数。训练数据的时候次数越高拟合度约好,但是预测的时候不准确,震荡比较大。
r方:
由已知函数求参数:
高斯函数拟合(正态分布)等
神经网络拟合
缺点:不能得到方程
代码:
不足:
不能根据实际值和预测值的差方和作为误差值,因为次数越高拟合度越好,但是预测越差,
import numpy as np
import matplotlib.pyplot as plt
from numpy import polyvaldef 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]=y5print(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)#绘图1plot1 = 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, finaFitNumif __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)
参考文档:
=distribute.pc_relevant.none-task-blog-baidujs-2
.html
.htm
.13.0/reference/generated/numpy.polyfit.html
.html
.html
定义了一个计算损失的函数:
字典取最小值
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690942490a469225.html
评论列表(0条)