(1)寂屏、算數(shù)平均值法求權(quán)重
步驟:
- 判斷矩陣按列求和,得到新矩陣a_axis_0_sum
- 把判斷矩陣中的每一個數(shù)都除以列和娜搂,得到新的矩陣b
- 計算新矩陣b行和迁霎,得到新矩陣b_axis_1_sum
- 將b_axis_1_sum每一個值除以總和,獲得權(quán)重W
- 求解最大特征值
- 計算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)重
步驟:
- 將判斷矩陣array的元素按照行相乘得到一個新的列向量
- 將新的向量的每個分量開n次方
- 對列向量求和
- 歸一化處理,得到權(quán)重
- 求解最大特征值
- 計算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)祝拯、特征值法
步驟:
- 求出判斷矩陣array的最大特征值以及特征向量
- 求解最大特征值
- 計算C_R判斷矩陣的一致性,如果檢驗(yàn)通過就繼續(xù)下一步
- 對求出的特征向量進(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)