python 層次分析(AHP)

文章目錄

  • 一、算法原理
  • 二、案例分析
    • 2.1 構建指標層判斷矩陣
    • 2.2 求各指標權重
      • 2.2.1 算術平均法(和積法)
      • 2.2.2 幾何平均法(方根法)
    • 2.3 一致性檢驗
      • 2.3.1 求解最大特征根值
      • 2.3.2 求解CI、RI、CR值
      • 2.3.3 一致性判斷
    • 2.4 分別求解方案層權重向量及一致性檢驗
      • 2.4.1 景色
      • 2.4.2 吃住
      • 2.4.3 價格
      • 2.4.4 人文
    • 2.5 計算各方案得分
  • 三、python 代碼
    • 3.1 和積法計算權重
    • 3.2 方根法計算權重
    • 3.3 python庫 np.linalg.eig

一、算法原理

  • 層次分析法(analytic hierarchy process),簡稱AHP,是指將與決策總是有關的元素分解成目標、準則、方案等層次,在此基礎之上進行定性和定量分析的決策方法。該方法是美國運籌學家匹茨堡大學教授薩蒂于20世紀70年代初,在為美國國防部研究"根據各個工業部門對國家福利的貢獻大小而進行電力分配"課題時,應用網絡系統理論和多目標綜合評價方法,提出的一種層次權重決策分析方法

  • 傳統定性分析方法類似專家打分、專家判斷等,僅能將指標簡單地劃分為幾個層級(類似非常重要、比較重要、一般、比較不重要、非常不重要),這樣導致部分存在差別但是不大的指標得到了同樣的權重,受主觀因素影響,無法對最終決策做出更好的幫助。層次分析法將不同指標間一一比對,主觀與客觀相結合,很好地解決了以上問題。

  • 判斷矩陣量化值參照表:

因素i比因素j量化值
同等重要1
稍微重要3
較強重要5
強烈重要7
極端重要9
兩相鄰判斷的中間值2,4,6,8
倒數假設因素i相比因素j重要程度量化值為3,相反就是1/3

二、案例分析

目的:選擇某個城市旅游

方案:南京、桂林、三亞

考慮因素:景色、吃住、價格、人文
在這里插入圖片描述

2.1 構建指標層判斷矩陣

在這里插入圖片描述
構建判斷矩陣,理論上需要專家打分。

2.2 求各指標權重

2.2.1 算術平均法(和積法)

  1. 按列求和:如 1 + 4 + 1 / 2 + 3 = 8.5 1+4+1/2+3 = 8.5 1+4+1/2+3=8.5
    在這里插入圖片描述

  2. 將指標層判斷矩陣按列歸一化(即按列求占比),如:
    0.12 = 1 / 8.5 0.12 = 1 / 8.5 0.12=1/8.5
    0.47 = 4 / 8.5 0.47 = 4 / 8.5 0.47=4/8.5
    0.06 = 1 / 2 / 8.5 0.06 = 1/2 / 8.5 0.06=1/2/8.5
    0.35 = 3 / 8.5 0.35 = 3 / 8.5 0.35=3/8.5
    在這里插入圖片描述

  3. 將歸一化后的矩陣按行求平均,得到權重向量w
    在這里插入圖片描述

2.2.2 幾何平均法(方根法)

  1. 每行各元素相乘(行乘積),如 1 ? 1 / 4 ? 2 ? 1 / 3 = 0.1667 1*1/4*2*1/3 = 0.1667 1?1/4?2?1/3=0.1667
    在這里插入圖片描述

  2. 對乘積列每個元素開n次方(n為矩陣階數,此處n=4),如 0.1667 4 = 0.6389 \sqrt[4]{0.1667}=0.6389 40.1667 ?=0.6389.
    在這里插入圖片描述

  3. 然后對開方列求列占比,得到權重向量w,如 0.1171 = 0.6389 / 5.4566 0.1171=0.6389 / 5.4566 0.1171=0.6389/5.4566.
    在這里插入圖片描述

