層次分析法(AHP)——算數(shù)平均值法华弓、幾何平均值法、特征值法(Python實(shí)現(xiàn)困乒,超詳細(xì)注釋)

(1)寂屏、算數(shù)平均值法求權(quán)重

步驟:

  1. 判斷矩陣按列求和,得到新矩陣a_axis_0_sum
  2. 把判斷矩陣中的每一個數(shù)都除以列和娜搂,得到新的矩陣b
  3. 計算新矩陣b行和迁霎,得到新矩陣b_axis_1_sum
  4. 將b_axis_1_sum每一個值除以總和,獲得權(quán)重W
  5. 求解最大特征值
  6. 計算C_R判斷矩陣的一致性百宇,如果檢驗(yàn)通過就輸出結(jié)果
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 25 21:01:54 2019

@author: lenovo
"""

import numpy as np

#  建立平均隨機(jī)一致性指標(biāo)R.I
RI_dict = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}

def get_w(array):
    # 1考廉、計算出階數(shù) 看這個數(shù)組是幾維的 也就是后面對應(yīng)字典查詢!
    row = array.shape[0]  
    # 2携御、按列求和
    a_axis_0_sum = array.sum(axis=0) 
    # 3昌粤、得到新的矩陣b 就是把每一個數(shù)都除以列和 
    b = array / a_axis_0_sum  
    # 4既绕、計算新矩陣b行和
    b_axis_1_sum = b.sum(axis=1)  
    # 5、將b_axis_1_sum每一個值除以總和
    W = b_axis_1_sum / sum(b_axis_1_sum)
    # 6婚苹、將原始矩陣乘以W
    a_W = np.dot(array, W)
    # 7岸更、求解最大特征值 
    lambda_max = 0
    for i in range(len(a_W)):
        lambda_max += (a_W[i] / W[i])
    lambda_max = lambda_max / len(a_W)      #求最大特征值
    # 8、檢驗(yàn)判斷矩陣的一致性
    C_I = (lambda_max - row) / (row - 1)
    R_I = RI_dict[row] 
    C_R = C_I / R_I 
    if C_R < 0.1:
        print('矩陣 %s 一致性檢驗(yàn)通過' % (array))
        print('判斷矩陣對應(yīng)的指標(biāo)的權(quán)重為:%s' % W)
        print('判斷矩陣對應(yīng)的最大特征值為 %.2f' % lambda_max)
        print('大功告成2采T醮丁!')
        return W
    else:
        print('矩陣 %s 一致性檢驗(yàn)未通過廓译,需要重新進(jìn)行調(diào)整判斷矩陣' % (array))
    
def main(array):
    if type(array) is np.ndarray:
        return get_w(array)
    else:
        print('請輸入正確的numpy對象')


if __name__ == '__main__':
    a = np.array([[1, 1 / 3, 1 / 8], [3, 1, 1 / 3], [8, 3, 1]])
#    b = np.array([[1, 3, 6], [1 / 3, 1, 4], [1 / 5, 1 / 2, 1]])
#    c = np.array([[1, 1, 3], [1, 1, 3], [1 / 3, 1 / 3, 1]])
#    d = np.array([[1, 3, 4], [1 / 3, 1, 1], [1 / 4, 1, 1]])
#    e = np.array([[1, 2, 7, 5, 5], [1 / 2, 1, 4, 3, 3], [1 / 7, 1 / 4, 1, 1 / 2, 1 / 3], [1 / 5, 1 / 3, 2, 1, 1], [1 / 5, 1 / 3, 3, 1, 1]])
#    f = np.array([[1, 4, 1 / 2], [1 / 4, 1, 1 / 4], [2, 4, 1]])
    
    main(a)
#    main(b)
#    main(c)
#    main(d)
#    main(e)
#    main(f)

(2)评肆、幾何平均值法求權(quán)重

步驟:

  1. 將判斷矩陣array的元素按照行相乘得到一個新的列向量
  2. 將新的向量的每個分量開n次方
  3. 對列向量求和
  4. 歸一化處理,得到權(quán)重
  5. 求解最大特征值
  6. 計算C_R判斷矩陣的一致性非区,如果檢驗(yàn)通過就輸出結(jié)果
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 25 21:01:54 2019

@author: lenovo
"""

import numpy as np

#  建立平均隨機(jī)一致性指標(biāo)R.I
RI_dict = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}

def get_w(array):
    row = array.shape[0]    #計算個數(shù)
    x_list = np.prod(array,axis = 1)        #axis=1瓜挽,將array的元素按照行相乘得到一個新的列向量
    y_list = np.power(x_list, 1/np.size(array,1))   #將新的向量的每個分量開n次方
    y_sum = y_list.sum(axis=0)      #對列向量求和
    answer_sum = y_list/y_sum       #歸一化處理,得到權(quán)重
    a,b=np.linalg.eig(array)        #a是特征值數(shù)組征绸,b是特征值向量
    lambda_max=np.max(a)            #求最大特征值
    # 8久橙、檢驗(yàn)判斷矩陣的一致性
    C_I = (lambda_max - row) / (row - 1)
    R_I = RI_dict[row]
    C_R = C_I / R_I 
    if C_R < 0.1:
        print('矩陣 %s 一致性檢驗(yàn)通過' % (array))
        print('判斷矩陣對應(yīng)的指標(biāo)的權(quán)重為:%s' % answer_sum)
        print('判斷矩陣對應(yīng)的最大特征值為 %.2f' % lambda_max)
        print('大功告成!9艿 淆衷!')
        return answer_sum
    else:
        print('矩陣 %s 一致性檢驗(yàn)未通過,需要重新進(jìn)行調(diào)整判斷矩陣' % (array))
    
