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