2.3 一致性檢驗

2.3.1 求解最大特征根值

得到權重向量后,可以計算出原判斷矩陣的最大特征根值,公式為:

λ m a x = 1 n ∑ i = 1 n ( A W i ) W i \lambda_{max}=\dfrac{1}{n}\sum_{i=1}^{n}{\dfrac{(AW_{i})}{W_{i}}} λmax?=n1?i=1n?Wi?(AWi?)?

其中,n為矩陣階數,此處n=4。

求解步驟(以和積法求解權重為例)

  1. A W AW AW,其中 0.4705 = 1 ? 0.1176 + 1 4 ? 0.5175 + 2 ? 0.0611 + 1 3 ? 0.3038 0.4705=1*0.1176+\dfrac{1}{4}*0.5175+2*0.0611+\dfrac{1}{3}*0.3038 0.4705=1?0.1176+41??0.5175+2?0.0611+31??0.3038
    在這里插入圖片描述

  2. A W W \dfrac{AW}{W} WAW?,如 4.0016 = 0.4705 / 0.1176 4.0016=0.4705/0.1176 4.0016=0.4705/0.1176
    在這里插入圖片描述

  3. 1 n s u m ( A W W ) \dfrac{1}{n}sum(\dfrac{AW}{W}) n1?sum(WAW?),此處 s u m ( A W W ) = 16.0621 sum(\dfrac{AW}{W})=16.0621 sum(WAW?)=16.0621
    在這里插入圖片描述

  4. 綜上求得 λ m a x = 1 4 ? 16.0621 = 4.0155 \lambda_{max}=\dfrac{1}{4}*16.0621=4.0155 λmax?=41??16.0621=4.0155

2.3.2 求解CI、RI、CR值

  • 計算CI

C I = λ ? n n ? 1 = 4.0155 ? 4 4 ? 1 = 0.0052 CI=\dfrac{\lambda-n}{n-1}=\dfrac{4.0155-4}{4-1}=0.0052 CI=n?1λ?n?=4?14.0155?4?=0.0052

  • 計算RI

根據查表,得知 R I RI RI為0.89

img

  • 計算CR

C R = C I R I = 0.0052 0.89 = 0.0058 CR=\dfrac{CI}{RI}=\dfrac{0.0052}{0.89}=0.0058 CR=RICI?=0.890.0052?=0.0058

2.3.3 一致性判斷

CR = 0.0058 < 0.1,即通過一致性檢驗。

2.4 分別求解方案層權重向量及一致性檢驗

2.4.1 景色

  1. 構建判斷矩陣
    在這里插入圖片描述

  2. 計算權重向量以及一致性檢驗.(步驟如上文,為了簡便文章,本次計算采用python代碼,以和積法求解權重,下文將詳細介紹)
    在這里插入圖片描述

2.4.2 吃住

  1. 構建判斷矩陣
    在這里插入圖片描述

  2. 計算權重向量以及一致性檢驗.(步驟如上文,為了簡便文章,本次計算采用python代碼,以和積法求解權重,下文將詳細介紹)
    在這里插入圖片描述

2.4.3 價格

  1. 構建判斷矩陣
    在這里插入圖片描述

  2. 計算權重向量以及一致性檢驗.(步驟如上文,為了簡便文章,本次計算采用python代碼,以和積法求解權重,下文將詳細介紹)
    在這里插入圖片描述

2.4.4 人文

  1. 構建判斷矩陣
    在這里插入圖片描述

  2. 計算權重向量以及一致性檢驗.(步驟如上文,為了簡便文章,本次計算采用python代碼,以和積法求解權重,下文將詳細介紹)
    在這里插入圖片描述

2.5 計算各方案得分

綜合得分 = s u m ( 單項得分 ? 對應指標權重 ) 綜合得分=sum(單項得分*對應指標權重) 綜合得分=sum(單項得分?對應指標權重)
在這里插入圖片描述

可以看出,南京得分0.5675為最高,最終方案應選擇南京。

三、python 代碼

