日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

层次分析法AHP - 代码注释多 - ( 数据建模 Python代码)

發(fā)布時間:2024/7/5 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 层次分析法AHP - 代码注释多 - ( 数据建模 Python代码) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

實際生活中,往往有一些很復雜的系統(tǒng),我們沒辦法直觀草率的確定權(quán)重,比如甲、乙、丙三人競選總統(tǒng),嚴謹?shù)恼f,需要從三人的社交能力、管理能力、經(jīng)濟能力等方面來考慮,在每個方面,三位候選人的得分也不同,那么到底怎么來判斷這三個人的綜合得分呢?AHP可以幫助你。(請忽略現(xiàn)在的選舉都是投票這個現(xiàn)實)

層次分析法是指將一個復雜的多目標決策問題作為一個系統(tǒng),將目標分解為多個目標或準則,進而分解為多指標(或準則、約束)的若干層次,通過定性指標模糊量化方法算出層次單排序(權(quán)數(shù))和總排序,以作為目標(多指標)、多方案優(yōu)化決策的系統(tǒng)方法。

層次分析法是將決策問題按總目標、各層子目標、評價準則直至具體的備投方案的順序分解為不同的層次結(jié)構(gòu),然后用求解判斷矩陣特征向量的辦法,求得每一層次的各元素對上一層次某元素的優(yōu)先權(quán)重,最后再加權(quán)和的方法遞階歸并各備擇方案對總目標的最終權(quán)重,此最終權(quán)重最大者即為最優(yōu)方案。

層次分析法比較適合于具有分層交錯評價指標的目標系統(tǒng),而且目標值又難于定量描述的決策問題。

?

下面是代碼:

因為注釋較多,根本無需一步一步的詳解就能看懂,所以就一下子全放上來了。

