熵权法用R实现
data=read.csv(file.choose()); #导入数据
func<-function(data,type){
#data:收集到的数据矩阵,行名是指标,列名是样本
#type:正指标为1,负指标为0
sum(is.na(data))
#归一化处理
min.max.norm<-function(x){
(max(x)-x)/max(x)-min(x))
}
max.min.norm<-function(x){
(x-min(x))/(max(x)-min(x))
}
data_1=data[lab==1,]
data_1=apply(data_1,2,min.max.norm) #正向
data_0=data[lab==0,]
data_0=apply(data_0,2,max.min.norm) #负向
data<-cbind(data_1,data_0)
#求出所有样本对指标Xj的贡献总量
first1 <- function(data)
{
x <- c(data)
for(i in 1:length(data))
x[i] = data[i]/sum(data[])
return(x)
}
dataframe <- apply(y,2,first1);
###将上步生成的矩阵每个元素变成每个元素与该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]))
e<- -k * colSums(dataframe1)
###计算冗余度
d=1-e
###计算权重
w=d/sum(d)
网友评论