python實現(xiàn)AHP算法的方法實例(層次分析法)
一、層次分析法原理
層次分析法(Analytic Hierarchy Process,AHP)由美國運籌學家托馬斯·塞蒂(T. L. Saaty)于20世紀70年代中期提出,用于確定評價模型中各評價因子/準則的權(quán)重,進一步選擇最優(yōu)方案。該方法仍具有較強的主觀性,判斷/比較矩陣的構(gòu)造在一定程度上是拍腦門決定的,一致性檢驗只是檢驗拍腦門有沒有自相矛盾得太離譜。
相關的理論參考可見:wiki百科
二、代碼實現(xiàn)
需要借助Python的numpy矩陣運算包,代碼最后用了一個b1矩陣進行了調(diào)試,相關代碼如下,具體的實現(xiàn)流程已經(jīng)用詳細的注釋標明,各位小伙伴有疑問的歡迎留言和我一起討論。
import numpy as np
class AHP:
"""
相關信息的傳入和準備
"""
def __init__(self, array):
## 記錄矩陣相關信息
self.array = array
## 記錄矩陣大小
self.n = array.shape[0]
# 初始化RI值,用于一致性檢驗
self.RI_list = [0, 0, 0.52, 0.89, 1.12, 1.26, 1.36, 1.41, 1.46, 1.49, 1.52, 1.54, 1.56, 1.58,
1.59]
# 矩陣的特征值和特征向量
self.eig_val, self.eig_vector = np.linalg.eig(self.array)
# 矩陣的最大特征值
self.max_eig_val = np.max(self.eig_val)
# 矩陣最大特征值對應的特征向量
self.max_eig_vector = self.eig_vector[:, np.argmax(self.eig_val)].real
# 矩陣的一致性指標CI
self.CI_val = (self.max_eig_val - self.n) / (self.n - 1)
# 矩陣的一致性比例CR
self.CR_val = self.CI_val / (self.RI_list[self.n - 1])
"""
一致性判斷
"""
def test_consist(self):
# 打印矩陣的一致性指標CI和一致性比例CR
print("判斷矩陣的CI值為:" + str(self.CI_val))
print("判斷矩陣的CR值為:" + str(self.CR_val))
# 進行一致性檢驗判斷
if self.n == 2: # 當只有兩個子因素的情況
print("僅包含兩個子因素,不存在一致性問題")
else:
if self.CR_val < 0.1: # CR值小于0.1,可以通過一致性檢驗
print("判斷矩陣的CR值為" + str(self.CR_val) + ",通過一致性檢驗")
return True
else: # CR值大于0.1, 一致性檢驗不通過
print("判斷矩陣的CR值為" + str(self.CR_val) + "未通過一致性檢驗")
return False
"""
算術(shù)平均法求權(quán)重
"""
def cal_weight_by_arithmetic_method(self):
# 求矩陣的每列的和
col_sum = np.sum(self.array, axis=0)
# 將判斷矩陣按照列歸一化
array_normed = self.array / col_sum
# 計算權(quán)重向量
array_weight = np.sum(array_normed, axis=1) / self.n
# 打印權(quán)重向量
print("算術(shù)平均法計算得到的權(quán)重向量為:\n", array_weight)
# 返回權(quán)重向量的值
return array_weight
"""
幾何平均法求權(quán)重
"""
def cal_weight__by_geometric_method(self):
# 求矩陣的每列的積
col_product = np.product(self.array, axis=0)
# 將得到的積向量的每個分量進行開n次方
array_power = np.power(col_product, 1 / self.n)
# 將列向量歸一化
array_weight = array_power / np.sum(array_power)
# 打印權(quán)重向量
print("幾何平均法計算得到的權(quán)重向量為:\n", array_weight)
# 返回權(quán)重向量的值
return array_weight
"""
特征值法求權(quán)重
"""
def cal_weight__by_eigenvalue_method(self):
# 將矩陣最大特征值對應的特征向量進行歸一化處理就得到了權(quán)重
array_weight = self.max_eig_vector / np.sum(self.max_eig_vector)
# 打印權(quán)重向量
print("特征值法計算得到的權(quán)重向量為:\n", array_weight)
# 返回權(quán)重向量的值
return array_weight
if __name__ == "__main__":
# 給出判斷矩陣
b = np.array([[1, 1 / 3, 1 / 8], [3, 1, 1 / 3], [8, 3, 1]])
# 算術(shù)平均法求權(quán)重
weight1 = AHP(b).cal_weight_by_arithmetic_method()
# 幾何平均法求權(quán)重
weight2 = AHP(b).cal_weight__by_geometric_method()
# 特征值法求權(quán)重
weight3 = AHP(b).cal_weight__by_eigenvalue_method()
總結(jié)
到此這篇關于python實現(xiàn)AHP算法(層次分析法)的文章就介紹到這了,更多相關python AHP算法(層次分析法)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
PyQt5實現(xiàn)QLineEdit添加clicked信號的方法
今天小編就為大家分享一篇PyQt5實現(xiàn)QLineEdit添加clicked信號的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
4種方法教你利用Python發(fā)現(xiàn)數(shù)據(jù)的規(guī)律
發(fā)現(xiàn)數(shù)據(jù)的規(guī)律是數(shù)據(jù)分析和數(shù)據(jù)科學中非常重要的一個步驟。這篇文章主要給大家整理了4個可以發(fā)現(xiàn)數(shù)據(jù)規(guī)律的方法,希望對大家有所幫助2023-03-03
python-docx讀取模板文檔并填充數(shù)據(jù)
python-docx?是開源的一個?Python?庫,用于讀取、創(chuàng)建和更新Microsoft?Word?2007+(.docx)文件,下面我們就來看看如何利用python-docx讀取模板文檔并填充數(shù)據(jù)吧2024-11-11
Python jieba 中文分詞與詞頻統(tǒng)計的操作
這篇文章主要介紹了Python jieba 中文分詞與詞頻統(tǒng)計的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

