回归方程

总结:

数据拟合的方法有很多种,如最小二乘法、遗传算法、神经网络等,它们各有各的优缺点。函数的拟合问题本质上是一个最优化问题。

最小二乘法拟合:

最小二乘法能得到任何散点的拟合曲线,但是不能拿到最优最高次项次数。训练数据的时候次数越高拟合度约好,但是预测的时候不准确,震荡比较大。
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值