1 はじめに
この記事では主に分析階層プロセス (AHP) の Python 実装について説明し、分析例については後ほど説明します。
2 コードの実装
インポートパッケージ
import numpy as np
2.1 判定マトリクスの構築
判定マトリクスは、一般にエキスパートオピニオン法、すなわちデルファイ法を採用する。ただし、コンテスト中は専門家はいませんので、自分で読むだけで十分ですし、もちろんAHPを改善した記事もたくさんありますので、ご自身で参考にすることもできます。
この記事では 4*4 の判断マトリックスを定義します。つまり、4 つの指標があります。
A = np.array([[1,1/5,1/6,1/9],[5,1,1/2,1/6],[6,2,1,1/3],[9,6,3,1]])
print(A)
行列の行数と列数を表示する
#查看行数和列数
A.shape
2.2 固有値と固有ベクトルを求める
固有値と固有ベクトルの解き方は主に以下のブログを参考にしています
#求特征值和特征向量
'''
https://blog.csdn.net/Strive_For_Future/article/details/109631691
w,v = numpy.linalg.eig(a) 计算方形矩阵a的特征值和右特征向量
a : 待求特征值和特征向量的方阵。
w: 多个特征值组成的一个矢量。备注:多个特征值并没有按特定的次序排列。特征值中可能包含复数。
v: 多个特征向量组成的一个矩阵。每一个特征向量都被归一化了。第i列的特征向量v[:,i]对应第i个特征值w[i]。
'''
V,D = np.linalg.eig(A) # 求特征值和特征向量
print('特征值:')
print(V)
print('特征向量:')
print(D)
必要なものである最大固有値と最大固有ベクトルを出力します。
#最大特征值
tzz = np.max(V)
print('最大特征值为:\n', tzz)
#最大特征向量
k=[i for i in range(len(V)) if V[i] == np.max(V)]
tzx = -D[:,k]
print('最大特征值向量为:\n',tzx)
重み Q を取得します。この Q は、最終的に必要な重み行列、つまり各インジケーターの重みです。
# 赋权重
n = A.shape[1]
quan=np.zeros((n,1))
for i in range(0,n):
quan[i]=tzx[i]/np.sum(tzx)
Q=quan
print(Q)
2.3 整合性チェック
これは、私たち自身の判断マトリクスが妥当であるかどうかをテストするためです。整合性テストに合格すれば使用可能ですが、不合格となった場合は専門家による採点に問題があり、判定マトリックスを修正する必要があります。
#一致性检验
CI=(tzz-n)/(n-1)
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59]
#判断是否通过一致性检验
CR=CI/RI[n-1]
if CR>=0.1:
print('没有通过一致性检验, 判断矩阵需要进行修正\n')
else:
print('通过一致性检验\n')
3 分析例
スコアを持つ 2 つのオブジェクトがあるとします。
オブジェクト A: [8 7 6 8]
オブジェクト B: [7 8 8 7]
# 假设有两个目标
p = np.mat('8 7 6 8;7 8 8 7') #每一行代表一个对象的指标评分
print(p)
次に、上記で取得した重み Q を使用して、これら 2 つのオブジェクトをスコア付けします。
#显示出所有评分对象的评分值
score=p*Q
for i in range(len(score)):
print('object_score {}:'.format(i),float(score[i]))
A のスコアが B のスコアよりも高いことがわかります。スコアの変化を確認するには、さまざまな判定行列を定義してみることができます。