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