??L-V模型的全稱(chēng)為L(zhǎng)otka-Volterra模型,其本質(zhì)為借鑒生物種群理論,對(duì)可以抽象為種群的事物之間的競(jìng)爭(zhēng)與合作關(guān)系進(jìn)行量化研究,在學(xué)術(shù)研究中比較常應(yīng)用,原理不是本文研究重點(diǎn),如需要弄懂原理建議各位去知網(wǎng)查看相關(guān)文章。目前并沒(méi)有哪個(gè)工具可以提供快速方便的L-V模型參數(shù)計(jì)算包,因此很多研究者在采用這個(gè)模型后參數(shù)的計(jì)算成為一個(gè)大問(wèn)題,筆者結(jié)合目前最熱門(mén)的語(yǔ)言之一python給出了L-V模型參數(shù)的計(jì)算方法,只要修改讀入文件的路徑就可以計(jì)算出相關(guān)的參數(shù),代碼可以粘貼復(fù)制直接使用,希望對(duì)于一些出入門(mén)的研究者有所幫助。代碼如下:
import pandas as pd#沒(méi)有這個(gè)包 pip install安裝
import numpy as np#同上
a=pd.read_csv('/Users/elliot/Desktop/container.csv',encoding='gbk')#路徑可以修改,具體應(yīng)用時(shí)改為你的基礎(chǔ)數(shù)據(jù)存放位置。
a=a.set_index(['時(shí)間'])
listofa=np.array(a)
#一級(jí)差分的計(jì)算函數(shù),實(shí)際上對(duì)于數(shù)據(jù)分析行業(yè)從業(yè)者,也可以用此計(jì)算環(huán)比增長(zhǎng)。當(dāng)然熟練pandas的看官,可以很方便的用pandas進(jìn)行計(jì)算。
def llcha(x):
n = len(x)
y=[]
for i in range(n-1):
y.append(x[i+1] - x[i])
return y
#y = llcha(listofa[:,0])
#計(jì)算中位值,對(duì)于灰色預(yù)測(cè),這個(gè)函數(shù)也是可以使用的。
def llmid(x):
m,n = np.shape(x)
ytmp = np.zeros((n,m-1))
for i in range(n):
for j in range(m-1):
ytmp[i,j] = (x[j,i]+x[j+1,i])/2
return ytmp
#權(quán)重計(jì)算函數(shù),key控制計(jì)算位置,與L-V計(jì)算公式本身特征有關(guān)
def weights(ytmp,key):
m,n = np.shape(ytmp)
weights = np.zeros((n,m))
for i in range(n):
weights[i,0] = ytmp[key,i]
for j in range(1,m):
if j < key:
weights[i,j] = ytmp[key,i] * ytmp[j-1,i]
elif j >= key:
weights[i,j] = ytmp[key,i] * ytmp[j,i]
return weights
#參數(shù)計(jì)算函數(shù),采用了最小二乘法
def optcanshu(x):
ytmp = llmid(x)
n = np.shape(x)[1]
canshuset=[]
for i in range(n):
yn = llcha(x[:,i])
yn = np.mat(yn)
weightstest = weights(ytmp,i)
# print(weightstest)
weightstest = np.mat(weightstest)
canshu = (weightstest.T * weightstest).I*weightstest.T*yn.T
#最小二乘法推導(dǎo)到最后就是這個(gè)公式,其實(shí)線(xiàn)形回歸參數(shù)求解也用的這個(gè)公式。
#print(canshu)
canshuset.append(canshu)
return canshuset
#輸出最終的參數(shù)值
canshuset = optcanshu(listofa)
#在annaconda的spyder中這個(gè)可以以變量的形式保存,類(lèi)似于matlab,所以推薦使用。同時(shí)也推薦jupyter作為腳本編輯器。
#ytmp = llmid(listofa)
#weight1 = weights(ytmp,2)