R语言上熵权法确定权重的实现

基本原理

在信息论中,熵是对不确定性的一种度量。信息量越大,不确定性就越小,熵也就越小;信息量越小,不确定性越大,熵也越大。

根据熵的特性,可以通过计算熵值来判断一个事件的随机性及无序程度,也可以用熵值来判断某个指标的离散程度,指标的离散程度越大,该指标对综合评价的影响(权重)越大。比如样本数据在某指标下取值都相等,则该指标对总体评价的影响为0,权值为0.

熵权法是一种客观赋权法,因为它仅依赖于数据本身的离散性。

熵权法步骤

第一步:指标的归一化处理(异质指标同质化):由于各项指标的计量单位并不统一,因此在用他们计算综合指标前,先要进行标准化处理,即把指标的绝对值转化为相对值,从而解决各项不同质指标值的同质化问题。

另外,正向指标和负向指标数值代表的含义不同(正向指标数值越高越好,负向指标数值越低越好),因此,对于正向、负向指标需要采用不同的算法进行数据标准化处理。

正向指标:

这里写图片描述

负向指标:

这里写图片描述

第二步:计算第j项指标下第i个样本值占该指标的比重。

这里写图片描述

第三步:计算第j项指标的熵值。

这里写图片描述

第四步:计算信息熵冗余度(差异)。

这里写图片描述

第五步:计算各项指标的权重。

这里写图片描述

第六步:计算各样本的综合得分。

这里写图片描述

脚本实现

数据读入。

library(forecast)
library(XLConnect)
sourui <- read.csv("E:/R/operation/train.csv",header = T)
  • 1
  • 2
  • 3

部分数据展现

这里写图片描述

索引列删除

sourui$案例 <- NULL
  • 1

第一步:归一化处理。

min.max.norm <- function(x){
  (x-min(x))/(max(x)-min(x))
}

max.min.norm <- function(x){
  (max(x)-x)/(max(x)-min(x))
}

sourui_1 <- apply(sourui[,-c(7,11)],2,min.max.norm)  #正向
sourui_2 <- apply(sourui[,c(7,11)],2,max.min.norm)   #负向

sourui_t <- cbind(sourui_1,sourui_2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

第二步:求出所有样本对指标Xj的贡献总量

first1 <- function(data)
{
  x <- c(data)
  for(i in 1:length(data))
    x[i] = data[i]/sum(data[])
  return(x)
}
dataframe <- apply(sourui_t,2,first1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

第三步:将上步生成的矩阵每个元素变成每个元素与该ln(元素)的积并计算信息熵。

first2 <- function(data)
{
  x <- c(data)
  for(i in 1:length(data)){
    if(data[i] == 0){
      x[i] = 0
    }else{
      x[i] = data[i] * log(data[i])
    }
  }
  return(x)
}
dataframe1 <- apply(dataframe,2,first2)

k <- 1/log(length(dataframe1[,1]))
d <- -k * colSums(dataframe1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

第四步:计算冗余度。

d <- 1-d
  • 1

第五步:计算各项指标的权重。

w <- d/sum(d)
w
  • 1
  • 2

最终输出结果展现

这里写图片描述

附上评分及输出语句 w1 <- as.data.frame(w) dataframe0 <- as.data.frame(dataframe) sourui$评分 <- dataframe0$入网时长 * w1[1,] + dataframe0$财务收入 * w1[2,] + dataframe0$账户余额 * w1[3,] + dataframe0$通话时长 * w1[4,] + dataframe0$主叫通话时长 * w1[5,] + dataframe0$主叫通话时长占比 * w1[6,] + dataframe0$次均通话时长 * w1[7,] + dataframe0$上网流量 * w1[8,] + dataframe0$上网时长 * w1[9,] + dataframe0$微信使用流量 * w1[10,] + dataframe0$终端价格 * w1[11,] + dataframe0$维修次数 * w1[12,] + dataframe0$投诉次数 * w1[13,]

版权声明:本文为博主原创文章
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页