• numpy多项式拟合


      关于解决使用numpy.ployfit进行多项式拟合的时候请注意数据类型,解决问题的思路就是统一把数据变成浮点型,就可以了。这是numpy里面的一个bug,非常low希望后面改善。

    # coding:utf-8
    
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.interpolate import interp1d
    
    data = pd.read_excel('指数.xlsx',header=None,index_col=None)
    
    # 数据信息
    # print(data.info())
    
    # 查看空值
    isnull = data[1].isnull()
    # print(isnull)
    # print(data[1])
    
    # 替换空值
    data[1] = data[1].fillna('666')
    
    # 找出索引
    index_ = data[isnull].index.tolist()
    # print(index_)
    
    # 去除空列所在行
    data = data.drop(index_)
    # print(data)
    
    x = data[1]
    y = data[0]
    
    # 插值
    
    f1=interp1d(x,y,kind='linear')#线性插值
    #f2=interp1d(x,y,kind='cubic')#三次样条插值
    x_pred=np.arange(1,170,1)
    y1=f1(x_pred)
    
    # datas = pd.DataFrame([y1,x_pred])
    # datas.to_excel('new指数.xlsx')
    
    
    
    
    
    #y2=f2(x_pred)
    # plt.figure(figsize=[12,7])
    # plt.scatter(x,y,s=30,c='red',label='原始指数')
    # plt.plot(x_pred,y1,'b--',label='linear interpolation')
    # # plt.plot(x_pred,y2,'b--',label='cubic')
    # plt.legend(loc='upper left')
    # font_size = {'size':13}
    # plt.ylabel('淘宝指数',font_size)
    # plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为SimHei显示中文
    # plt.rcParams['axes.unicode_minus'] = False  # 设置正常显示符号
    # plt.show()
    # print(x_pred,y1.shape)
    
    # xx = np.hstack([x_pred.reshape(-1,1),np.ones([len(x_pred),1])])
    
    # ****************************************************************************
    # 在使用numpy的拟合函数polyfit进行进行拟合时,会出现数据类型的问题,吧他们数据类型统一转浮点型就解决
    x_pred = np.array(x_pred,dtype='float')
    y1 = np.array(y1,dtype='float')
    
    z1 = np.polyfit(x_pred, y1,3)#用3次多项式拟合
    p1 = np.poly1d(z1)
    print(p1) #在屏幕上打印拟合多项式
    #yvals=p1(x)#也可以使用yvals=np.polyval(z1,x)
    yvals=np.polyval(z1,x_pred)
    
    plt.figure(figsize=[12,7])
    plt.scatter(x,y,s=30,c='red',label='原始指数')
    plt.plot(x_pred,yvals,'b--',label='%s  =  y'%p1)
    plt.legend(loc='upper left')
    font_size = {'size':13}
    plt.ylabel('淘宝指数:y',font_size)
    plt.xlabel('x',font_size)
    p_mean = (np.sum(np.abs(yvals-y1))/len(y1))
    plt.title('平均误差:%s'%(p_mean))
    
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为SimHei显示中文
    plt.rcParams['axes.unicode_minus'] = False  # 设置正常显示符号
    plt.show()

     

  • 相关阅读:
    java枚举
    [bzoj3436]小K的农场【差分约束系统】【判负环】
    [bzoj1085][SCOI2005]骑士精神【暴力】
    [bzoj1034][ZJOI2008]泡泡堂BNB【贪心】
    [bzoj1046][HAOI2007]上升序列【dp】
    [bzoj1050][HAOI2006]旅行comf【MST】
    [bzoj1047][HAOI2007]理想的正方形【单调队列】
    [bzoj1004][HNOI2008]Cards【群论】
    [bzoj1045][HAOI2008] 糖果传递【构造】
    [bzoj4589]Hard Nim【FWT】
  • 原文地址:https://www.cnblogs.com/wuzaipei/p/9843767.html
Copyright © 2020-2023  润新知