AHP層次分析法
AHP層次分析法是一種層次權(quán)重決策分析法,解決多目標(biāo)復(fù)雜問題的定性和定量的決策分析方法,用決策者的的經(jīng)驗(yàn)判定各個(gè)衡量目標(biāo)之間相對(duì)的重要程度,給出每個(gè)決策方案的權(quán)重,確定優(yōu)先次序。
1、基本原理
消費(fèi)者對(duì)包包的偏好

這是最簡(jiǎn)單的層次分析。
2、解決思路
我們的基本思路是將所要分析的問題層次化,把影響目標(biāo)的因素分解成不同的因素,按照因素的關(guān)聯(lián)關(guān)系和隸屬關(guān)系形成不同的組合,這樣就形成了一個(gè)多層次分析模型,并對(duì)比優(yōu)劣。
3、層次分析模型的步驟
- 1、創(chuàng)建層次目標(biāo)
- 2、設(shè)置分析法的標(biāo)準(zhǔn)(考慮的因素)
- 3、設(shè)置分析法的子標(biāo)準(zhǔn)(考慮因素的子因素,可加可不加)
- 4、設(shè)置方案層
- 5、逐層矩陣計(jì)算,驗(yàn)證歸一性
- 6、最終得出權(quán)重占比
層次分析法所要解決的問題是關(guān)于最低層對(duì)最高層的相對(duì)權(quán)重的問題,按此相對(duì)權(quán)重可以對(duì)最低層中的各種方案、措施進(jìn)行排序,從而在不同的方案中做出選擇或形成選擇方案的原則.
構(gòu)建判斷矩陣:
我們?cè)跇?gòu)建矩陣的時(shí)候必須保持一致性,我們將因素兩兩比較的。
矩陣aij的評(píng)分標(biāo)準(zhǔn),下面是9分標(biāo)準(zhǔn),也可以設(shè)置5分標(biāo)準(zhǔn)、7分標(biāo)準(zhǔn)
注意:
我們?cè)谠O(shè)置aij的評(píng)分的同時(shí),aji的評(píng)分是aij評(píng)分的倒數(shù),假如a12的評(píng)分是2,那個(gè)a21的評(píng)分是1/2
一致性驗(yàn)證:
我們得出求出矩陣的特征向量W和特征值λ之后,我們需要判斷矩陣是否一致性標(biāo)準(zhǔn)。
定義一致性指標(biāo) CI=λ?n/n-1;
CI越接近0,表示一致性越好,越大表示一致性月差。
為了衡量CI的發(fā)小,我們引入隨機(jī)一直項(xiàng)指標(biāo)RI
定義一致性比率CR= CI/RI,當(dāng)CR<0.1的時(shí)候我們就認(rèn)為滿足一致性校驗(yàn),否則我們就需要重新對(duì)比矩陣,對(duì)其中的評(píng)分重新調(diào)整.
實(shí)例:
我們構(gòu)建準(zhǔn)則層對(duì)目標(biāo)層的矩陣:

計(jì)算特征向量的過程(計(jì)算權(quán)重占比的過程):
1、列向求和

2、列向歸一化

得到列向歸一化矩陣:

3、行求和

4、歸一化

顏色對(duì)應(yīng)的求和0.3679/3,得到最終的權(quán)重占比
W=(0.1226,0.3202,0.5571)T
我們需要計(jì)算特征值λ,進(jìn)而求出一致性指標(biāo)CI
AW=λW,W是特征向量(0.1226,0.3202,0.5571)T

得出AW的值便可以得出λ,此時(shí)λ,存在3個(gè)值,我們?nèi)テ渌銛?shù)平均數(shù)
λ=(0.3692/0.1226+0.9684/0.3202+1.6879/0.5571)/3 = 3.0219
CI = λ-n/n-1= 0.01095
CR = CI/RI = 0.0189 < 0.1 所以符合一致性
通過上面的層次分析,我們得出評(píng)價(jià)是最重要的因素,影響消費(fèi)者對(duì)包包的購(gòu)買。
層次總排序以及一次性檢驗(yàn)
- 計(jì)算某一層次對(duì)總目標(biāo)相當(dāng)于重要性的權(quán)值,稱為層次總排序
- 這一過程是從最高層次到最低層次依次進(jìn)行。

A層m個(gè)因素A1,A2,???,Am, ,對(duì)總目標(biāo)Z的排序?yàn)閍1,a2,???,am
B層n個(gè)因素對(duì)上層A中因素為Aj的層次單排序?yàn)閎1j,b2j,???,bnj(j=1,2,3,???,m)
層次總排序的一致性比例
CR=(a1CI1+a2CI2+...+amCIm)/(a1RI1+a2RI2+...+amRIm),當(dāng)CR<0.1的時(shí)候,我們認(rèn)為層次總排序一致。
例子:
我們?cè)谏厦孢x擇包包的時(shí)候,我們第二層準(zhǔn)則對(duì)目標(biāo)的權(quán)向量W1=W=(0.1226,0.3202,0.5571)T,同樣我們要求第三層對(duì)第二層每一個(gè)元素(準(zhǔn)則)的權(quán)向量。

我們可以計(jì)算出
Bλ1= 3.0536 Bλ2 =3.0385 Bλ3 = 3.0037
BW1 = (0.7089,0.1786,0.1125)T
BW2 = (0.6370,0.2583,0.1047)T
BW3 = (0.5816,0.3090,0.1095)T
組合權(quán)向量
我們得到最終的矩陣權(quán)值:

