【建模算法】層次分析法(Python實(shí)現(xiàn))
01 算法用途
在很多情況下,我們對(duì)事物評(píng)價(jià),應(yīng)該要多維度評(píng)價(jià)。多維度評(píng)價(jià)之后我們要如何把它們合并成一個(gè)指標(biāo)用于比較事物的好壞呢,這時(shí)候需要對(duì)各個(gè)指標(biāo)賦權(quán), 層次分析法就是用來賦權(quán)重的了。
這個(gè)方法主觀性比較強(qiáng),在數(shù)據(jù)集比較小,實(shí)在不好比較的時(shí)候可以用這個(gè)方法,如果有別的選擇還是盡量不要用這個(gè)算法比較好。可以看下以往建模獲獎(jiǎng)?wù)撐?,此算法的出現(xiàn)頻率還是挺高的,所以存在即有它存在的道理。
02 建模案例
小美要選男朋友了,現(xiàn)有小明、小李兩個(gè)人選,到底該選誰呢?現(xiàn)在小美要從四個(gè)指標(biāo)去選擇,分別是身高、顏值、學(xué)歷、性格。小美對(duì)他們各個(gè)指標(biāo)的評(píng)分如下:
這也太難抉擇了吧??!
03 原理解析
step1:小美查閱圖書資料,選擇依據(jù)如下:
step2:小美開始構(gòu)造判斷矩陣
小美的主觀判斷:
1.身高與顏值相比,身高稍重要
2.身高與學(xué)歷相比,同樣重要
3.身高和性格相比,性格稍重要
4.顏值和學(xué)歷相比,學(xué)歷介于相同重要和稍微重要之間
5.顏值和性格相比,性格明顯重要
6.性格和學(xué)歷相比,性格稍重
身高 | 顏值 | 學(xué)歷 | 性格 | |
---|---|---|---|---|
身高 | 1 | 3 | 1 | 1/3 |
顏值 | 1/3 | 1 | 1/2 | 1/5 |
學(xué)歷 | 1 | 2 | 1 | 1/3 |
性格 | 3 | 5 | 3 | 1 |
小美終于得到了判斷矩陣。
step3:翻閱圖書,小美找到檢驗(yàn)標(biāo)準(zhǔn)
對(duì)判斷矩陣的一致性檢驗(yàn)的步驟如下:
- 計(jì)算一致性指標(biāo)CI
查找相應(yīng)的平均隨機(jī)一致性指標(biāo)RI,對(duì)n=1,…,9,Satty給出了RI的值如下表所示:
RI是通過隨機(jī)方法構(gòu)造500個(gè)樣本矩陣,隨機(jī)地從1~9及其例數(shù)中抽取數(shù)字構(gòu)造正反矩陣,求最大特征根的平均值
λ
m
a
x
\lambda_{max}
λmax?并定義
R
I
=
λ
m
a
x
?
n
n
?
1
RI=\frac{\lambda_{max}-n}{n-1}
RI=n?1λmax??n?
- 計(jì)算一致性比例CR
C R = C I R I CR=\frac{CI}{RI} CR=RICI?
當(dāng) CR<0.10時(shí),一致性接受,否則該矩陣應(yīng)該適當(dāng)修改參數(shù)
step4 :計(jì)算權(quán)重以及得分
- 得到最大特征值對(duì)應(yīng)特征向量
T = [ t 1 t 2 . . . t n ] T=[t_1\quad t_2\quad ...\quad t_n] T=[t1?t2?...tn?]
- 得到權(quán)重向量
W = [ w 1 w 2 . . . w n ] w i = t i ∑ i = 1 n t i W=[w_1\quad w_2\quad ... \quad w_n]\\ w_i=\frac{t_i}{\displaystyle \sum^n_{i=1}t_i} W=[w1?w2?...wn?]wi?=i=1∑n?ti?ti??
- 小美對(duì)男嘉賓的評(píng)分為P,最后得分S
S = P × W S=P\times W S=P×W文章來源:http://www.zghlxwxcb.cn/news/detail-814084.html
真相大白,小明是最佳選擇~得分如下文章來源地址http://www.zghlxwxcb.cn/news/detail-814084.html
Python源碼
#層次分析法完整代碼:
import numpy as np
#計(jì)算特征向量和最大特征值
a=np.array([[1,3,1,1/3],[1/3,1,1/2,1/5],[1,2,1,1/3],[3,5,3,1]]) #a為自己構(gòu)造的輸入判別矩陣
w=np.linalg.eig(a) #np.linalg.eig(matri)返回特征值和特征向量
tzz=np.max(w[0]) #最大特征值
t=np.argwhere(w[0]==tzz) #尋找最大特征值所在的行和列
tzx=w[1][::-1,t[0]] #最大特征值對(duì)應(yīng)的特征向量
#一致性檢驗(yàn)
RILIST=[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]
n=a.shape[0]
RI=RILIST[n]
CI=(tzz-n)/(n-1)
CR=CI/RI
print(CR)
print("通過一致性檢驗(yàn)") if CR<0.1 else print("沒有通過一致性檢驗(yàn)")
P=np.array([[8,7,6,8],[7,8,8,7]]) #每一行代表一個(gè)對(duì)象的指標(biāo)評(píng)分
#賦權(quán)重
quan=np.zeros((n,1));
quan=tzx/sum(tzx)
Q=quan
#顯示出所有評(píng)分對(duì)象的評(píng)分值
score=np.dot(P,Q) #矩陣乘法
for i in range(len(score)):
print('對(duì)象{:}得分={:}'.format(i+1,score[i,0].real))
到了這里,關(guān)于【建模算法】層次分析法(Python實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!