L-V模型的全称为Lotka-Volterra模型,其本质为借鉴生物种群理论,对可以抽象为种群的事物之间的竞争与合作关系进行量化研究,在学术研究中比较常应用,原理不是本文研究重点,如需要弄懂原理建议各位去知网查看相关文章。目前并没有哪个工具可以提供快速方便的L-V模型参数计算包,因此很多研究者在采用这个模型后参数的计算成为一个大问题,笔者结合目前最热门的语言之一python给出了L-V模型参数的计算方法,只要修改读入文件的路径就可以计算出相关的参数,代码可以粘贴复制直接使用,希望对于一些出入门的研究者有所帮助。代码如下:
import pandas as pd#没有这个包 pip install安装
import numpy as np#同上
a=pd.read_csv('/Users/elliot/Desktop/container.csv',encoding='gbk')#路径可以修改,具体应用时改为你的基础数据存放位置。
a=a.set_index(['时间'])
listofa=np.array(a)
#一级差分的计算函数,实际上对于数据分析行业从业者,也可以用此计算环比增长。当然熟练pandas的看官,可以很方便的用pandas进行计算。
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])
#计算中位值,对于灰色预测,这个函数也是可以使用的。
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
#权重计算函数,key控制计算位置,与L-V计算公式本身特征有关
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
#参数计算函数,采用了最小二乘法
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
#最小二乘法推导到最后就是这个公式,其实线形回归参数求解也用的这个公式。
#print(canshu)
canshuset.append(canshu)
return canshuset
#输出最终的参数值
canshuset = optcanshu(listofa)
#在annaconda的spyder中这个可以以变量的形式保存,类似于matlab,所以推荐使用。同时也推荐jupyter作为脚本编辑器。
#ytmp = llmid(listofa)
#weight1 = weights(ytmp,2)