层次分析法之python
目錄
1.簡(jiǎn)介
2.算法解析
3.實(shí)例分析
3.1 構(gòu)造矩陣
3.2 查看行數(shù)和列數(shù)
3.3 求特征向量
3.4 找到最大特征值和最大特征向量
3.5 計(jì)算權(quán)重
3.6 一致性檢驗(yàn)
3.7 計(jì)算評(píng)分
完整代碼
1.簡(jiǎn)介
? ? ? ? 一種主觀賦權(quán)的方法,在數(shù)據(jù)集比較小,實(shí)在不好比較的時(shí)候可以用這個(gè)方法,如果有別的選擇還是盡量不要用這個(gè)算法比較好。
????????層次分析法的特點(diǎn)是在對(duì)復(fù)雜的決策問(wèn)題的本質(zhì)、影響因素及其內(nèi)在關(guān)系等進(jìn)行深入分析的基礎(chǔ)上,利用較少的定量信息使決策的思維過(guò)程數(shù)學(xué)化,從而為多目標(biāo)、多準(zhǔn)則或無(wú)結(jié)構(gòu)特性的復(fù)雜決策問(wèn)題提供簡(jiǎn)便的決策方法。尤其適合于對(duì)決策結(jié)果難于直接準(zhǔn)確計(jì)量的場(chǎng)合。
????????層次分析法是將決策問(wèn)題按總目標(biāo)、各層子目標(biāo)、評(píng)價(jià)準(zhǔn)則直至具體的備投方案的順序分解為不同的層次結(jié)構(gòu),然后得用求解判斷矩陣特征向量的辦法,求得每一層次的各元素對(duì)上一層次某元素的優(yōu)先權(quán)重,最后再加權(quán)和的方法遞階歸并各備擇方案對(duì)總目標(biāo)的最終權(quán)重,此最終權(quán)重最大者即為最優(yōu)方案。這里所謂“優(yōu)先權(quán)重”是一種相對(duì)的量度,它表明各備擇方案在某一特點(diǎn)的評(píng)價(jià)準(zhǔn)則或子目標(biāo),標(biāo)下優(yōu)越程度的相對(duì)量度,以及各子目標(biāo)對(duì)上一層目標(biāo)而言重要程度的相對(duì)量度。層次分析法比較適合于具有分層交錯(cuò)評(píng)價(jià)指標(biāo)的目標(biāo)系統(tǒng),而且目標(biāo)值又難于定量描述的決策問(wèn)題。其用法是構(gòu)造判斷矩陣,求出其最大特征值。及其所對(duì)應(yīng)的特征向量W,歸一化后,即為某一層次指標(biāo)對(duì)于上一層次某相關(guān)指標(biāo)的相對(duì)重要性權(quán)值。
2.算法解析
例如某研究對(duì)象的指標(biāo)集
然后通過(guò)以下表格復(fù)制指標(biāo)n對(duì)指標(biāo)m的重要性
判斷矩陣匯總指標(biāo)n對(duì)指標(biāo)m滿足公式
然后通過(guò)eig函數(shù)求取矩陣的特征向量
一致性檢驗(yàn)
其中RI根據(jù)指標(biāo)個(gè)數(shù)通過(guò)下表選擇對(duì)應(yīng)的RI值
如果CR<0.10時(shí),則建立的判斷矩陣的一致性認(rèn)為是可接受的,否則應(yīng)對(duì)其進(jìn)行修正。
3.實(shí)例分析
????????小美要選男朋友了,現(xiàn)有小明、小李兩個(gè)人選,到底該選誰(shuí)呢?現(xiàn)在小美要從四個(gè)指標(biāo)去選擇,分別是身高、顏值、學(xué)歷、性格。小美對(duì)他們各個(gè)指標(biāo)的評(píng)分如下:
由于兩者各有其優(yōu)點(diǎn),實(shí)在令人難以抉擇,于是小美根據(jù)自己的主觀判斷,認(rèn)為如下:
- 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 |
由此,可得到判斷矩陣
3.1 構(gòu)造矩陣
p = np.mat('8 7 6 8;7 8 8 7') #每一行代表一個(gè)對(duì)象的指標(biāo)評(píng)分 print(p) #A為自己構(gòu)造的輸入判別矩陣 A = np.array([[1,3,1,1/3],[1/3,1,1/2,1/5],[1,2,1,1/3],[3,5,3,1]]) print(A)返回:
3.2 查看行數(shù)和列數(shù)
#查看行數(shù)和列數(shù) [m,n] = A.shape print(m,n)返回:
3.3 求特征向量
#求特征值和特征向量 V,D = np.linalg.eig(A) print('特征值:') print(V) print('特征向量:') print(D)返回:
3.4 找到最大特征值和最大特征向量
#最大特征值 tzz = np.max(V) print(tzz) #最大特征向量 k=[i for i in range(len(V)) if V[i] == np.max(V)] tzx = -D[:,k] print(tzx)返回:
3.5 計(jì)算權(quán)重
# #賦權(quán)重 quan=np.zeros((n,1)) for i in range(0,n):quan[i]=tzx[i]/np.sum(tzx) Q=quan print(Q)返回:
3.6 一致性檢驗(yàn)
#一致性檢驗(yàn) 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] #判斷是否通過(guò)一致性檢驗(yàn) CR=CI/RI[n-1] if CR>=0.1:print('沒(méi)有通過(guò)一致性檢驗(yàn)\n') else:print('通過(guò)一致性檢驗(yàn)\n')返回:
3.7 計(jì)算評(píng)分
#顯示出所有評(píng)分對(duì)象的評(píng)分值 score=p*Q for i in range(len(score)):print('object_score {}:'.format(i),float(score[i]))返回:
完整代碼
#導(dǎo)入相關(guān)庫(kù) import numpy as np import pandas as pd p = np.mat('8 7 6 8;7 8 8 7') #每一行代表一個(gè)對(duì)象的指標(biāo)評(píng)分 #A為自己構(gòu)造的輸入判別矩陣 A = np.array([[1,3,1,1/3],[1/3,1,1/2,1/5],[1,2,1,1/3],[3,5,3,1]]) #查看行數(shù)和列數(shù) [m,n] = A.shape#求特征值和特征向量 V,D = np.linalg.eig(A) print('特征值:') print(V) print('特征向量:') print(D) #最大特征值 tzz = np.max(V) # print(tzz) #最大特征向量 k=[i for i in range(len(V)) if V[i] == np.max(V)] tzx = -D[:,k] # print(tzx)# #賦權(quán)重 quan=np.zeros((n,1)) for i in range(0,n):quan[i]=tzx[i]/np.sum(tzx) Q=quan # print(Q)#一致性檢驗(yàn) 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] #判斷是否通過(guò)一致性檢驗(yàn) CR=CI/RI[n-1] if CR>=0.1:print('沒(méi)有通過(guò)一致性檢驗(yàn)\n') else:print('通過(guò)一致性檢驗(yàn)\n')#顯示出所有評(píng)分對(duì)象的評(píng)分值 score=p*Q for i in range(len(score)):print('object_score {}:'.format(i),float(score[i]))總結(jié)
以上是生活随笔為你收集整理的层次分析法之python的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: swoole 捕捉php错误,swool
- 下一篇: 不到30的成本,还不赶紧造起来——盘点软