RI = 0.58 ,我們可以驗(yàn)證CI<0.1,符合一致性檢驗(yàn)
方案層對(duì)目標(biāo)組合最終的權(quán)值向量是:(0.6149,0.2767,0.1083)T
所以我們可以得到LV包包是用戶更關(guān)心的商品。
最終結(jié)果,我們將5-10人的評(píng)分結(jié)果都求取取來,然后去除最高和最低值,求每個(gè)解決方案的算數(shù)平均數(shù),我們可以得到最終的解決方案。
我們?cè)跇?biāo)準(zhǔn)層的下方,繼續(xù)寫子標(biāo)準(zhǔn),例如顏色分成紅、黑、橙3中,我們求取去特征向量W,之后就能求出每個(gè)顏色是消費(fèi)者最喜歡的,方法類似上面的流程。
python 代碼:
# coding=UTF-8
import numpy as np
'''
@Description:求解矩陣的權(quán)向量
@para:成對(duì)比較矩陣
@return:權(quán)向量
'''
def abhWeightVector(Mat):
sizeMat = Mat.shape[0]
#print(Mat)
#print(sizeMat)
# 計(jì)算矩陣A的特征值,特征向量
eigenvalueMat, eigenvectorMat = np.linalg.eig(Mat)
#print("特征值:", eigenvalueMat)
#print("特征向量:", eigenvectorMat)
# 將所有特征值取絕對(duì)值
absEigenvalueMat = map(abs, eigenvalueMat)
absEigenvalueMat = list(absEigenvalueMat)
#print(absEigenvalueMat)
# 絕對(duì)值最大的特征值
maxEigenvalueMat = max(absEigenvalueMat)
#print("絕對(duì)值最大的特征值:", maxEigenvalueMat)
# 絕對(duì)值最大的特征值的索引
maxEigenvalueIndexMat = absEigenvalueMat.index(maxEigenvalueMat)
#print(maxEigenvalueIndexMat)
# 絕對(duì)值最大的特征值對(duì)應(yīng)的特征向量
maxEigenvectorMat = eigenvectorMat[:, maxEigenvalueIndexMat]
#print("絕對(duì)值最大的特征值對(duì)應(yīng)的特征向量:", maxEigenvectorMat)
# 將上述特征向量標(biāo)準(zhǔn)化,即權(quán)向量
standardizeVectorMat = list(map(abs, maxEigenvectorMat)) / sum(list(map(abs, maxEigenvectorMat)))
#print(standardizeVectorMat)
# 計(jì)算不一致程度CI
CI = (maxEigenvalueMat - sizeMat) / (sizeMat - 1)
#print(CI)
# 平均隨機(jī)一致性指標(biāo)RI
listRI = [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45]
#計(jì)算隨機(jī)一致性比率
CR = CI / listRI[sizeMat - 1]
#print(CR)
return standardizeVectorMat
MatA = np.array([[1, 2, 7, 5 ,5],
[1/2, 1, 4, 3, 3],
[1/7, 1/4, 1, 1/2, 1/2],
[1/5, 1/3, 2, 1, 1],
[1/5, 1/3, 3, 1, 1]])
standardizeVectorMatA = abhWeightVector(MatA)
print(standardizeVectorMatA)
MatB1 = np.array([[1, 1/3, 1/8],
[3, 1, 1/3],
[8, 3, 1]])
standardizeVectorMatB1 = abhWeightVector(MatB1)
print(standardizeVectorMatB1)
MatB2 = np.array([[1, 2, 5],
[1/2, 1, 2],
[1/5, 1/2, 1]])
standardizeVectorMatB2 = abhWeightVector(MatB2)
print(standardizeVectorMatB2)
MatB3 = np.array([[1, 1, 3],
[1, 1, 3],
[1/3, 1/3, 1]])
standardizeVectorMatB3 = abhWeightVector(MatB3)
print(standardizeVectorMatB3)
MatB4 = np.array([[1, 3, 4],
[1/3, 1, 1],
[1/4, 1, 1]])
standardizeVectorMatB4 = abhWeightVector(MatB4)
print(standardizeVectorMatB4)
MatB5 = np.array([[1, 4, 1/4],
[1, 1, 1/4],
[4, 1, 1]])
standardizeVectorMatB5 = abhWeightVector(MatB5)
print(standardizeVectorMatB5)
MatB = np.array([standardizeVectorMatB1,
standardizeVectorMatB2,
standardizeVectorMatB3,
standardizeVectorMatB4,
standardizeVectorMatB5])
print(MatB)
sumY1 = 0
sumY2 = 0
sumY3 = 0
for i in range(0, MatA.shape[0]):
sumY1 += standardizeVectorMatA[i] * MatB[i][0]
sumY2 += standardizeVectorMatA[i] * MatB[i][1]
sumY3 += standardizeVectorMatA[i] * MatB[i][2]
sumY = [sumY1, sumY2, sumY3]
print(sumY)
maxY = max(sumY)
theBestIndex = sumY.index(maxY)
print(theBestIndex)
在線工具避免個(gè)人計(jì)算:
wis-ai
spssau
參考Blog:
層次分析法(AHP)詳細(xì)步驟