3.1 和積法計算權重

import numpy as np
import pandas as pd''' 層次分析法判斷矩陣權重向量計算--和積法 '''
def get_w_anc(factors_matrix):# RI字典RI_dict = {1:0,2:0,3:0.52,4:0.89,5:1.12,6:1.26,7:1.36,8:1.41,9:1.46,10:1.49,11:1.52,12:1.54,13:1.56,14:1.58,15:1.59}# 矩陣階數shape = factors_matrix.shape[0]# 按列求和column_sum_vector = np.sum(factors_matrix, axis=0)# 指標層判斷矩陣歸一化normalization_matrix = factors_matrix / column_sum_vector# 按行求歸一化后的判斷矩陣平均值,得到權重WW_vector = np.mean(normalization_matrix, axis=1)# 原判斷矩陣 乘以 權重向量AW_vector = np.dot(factors_matrix, W_vector)# 原判斷矩陣 ?? 權重向量 / 權重AW_w = AW_vector / W_vector# 求特征值lamda = sum(AW_w) / shape# 求CI值CI = (lamda - shape) / (shape - 1)# 求CR值CR = CI / RI_dict[shape]print("權重向量為:",list(W_vector))print("最大特征值:",lamda)print("CI值為:",CI)print("RI值為:",RI_dict[shape])print("CR值為:",CR)if CR < 0.1:print('矩陣通過一致性檢驗')else:print('矩陣未通過一致性檢驗')print("---------------------------")return W_vectorif __name__ == "__main__":# 指標層判斷矩陣factors_matrix = np.array([[1,1/4,2,1/3],[4,1,8,2],[1/2,1/8,1,1/5],[3,1/2,5,1]])# 景色view_matrix = np.array([[1,1/4,2],[4,1,8],[1/2,1/8,1]])# 吃住board_matrix = np.array([[1,5,2],[1/5,1,1/2],[1/2,2,1]])# 價格price_matrix = np.array([[1,1/3,2],[3,1,5],[1/2,1/5,1]])# 人文humanity_matrix = np.array([[1,5,7],[1/5,1,2],[1/7,1/2,1]])w_A = get_w_anc(factors_matrix)print("景色:")w_view = get_w_anc(view_matrix)print("吃住:")w_board = get_w_anc(board_matrix)print("價格:")w_price = get_w_anc(price_matrix)print("人文:")w_humanity = get_w_anc(humanity_matrix)# 將景色、吃住、價格、人文權重向量合并w_B = np.vstack((w_view, w_board,w_price,w_humanity))# 求出最終得分score = np.dot(w_A,w_B)print("最終得分向量:",score)
  • 運行結果
    在這里插入圖片描述

3.2 方根法計算權重

這里只列出計算權重部分

  • 原指標層判斷矩陣
# 指標層判斷矩陣
factors_matrix = np.array([[1,1/4,2,1/3],[4,1,8,2],[1/2,1/8,1,1/5],[3,1/2,5,1]
])
  1. 求行乘積
# 求行乘積
array1 = factors_matrix.prod(axis=1, keepdims=True)
  1. 對乘積列每個元素開n次方(n為矩陣階數,此處n=4)
n = 4
array2 = np.power(array1, 1/n)
  1. 對開方列求列占比,得到權重向量w
array2 / np.sum(array2)

3.3 python庫 np.linalg.eig

# 計算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(factors_matrix)# 需要注意的是,對于一個nxn的矩陣,最多可能有n個特征值和特征向量,因此,需要挑選出最大的特征值進行一致性判斷
# 找到最大特征值的索引
max_eigenvalue_index = np.argmax(eigenvalues)# 提取最大特征值和對應的特征向量
max_eigenvalue = eigenvalues[max_eigenvalue_index]
max_eigenvector = eigenvectors[:, max_eigenvalue_index]print("最大特征值:", max_eigenvalue)
print("對應的特征向量:", max_eigenvector)