def main(array):
    if type(array) is np.ndarray:
        return get_w(array)
    else:
        print('請輸入正確的numpy對象')


if __name__ == '__main__':
    # 由于地方問題渤弛,矩陣我就寫成一行了
    # 檢驗(yàn)以下判斷矩陣的一致性并輸出權(quán)重
    a = np.array([[1,2,5], [1/2,1,2], [1/5,1/2,1]])
    b = np.array([[1, 3, 6], [1 / 3, 1, 4], [1 / 5, 1 / 2, 1]])
    c = np.array([[1, 1, 3], [1, 1, 3], [1 / 3, 1 / 3, 1]])
    d = np.array([[1, 3, 4], [1 / 3, 1, 1], [1 / 4, 1, 1]])
    e = np.array([[1, 2, 7, 5, 5], [1 / 2, 1, 4, 3, 3], [1 / 7, 1 / 4, 1, 1 / 2, 1 / 3], [1 / 5, 1 / 3, 2, 1, 1], [1 / 5, 1 / 3, 3, 1, 1]])
    f = np.array([[1, 4, 1 / 2], [1 / 4, 1, 1 / 4], [2, 4, 1]])
    
    main(a)
#    main(b)
#    main(c)
#    main(d)
#    main(e)
#    main(f)


(2)祝拯、特征值法

步驟:

  1. 求出判斷矩陣array的最大特征值以及特征向量
  2. 求解最大特征值
  3. 計算C_R判斷矩陣的一致性,如果檢驗(yàn)通過就繼續(xù)下一步
  4. 對求出的特征向量進(jìn)行歸一化處理她肯,即可得到權(quán)重
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 25 20:42:58 2019

@author: lenovo
"""

import numpy as np

#  建立平均隨機(jī)一致性指標(biāo)R.I
RI_dict = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}

def get_w(array):
    row = array.shape[0]    #計算個數(shù)
    a,b=np.linalg.eig(array)        #a是特征值數(shù)組佳头,b是特征值矩陣
    lambda_max=np.max(a)            #求最大特征值
     #8、檢驗(yàn)判斷矩陣的一致性
    C_I = (lambda_max - row) / (row - 1)
    R_I = RI_dict[row]
    C_R = C_I / R_I 
    if C_R < 0.1:
        x = b[:,0].sum(axis=0)      #對列向量求和晴氨,對于第一列求和
        y = b[:,0]/x            #第一列進(jìn)行歸一化處理
        print('矩陣 %s 一致性檢驗(yàn)通過' % (array))
        print('判斷矩陣對應(yīng)的指標(biāo)的權(quán)重為:%s' % y)
        print('判斷矩陣對應(yīng)的最大特征值為 %.2f' % lambda_max)
        print('大功告成?导巍!籽前!')
        return y
    else:
        print('矩陣 %s 一致性檢驗(yàn)未通過凄鼻,需要重新進(jìn)行調(diào)整判斷矩陣' % (array))
    
def main(array):
    if type(array) is np.ndarray:
        return get_w(array)
    else:
        print('請輸入正確的numpy對象')


if __name__ == '__main__':
    # 由于地方問題,矩陣我就寫成一行了
    # 檢驗(yàn)以下判斷矩陣的一致性并輸出權(quán)重
    a = np.array([[1,2,5], [1/2,1,2], [1/5,1/2,1]])
#    b = np.array([[1, 3, 6], [1 / 3, 1, 4], [1 / 5, 1 / 2, 1]])
#    c = np.array([[1, 1, 3], [1, 1, 3], [1 / 3, 1 / 3, 1]])
#    d = np.array([[1, 3, 4], [1 / 3, 1, 1], [1 / 4, 1, 1]])
#    e = np.array([[1, 2, 7, 5, 5], [1 / 2, 1, 4, 3, 3], [1 / 7, 1 / 4, 1, 1 / 2, 1 / 3], [1 / 5, 1 / 3, 2, 1, 1], [1 / 5, 1 / 3, 3, 1, 1]])
#    f = np.array([[1, 4, 1 / 2], [1 / 4, 1, 1 / 4], [2, 4, 1]])
    
    main(a)
#    main(b)
#    main(c)
#    main(d)
#    main(e)
#    main(f)


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末聚假,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子闰非,更是在濱河造成了極大的恐慌膘格,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件财松,死亡現(xiàn)場離奇詭異瘪贱,居然都是意外死亡纱控,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門菜秦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甜害,“玉大人,你說我怎么就攤上這事球昨《辏” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵主慰,是天一觀的道長嚣州。 經(jīng)常有香客問我,道長共螺,這世上最難降的妖魔是什么该肴? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮藐不,結(jié)果婚禮上匀哄,老公的妹妹穿的比我還像新娘。我一直安慰自己雏蛮,他們只是感情好涎嚼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著底扳,像睡著了一般铸抑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衷模,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天鹊汛,我揣著相機(jī)與錄音,去河邊找鬼阱冶。 笑死刁憋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的木蹬。 我是一名探鬼主播至耻,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镊叁!你這毒婦竟也來了尘颓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤晦譬,失蹤者是張志新(化名)和其女友劉穎疤苹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敛腌,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卧土,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年惫皱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尤莺。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡旅敷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颤霎,到底是詐尸還是另有隱情媳谁,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布捷绑,位于F島的核電站韩脑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粹污。R本人自食惡果不足惜段多,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壮吩。 院中可真熱鬧进苍,春花似錦、人聲如沸鸭叙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沈贝。三九已至杠人,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宋下,已是汗流浹背嗡善。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留学歧,地道東北人罩引。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像枝笨,于是被迫代替她去往敵國和親袁铐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容