说明
原理: 参考 https://www.zhihu.com/question/357680646
代码
%main.m
%% 数据读取
clear all;
clc;
data=importdata('data.mat');
num_sample=size(data,1);
num_aspect=size(data,2);
%% 数据标准化
data_standard=data_standardization(data);
%% 求各指标的信息熵
aspect_comentropy=data_comentropy(data_standard);
%% 确定各指标权重
aspect_weight=data_weight(aspect_comentropy)
function data_standard = data_standardization( data )
% 数据标准化
% 对该矩阵的每一个指标数据进行标准化处理
num_sample=size(data,1);
num_aspect=size(data,2);
data_standard=zeros(num_sample,num_aspect);
for j=1:num_aspect
max_this_aspect=max(data(:,j));
min_this_aspect=min(data(:,j));
for i=1:num_sample
data_standard(i,j)=(data(i,j)-min_this_aspect)/(max_this_aspect-min_this_aspect);
end
end
end
function aspect_comentropy = data_comentropy( data )
%求解各指标的信息熵
% input:data为标准化后的样本-指标矩阵
% output:各指标对应的信息熵
num_sample=size(data,1);
num_aspect=size(data,2);
p=zeros(num_sample,num_aspect);
for j=1:num_aspect
sum_this_aspect=sum(data(:,j));
for i=1:num_sample
p(i,j)=data(i,j)/sum_this_aspect;
end
end
E=zeros(1,num_aspect);
for j=1:num_aspect
sum_p_lnp=0;
for i=1:num_sample
if p(i,j)==0
assist=0;
else
assist=p(i,j)*log(p(i,j));
end
sum_p_lnp=sum_p_lnp+ assist;
end
E(j)=(-1/(log(num_sample)))*sum_p_lnp;
end
aspect_comentropy=E;
end
function aspect_weight = data_weight( data )
%计算各指标权重
% 输入为各指标信息熵的行向量
% 输出为各指标权重
num_aspect=size(data,2);
sum_data=sum(data);
we=zeros(1,num_aspect);
for i=1:num_aspect
we(i)=(1-data(i))/(num_aspect-sum_data);
end
aspect_weight=we;
end