在這里插入圖片描述

  • 參考:層次分析法(AHP)步驟詳解-嗶哩嗶哩
  • 參考:層次分析法原理及計算過程詳解)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696966.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696966.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696966.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用Ubuntu22.04啟動U盤對電腦磁盤進行格式化

概要&#xff1a; 本篇演示利用Ubuntu22.04啟動U盤的Try Ubuntu模式對電腦磁盤進行格式化 一、說明 1、電腦 筆者的電腦品牌是acer(宏碁/宏基) 開機按F2進入BIOS 開機按F12進入Boot Manager 2、Ubuntu22.04啟動U盤 制作方法參考筆者的文章&#xff1a; Ubuntu制作Ubun…

【OpenAI官方課程】第五課:ChatGPT文本轉換Transforming

歡迎來到ChatGPT 開發人員提示工程課程&#xff08;ChatGPT Prompt Engineering for Developers&#xff09;&#xff01;本課程將教您如何通過OpenAI API有效地利用大型語言模型&#xff08;LLM&#xff09;來創建強大的應用程序。 本課程由OpenAI 的Isa Fulford和 DeepLearn…

緩存篇—緩存雪崩

什么是緩存雪崩 通常我們為了保證緩存中的數據與數據庫中的數據一致性&#xff0c;會給 Redis 里的數據設置過期時間&#xff0c;當緩存數據過期后&#xff0c;用戶訪問的數據如果不在緩存里&#xff0c;業務系統需要重新生成緩存&#xff0c;因此就會訪問數據庫&#xff0c;并…

QEMU源碼全解析 —— virtio(22)

接前一篇文章&#xff1a;QEMU源碼全解析 —— virtio&#xff08;21&#xff09; 前幾回講解了virtio驅動的加載。本回開始講解virtio驅動的初始化。 在講解virtio驅動的初始化之前&#xff0c;先要介紹virtio配置的函數集合變量virtio_pci_config_ops。實際上前文書也有提到…

c# HttpCookie操作,建立cookie工具類

HttpCookie 是一個在.NET Framework中用于管理和操作HTTP Cookie的類。它提供了一種方便的方式來創建、設置、讀取和刪除Cookie。 Cookie是一種在客戶端和服務器之間傳遞數據的機制&#xff0c;用于跟蹤用戶的會話狀態和存儲用戶相關的信息。它通常由服務器發送給客戶端&#…

萬字干貨-京東零售數據資產能力升級與實踐

開篇 京東自營和商家自運營模式&#xff0c;以及伴隨的多種運營視角、多種組合計算、多種銷售屬性等數據維度&#xff0c;相較于行業同等量級&#xff0c;數據處理的難度與復雜度都顯著增加。如何從海量的數據模型與數據指標中提升檢索數據的效率&#xff0c;降低數據存算的成…

parallels配置centos虛擬環境

parallels Desktop M1/M2芯片Parallels Desktop 19虛擬機安裝使用教程&#xff08;超詳細&#xff09;-CSDN博客 下鏡像記得找和mac芯片匹配的 安裝就選第一個centos7不要選第二個 安裝有問題就選回退重啟 parallel desktop 18/19安裝centos7.2009教程_parallels desktop 19…

echarts多y軸樣式重疊問題

