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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM