用python实现层次分析法(AHP)

层次分析法是数学建模的入门算法,类似于算法竞赛中的cout<<"Hello,world!"<
对于python数据分析的初学者来说,在使用python实现层次分析法时,难点是特征值法的相关函数。

首先是计算矩阵的特征值和特征向量,当然你也可以手算

w=np.linalg.eig(a)  #np.linalg.eig(matri)返回特征值和特征向量

然后是寻找最大特征值所在的行和列

t=np.argwhere(w[0]==a_max) #寻找最大特征值所在的行和列

argwhere()中的参数是一个表达式
特征值法代码如下:

import numpy as np

#计算特征向量和最大特征值
a=np.array([[1,1/2,1/5],[2,1,1/2],[5,2,1]])   #建立一个二维数组
w=np.linalg.eig(a)  #np.linalg.eig(matri)返回特征值和特征向量
a_max=np.max(w[0])
t=np.argwhere(w[0]==a_max) #寻找最大特征值所在的行和列
RILIST=[0,0,0,0.52,0.89,1.12,1.26,1.36,1.41,1.46,1.49,1.52,1.54,1.56,1.58,1.59]
n=a.shape[0]
RI=RILIST[n]
CI=(a_max-n)/(n-1)
CR=CI/RI
print(CR)
print("矩阵一致性可接受") if CR<0.1 else print("矩阵一致性不可接受")
ans=w[1][::-1,t[0]]
SUM=sum(ans)
for i in range(ans.shape[0]):
    ans[i]/=SUM

为了结果的稳健性,我们也常常使用算术平均值法和几何平均值法求权重

'''
算术平均值法
'''
import numpy as np

a=np.array([[1,1/2,1/4],[2,1,1/2],[4,2,1]])
b=np.sum(a,axis=1)
for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        a[j][i]/=b [j]
print(np.average(a,axis=0))
'''
几何平均值法
'''
import numpy as np
a=np.array([[1,1/2,1/4],[2,1,1/2],[4,2,1]])
b=np.power(np.prod(a,axis=0),1/a.shape[0]) #累乘
b=b/np.sum(b)
print(b)

`

你可能感兴趣的:(数学建模,python,numpy,数学建模)