1、主要屬性設置 yAxis: [{//y軸1nameTextStyle: {align: "right",padding: 0}},{//y軸2nameTextStyle: {align: "left",padding: 0}},{//y軸3axisLabel: {margin: 50},nameTextStyle: {align: "left",padding: [0, 0, 0, 50]},axisPointer: {l…

Python Web開發記錄 Day2:CSS

名人說&#xff1a;莫道桑榆晚&#xff0c;為霞尚滿天。——劉禹錫&#xff08;劉夢得&#xff0c;詩豪&#xff09; 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄 二、CSS1、CSS-初始入門①快速了解②CSS應用方式…

【C語言】sizeof()函數

前言 sizeof函數用于獲取數據類型或變量在內存中所占的字節數。 sizeof函數返回的是編譯時確定的值&#xff0c;不會計算動態分配的內存大小。 sizeof函數可以用于多種類型的數據&#xff0c;包括數組、指針、結構體、枚舉等。 1.數組 int arr[5];printf("%zu ", siz…

文件上傳與下載

文件上傳與下載 1. 文件上傳 為了能上傳文件&#xff0c;必須將表單的 method 設置為 POST&#xff0c;并將 enctype 設置為 multipart/form-data 。 有兩種實現文件上傳的方式&#xff1a; 底層使用 Apache Commons FileUpload 包 底層使用 Servlet 3.1 內置的文件上傳功能…

如何計算文件哈希值(MD5值)

生成文件hash值的用途 哈希值&#xff0c;即HASH值&#xff0c;是通過對文件內容進行加密運算得到的一組二進制值&#xff0c;主要用途是用于文件校驗或簽名。正是因為這樣的特點&#xff0c;它常常用來判斷兩個文件是否相同。 比如&#xff0c;從網絡上下載某個文件&#xff0…

MySQL主從同步

MySQL主從同步&#xff08;復制&#xff09;是一種數據復制技術&#xff0c;用于將數據從一個MySQL數據庫&#xff08;稱為“主”&#xff09;復制到另一個或多個MySQL數據庫&#xff08;稱為“從”&#xff09;。這個過程通常用于負載均衡、數據備份、災難恢復和其他類似場景。…

C++ Primer Plus 筆記(持續更新)

編譯器的正解 數據&#xff0b;算法程序 賦值從右向左進行 cin&#xff0c;cout的本質也是對象 類和對象的解釋

centerOS docker搭建flowable,流程引擎

1、準備一個mysql數據庫&#xff0c;庫名為flowable 2、mysql驅動下載&#xff0c;下載地址為&#xff1a; https://mvnrepository.com/artifact/mysql/mysql-connector-java此處使用的是8.0.22版本的驅動&#xff0c;且數據庫必須使用版本8&#xff0c;否則第二次啟動報錯 3、…

OpenAI文生視頻大模型Sora概述

Sora&#xff0c;美國人工智能研究公司OpenAI發布的人工智能文生視頻大模型&#xff08;但OpenAI并未單純將其視為視頻模型&#xff0c;而是作為“世界模擬器” &#xff09;&#xff0c;于2024年2月15日&#xff08;美國當地時間&#xff09;正式對外發布。 Sora可以根據用戶…

samber/lo 庫的使用方法:type

samber/lo 庫的使用方法&#xff1a;type samber/lo 是一個 Go 語言庫&#xff0c;提供了一些常用的集合操作函數&#xff0c;如 Filter、Map 和 FilterMap。 這個庫函數太多&#xff0c;因此我決定按照功能分別介紹&#xff0c;本文介紹的是 samber/lo 庫中type相關的函數。匯…

Redis中的AOF重寫到底是怎么一回事

首先我們知道AOF和RDB都是Redis持久化的方法。RDB是Redis DB&#xff0c;一種二進制數據格式&#xff0c;這樣就是相當于全量保存數據快照了。AOF則是保存命令&#xff0c;然后恢復的時候重放命令。 AOF隨著時間推移&#xff0c;會越來越大&#xff0c;因為不斷往里追加命令。…

哪些行業適合做小程序?零售電商、餐飲娛樂、旅游酒店、教育生活、醫療保健、金融社交、體育健身、房產汽車、企管等,你的行業在其中么?

引言 在當今數字化時代&#xff0c;小程序成為了各行各業快速發展的數字工具之一。它的輕便、靈活的特性使得小程序在多個行業中找到了廣泛的應用。本文將探討哪些行業適合開發小程序&#xff0c;并介紹各行業中小程序的具體應用。 一、零售和電商 在當今數字化的商業環境中&…

C++ RAII

RAII定義 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是C編程中的一種重要的資源管理技術。它的核心思想是&#xff1a;資源的獲取應該在對象的構造階段進行&#xff0c;而資源的釋放則應該在對象的析構階段進行。通過利用C對象的生命周期和析構函數…