#思路: #1.首先輸入每個指標下面對應的判斷矩陣, #該矩陣中的值是通過大數(shù)據(jù)(或者專家)得到的每兩個指標之間的相對重要程度值, #通過AHP計算這些判斷矩陣是否通過一致性的檢驗,通過即合理, #不通過就說明矩陣中的兩指標間的相對重要程度有過分矛盾的地方,import csv import numpy as np import tensorflow as tf#定義一個叫AHP的類 class AHP:def __init__(self,array):#array是每個指標下面對應的判斷矩陣,即原始數(shù)據(jù)self.row = len(array)#計算矩陣的行數(shù)self.col = len(array[0])#計算矩陣的列數(shù)def get_tezheng(self,array):#獲取最大特征值和對應的特征向量te_val ,te_vector = np.linalg.eig(array)#numpy.linalg.eig() 計算矩陣特征值與特征向量list1=list(te_val)#te_val是一個一行三列的矩陣,此處將矩陣轉(zhuǎn)化為列表print("特征值為:",te_val)print("特征向量為:",te_vector)#得到最大特征值對應的特征向量max_val = np.max(list1)#最大特征值index = list1.index(max_val)#最大特征值在列表中的位置max_vector = te_vector[:,index]#通過位置來確定最大特征值對應的特征向量print("最大的特征值:"+str(max_val)+" 對應的特征向量為:"+str(max_vector))return max_val,max_vector def RImatrix(self,n):#建立RI矩陣,該矩陣是AHP中自帶的,類似標桿一樣,除n之外的值不能更改d = {}n1 = [1,2,3,4,5,6,7,8,9]n2 = [0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45]for i in range(n):#獲取n階矩陣對應的RI值d[n1[n]] = n2[n]print("該矩陣在一致性檢測時采用的RI值為:",d[n1[n]])return d[n1[n]]def test_consitstence(self,max_val,RI): #測試一致性,AHP中最重要的一步,用于檢驗判斷矩陣中的數(shù)據(jù)是否自相矛盾CI = (max_val-self.row)/(self.row-1) #AHP中計算CI的標準公式CR = CI/RI #AHP中計算CR的標準公式if CR < 0.10 :print("判斷矩陣的CR值為 " +str(CR) + "通過一致性檢驗")return Trueelse:print("判斷矩陣的CR值為 " +str(CR) + "判斷矩陣未通過一致性檢驗,請重新輸入判斷矩陣")return False def normalize_vector(self,max_vector):#特征向量歸一化vector_after_normalization=[]#生成一個空白列表,用于存放歸一化之后的特征向量的值sum0 = np.sum(max_vector)#將特征向量的每一個元素相加取和for i in range(len(max_vector)):#將特征向量的每一個元素除以和,得到比值,保證向量的每一個元素都在0和1之間,直線歸一化#將歸一化之后的元素依次插入空白列表的尾部vector_after_normalization.append(max_vector[i]/sum0)print("該級指標的權(quán)重矩陣為: "+str(vector_after_normalization))return vector_after_normalization def weightCalculator(self, normalMatrix):#計算最終指標對應的權(quán)重值#layers weight calculations.listlen = len(normalMatrix) -1 #設(shè)置listlen的初始值為normalMatrix最后一個元素的indexlayerWeights = list()#空白權(quán)重列表while listlen > -1:sum = float()#sum的初始值為0.0,并且限制了sum的類型為浮點型for i in normalMatrix:sum+= i[listlen] #求normalMatrix各元素的和sumAverage = round(sum / len(normalMatrix),3)#求normalMatrix各元素的平均值,并保留三位小數(shù)layerWeights.append(sumAverage)#為什么平均值是權(quán)重??????listlen-=1return layerWeightsimport csv import numpy as np import tensorflow as tfdef main():#這里需要確定指標的規(guī)模即多少個一級指標,多少個二級指標,這樣才能確定要計算多少個對比矩陣array1=[]array2=[]def define_structure():#構(gòu)造AHP的層次結(jié)構(gòu)level_structure = [] level = int(input("請輸入指標的級數(shù):"))#輸入比如說這是個三級指標體系level0 = input("請輸入每一級下指標的個數(shù):")level.append(level0)#將列表level0作為一個元素插入到列表level的末尾level2 = []for i in range(level):#每一級指標下有多少具體的指標個數(shù)rate_num = input("請輸入" +str(i)+ "層下指標的個數(shù):")#level2.append(rate_num)for j in range(rate_num ):two_level_for_one = int(input("請輸入第" +str(i)+ " 個一級指標對應的下級指標的個數(shù):"))level_structure.append(two_level_for_one )return level_structuredef creat_matrix(n):n = define_structure()for i in n:length = input("請輸入指標對比矩陣的階數(shù):")#對應指標下共有多少個相互對比的對象length = int(length)#向下取整,若length=3.7,則int(length)=3count=0for i in range(length):#若length=3,則這部分實現(xiàn)的是,輸入矩陣中3*3=9個元素的值for j in range(length):count += 1x = input("請輸入指標對比矩陣的第"+str(count)+ " 個元素:")x = float(x)array1.append(x)#此時的array1還不是一個矩陣,只是包含9個元素的列表#eg:array1=[4,7,8,2,1,13,16,5,11]for i in range(length*length):#將列表array1矩陣化if (i+1)%length==0:#使用i+1是為了避免i=0的情況,因為0%3==0是truearray2.append(array1[i-length+1:i+1])#每3個元素形成一個列表插入到array2的末尾print(array2)#eg:array2=[[4,7,8],[2,1,13],[16,5,11]]矩陣形式array2=np.mat(array2)#NumPy函數(shù)庫中的matrix與MATLAB中matrices等價,由于AHP是比較數(shù)學的東西,所以習慣的mat一下矩陣a=AHP(array2)max_val,max_vector = a.get_tezheng(array2)#獲取最大特征值和對應的特征向量RI= a.RImatrix(length)#獲取length階矩陣對應的RI值flag = a.test_consitstence(max_val,RI)#測試一致性,返回TRUE或者flaseif flag:#如果flag=TRUE,則調(diào)用函數(shù)通過最大特征值對應的特征向量獲取權(quán)重矩陣weight = a.normalize_vector(max_vector)main()

可以拷貝到本地慢慢消化,相信如此完備的注釋會大大的有助于您的學習。

此代碼為多年前的代碼了,最近重新運行一遍,竟然報錯了,不知哪里的問題,還望有經(jīng)驗的大神指正。

?

?

總結(jié)

以上是生活随笔為你收集整理的层次分析法AHP - 代码注释多 - ( 数据建模 Python代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。