R語言:TOPSIS綜合評價法進行多屬性最優方案選擇
來自專欄數據老黃2 人贊了文章
TOPSIS綜合評價法
是進行多個對象選擇排序的方法,其通過計算各對像與最優方案、最劣方案的相對距離進行排序,它用於解決多對象多屬性決策問題。本文主要是介紹在R語言
中如何用TOPSIS綜合評價法
進行多對象選擇決策。
TOPSIS綜合評價法
一般地,TOPSIS綜合評價法
主要包含兩個步驟:計算權重和計算相對接近度。如需詳細了解TOPSIS綜合評價法
的原理和方法,請自行百度,網上有許多非常詳盡的原理說明和案例講解。
1、計算權重
根據熵權法確定各個指標的權重;計算各指標信息熵,指標的信息熵越小,則該指標表達信息的不確定性小,在綜合評價中對決策的幫助更大,即應該有較大的權重。熵權法是一種客觀的賦予權重的方法,它通過各個指標所提供的信息不確定性來確定各指標的權重
2、計算相對接近度
根據權重加權規範化指標屬性矩陣後,確定正理想方案Amax和負理想方案 Amin,計算各備選方案與Amax 、Amin的距離,以評估與正負理想方案的接近程度,根據相對接近度確定優先次序。其中計算距離一般使用歐式距離。
R語言實現過程
按照慣例,導入需要使用的包data.table
、plyr
。然後載入使用的數據,我們簡單看一下案例數據情況。
dataset <- fread("/R/TOPSIS/dataset.csv")
其中的欄位target即為目標欄位,我們需要對其含有的8個方案(A~H)進行綜合評價排序,選擇其中的最優方案。該數據集中的指標均為正向指標。正向指標表示指標的數值越高越好,負向指標則表示指標的數值越低越好,這決定了該指標在進行權重計算時的處理方式。
1、計算權重
計算權重的第一步是計算各個指標的熵值,由於我們用到的指標均是正向指標,所以選擇自定義函數entropy_positive
即可。如果指標既存在正向指標又存在負向指標,則可分開進行計算。自定義函數情況如下:
#正向指標計算熵值entropy_positive <- function(x){ #指標歸一化 y = (x -min(x)) / (max(x) - min(x)) #計算各指標值的比重 p = y / sum(y) #計算各指標的熵值 entropy = -1/log(length(x)) * sum(ifelse(p == 0,0,p *log(p)))}#負向指標計算熵值entropy_negative <- function(x){ #指標歸一化 y = (max(x) -x) / (max(x) - min(x)) #計算各指標值的比重 p = y/ sum(y) #計算各指標的熵值 entropy = -1/log(length(x)) * sum(ifelse(p == 0,0,p *log(p)))}
調用函數並完成權重的計算,x1~x8的權重依次為:11.10%、6.61%、28.19%、7.08%、11.88%、8.11%、11.94%、15.09%,計算過程如下:
entropy_data <- colwise(entropy_positive)(dataset[,-9])entropy_weight <- (1 - entropy_data)/ sum(1 -entropy_data)
2、計算相對接近度
在將指標向量規範化後,利用熵值法得到的權重計算得到加權標準化矩陣,然後提取正理想方案和負理想方案並計算出各個方案距離正負理想方案的距離,最終根據計算得到距離比值進行排序。具體計算過程如下:
#向量規範化vector_normalize <- function(x){ x / sqrt(sum(x^2))}#調用函數進行向量規範化dataset_normal <- colwise(vector_normalize)(dataset[,-9])#加權標準化矩陣dataset_normal_weight <- adply(dataset_normal,1,.fun = function(x){x*entropy_weight})#確定正理想方案和負理想方案best_case <- colwise(max)(dataset_normal_weight)worst_case <- colwise(min)(dataset_normal_weight)#計算各方案與正負理想方案的距離distance_best <- adply(dataset_normal_weight,1,.fun = function(x){sqrt(sum((x -best_case)^2))})distance_worst <- adply(dataset_normal_weight,1,.fun = function(x){sqrt(sum((x -worst_case)^2))})proximity_data <- data.table(target = dataset$target,distance_best = distance_best$V1,distance_worst = distance_worst$V1)#計算相對接近度並進行排序proximity_data[,proximity := distance_worst / (distance_best + distance_worst)][order(-proximity)]proximity_data[,rank := rank(-proximity)][order(rank)]
至此,我們就完成了用TOPSIS綜合評價法
進行多對象多指標的最優對象選擇,輸出的結果如下,顯然在這八個方案中,方案A為最優方案。
推薦閱讀: