TOPSIS综合评价法
是进行多个对象选择排序的方法,其通过计算各对像与最优方案、最劣方案的相对距离进行排序,它用于解决多对象多属性决策问题。本文主要是介绍在R语言
中如何用TOPSIS综合评价法
进行多对象选择决策。
TOPSIS综合评价法
一般地,TOPSIS综合评价法
主要包含两个步骤:计算权重和计算相对接近度。如需详细了解TOPSIS综合评价法
的原理和方法,请自行百度,网上有许多非常详尽的原理说明和案例讲解。
计算权重
根据熵权法确定各个指标的权重;计算各指标信息熵,指标的信息熵越小,则该指标表达信息的不确定性小,在综合评价中对决策的帮助更大,即应该有较大的权重。熵权法是一种客观的赋予权重的方法,它通过各个指标所提供的信息不确定性来确定各指标的权重
计算相对接近度
根据权重加权规范化指标属性矩阵后,确定正理想方案Amax和负理想方案 Amin,计算各备选方案与Amax 、Amin的距离,以评估与正负理想方案的接近程度,根据相对接近度确定优先次序。其中计算距离一般使用欧式距离。
R语言实现过程
按照惯例,导入需要使用的包data.table
、plyr
。然后载入使用的数据,我们简单看一下案例数据情况。
dataset <- fread("/R/TOPSIS/dataset.csv")
其中的字段target即为目标字段,我们需要对其含有的8个方案(A~H)进行综合评价排序,选择其中的最优方案。该数据集中的指标均为正向指标。正向指标表示指标的数值越高越好,负向指标则表示指标的数值越低越好,这决定了该指标在进行权重计算时的处理方式。
计算权重
计算权重的第一步是计算各个指标的熵值,由于我们用到的指标均是正向指标,所以选择自定义函数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)
计算相对接近度
在将指标向量规范化后,利用熵值法得到的权重计算得到加权标准化矩阵,然后提取正理想方案和负理想方案并计算出各个方案距离正负理想方案的距离,最终根据计算得到距离比值进行排序。具体计算过程如下:
#向量规范化
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为最优方案。