日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

用python的numpy作线性拟合、多项式拟合、对数拟合

發(fā)布時間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用python的numpy作线性拟合、多项式拟合、对数拟合 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自:http://blog.itpub.net/12199764/viewspace-1743145/

項(xiàng)目中有涉及趨勢預(yù)測的工作,整理一下這3種擬合方法:
1、線性擬合-使用math
import math
def linefit(x , y):
? ? N = float(len(x))
? ? sx,sy,sxx,syy,sxy=0,0,0,0,0
? ? for i in range(0,int(N)):
? ? ? ? sx ?+= x[i]
? ? ? ? sy ?+= y[i]
? ? ? ? sxx += x[i]*x[i]
? ? ? ? syy += y[i]*y[i]
? ? ? ? sxy += x[i]*y[i]
? ? a = (sy*sx/N -sxy)/( sx*sx/N -sxx)
? ? b = (sy - a*sx)/N
? ? r = abs(sy*sx/N-sxy)/math.sqrt((sxx-sx*sx/N)*(syy-sy*sy/N))
? ? return a,b,r

if __name__ == '__main__':
? ? X=[ 1 ,2 ?,3 ,4 ,5 ,6]
? ? Y=[ 2.5 ,3.51 ,4.45 ,5.52 ,6.47 ,7.51]
? ? a,b,r=linefit(X,Y)
? ? print("X=",X)
? ? print("Y=",Y)
? ? print("擬合結(jié)果: y = %10.5f x + %10.5f , r=%10.5f" % (a,b,r) )
#結(jié)果為:y = ? ?0.97222 x + ? ?1.59056 , r= ? 0.98591


1、線性擬合-使用numpy
import numpy as np
X=[ 1 ,2 ?,3 ,4 ,5 ,6]
Y=[ 2.5 ,3.51 ,4.45 ,5.52 ,6.47 ,7.51]
z1 = np.polyfit(X, Y, 1) ?#一次多項(xiàng)式擬合,相當(dāng)于線性擬合
p1 = np.poly1d(z1)
print z1 ?#[ 1. ? ? ? ? ?1.49333333]
print p1 ?#?1 x + 1.493


2、二次多項(xiàng)式擬合
import numpy

def polyfit(x, y, degree):
? ? results = {}
? ? coeffs = numpy.polyfit(x, y, degree)
? ? results['polynomial'] = coeffs.tolist()

? ? # r-squared
? ? p = numpy.poly1d(coeffs)
? ? # fit values, and mean
? ? yhat = p(x) ? ? ? ? ? ? ? ? ? ? ? ? # or [p(z) for z in x]
? ? ybar = numpy.sum(y)/len(y) ? ? ? ? ?# or sum(y)/len(y)
? ? ssreg = numpy.sum((yhat-ybar)**2) ? # or sum([ (yihat - ybar)**2 for yihat in yhat])
? ? sstot = numpy.sum((y - ybar)**2) ? ?# or sum([ (yi - ybar)**2 for yi in y])
? ? results['determination'] = ssreg / sstot #準(zhǔn)確率
? ? return results

x=[ 1 ,2 ?,3 ,4 ,5 ,6]
y=[ 2.5 ,3.51 ,4.45 ,5.52 ,6.47 ,7.2]
z1 = polyfit(x, y, 2)
print z1





3、對數(shù)函數(shù)擬合-這個是最難的,baidu上都找不到,google了半天才找到的。指數(shù)、冪數(shù)擬合啥的,都用這個,把func改寫一下就行
from scipy import log as log print pcov
import numpy
from scipy import log
from scipy.optimize import curve_fit

def func(x, a, b):
? ? y = a * log(x) + b
? ? return y

def polyfit(x, y, degree):
? ? results = {}
? ? #coeffs = numpy.polyfit(x, y, degree)
? ? popt, pcov = curve_fit(func, x, y)
? ? results['polynomial'] = popt

? ? # r-squared
? ? yhat = func(x ,popt[0] ,popt[1] ) ? ? ? ? ? ? ? ? ? ? ? ? # or [p(z) for z in x]
? ? ybar = numpy.sum(y)/len(y) ? ? ? ? ?# or sum(y)/len(y)
? ? ssreg = numpy.sum((yhat-ybar)**2) ? # or sum([ (yihat - ybar)**2 for yihat in yhat])
? ? sstot = numpy.sum((y - ybar)**2) ? ?# or sum([ (yi - ybar)**2 for yi in y])
? ? results['determination'] = ssreg / sstot

? ? return results


x=[ 1 ,2 ?,3 ,4 ,5 ,6]
y=[ 2.5 ,3.51 ,4.45 ,5.52 ,6.47 ,7.51]
z1 = polyfit(x, y, 2)
print z1

轉(zhuǎn)載于:https://www.cnblogs.com/gslyyq/p/5043847.html

總結(jié)

以上是生活随笔為你收集整理的用python的numpy作线性拟合、多项式拟合、对数拟合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。