一、層次分析法原理
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名與空間、虛擬空間、營銷軟件、網站建設、硯山網站維護、網站推廣。層次分析法(Analytic Hierarchy Process,AHP)由美國運籌學家托馬斯·塞蒂(T. L. Saaty)于20世紀70年代中期提出,用于確定評價模型中各評價因子/準則的權重,進一步選擇最優方案。該方法仍具有較強的主觀性,判斷/比較矩陣的構造在一定程度上是拍腦門決定的,一致性檢驗只是檢驗拍腦門有沒有自相矛盾得太離譜。
相關的理論參考可見:wiki百科
二、代碼實現
需要借助Python的numpy矩陣運算包,代碼最后用了一個b1矩陣進行了調試,相關代碼如下,具體的實現流程已經用詳細的注釋標明,各位小伙伴有疑問的歡迎留言和我一起討論。
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 """ 算術平均法求權重 """ def cal_weight_by_arithmetic_method(self): # 求矩陣的每列的和 col_sum = np.sum(self.array, axis=0) # 將判斷矩陣按照列歸一化 array_normed = self.array / col_sum # 計算權重向量 array_weight = np.sum(array_normed, axis=1) / self.n # 打印權重向量 print("算術平均法計算得到的權重向量為:\n", array_weight) # 返回權重向量的值 return array_weight """ 幾何平均法求權重 """ 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) # 打印權重向量 print("幾何平均法計算得到的權重向量為:\n", array_weight) # 返回權重向量的值 return array_weight """ 特征值法求權重 """ def cal_weight__by_eigenvalue_method(self): # 將矩陣大特征值對應的特征向量進行歸一化處理就得到了權重 array_weight = self.max_eig_vector / np.sum(self.max_eig_vector) # 打印權重向量 print("特征值法計算得到的權重向量為:\n", array_weight) # 返回權重向量的值 return array_weight if __name__ == "__main__": # 給出判斷矩陣 b = np.array([[1, 1 / 3, 1 / 8], [3, 1, 1 / 3], [8, 3, 1]]) # 算術平均法求權重 weight1 = AHP(b).cal_weight_by_arithmetic_method() # 幾何平均法求權重 weight2 = AHP(b).cal_weight__by_geometric_method() # 特征值法求權重 weight3 = AHP(b).cal_weight__by_eigenvalue_method()
分享題目:python實現AHP算法的方法實例(層次分析法)-創新互聯
文章來源:http://vcdvsql.cn/article32/csedsc.html
成都網站建設公司_創新互聯,為您提供網站排名、定制網站、移動網站建設、商城網站、自適應網站、企業網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