熵权法/变异系数法(原理+代码)

熵权法-介绍

例:相亲问题
在这里插入图片描述
为每一个属性分配权重,采用层次分析法(主观)
若想要权重避免主观,采用熵权法

概率与信息量关系

在这里插入图片描述

信息熵与信息量的关系

在这里插入图片描述

熵权法-定义

信息熵的定义

在这里插入图片描述

信息熵的定性分析

以渣男和老实人出轨举例
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
没有引用抽烟时,信息熵为1,因为男性和女性各占50%;引用之后信息熵变为0.5477.

正向化处理

在这里插入图片描述
在这里插入图片描述
区间型指标转化方法:
在这里插入图片描述
中间型指标转化方法:
在这里插入图片描述

标准化处理

在这里插入图片描述
在这里插入图片描述

计算各个指标下每个样本的比重

在这里插入图片描述

计算信息熵和熵权

在这里插入图片描述

应用

在这里插入图片描述
在这里插入图片描述

代码

代码所用表格如下:
在这里插入图片描述

%clear;clc;%X = [89,1; 60,3; 74,2; 99,0]
%X=[99;100;98;97]
%X=[0.030;0.028;0;0.007]
%X=[99,0.030;100,0.028;98,0;97,0.007]
%X=[99,0.010;100,0.012;98,0.040;97,0.033]
%X = [35.2;35.8;36.5;37.2;38.0]
%X = [0.6;0.75;0.89;0.95]
%X = [180;175;170;185;190]
%X = [60;90;95;81;79]
X = xlsread('blind date.xlsx');
%% 正向化
disp('***************正在进行正向化...***************');
vec = input('请输入要正向化的向量组,请以数组的形式输入,如[1 2 3]表示1,2,3列需要正向化,不需要正向化请输入-1\n') %注意输入函数这里是单引号
if (vec ~= -1)
    for i = 1 : size(vec,2)
        flag = input(['第' num2str(vec(i)) '列是哪类数据(【1】:极小型 【2】:中间型 【3】:区间型),请输入序号:\n']);
        if(flag == 1)%极小型
           X(:,vec(i)) = Min2Max(X(:,vec(i)));
        elseif (flag == 2) % 注意这里的else和if是连在一起的
            best = input('请输入中间型的最好值:\n');
            temp = X(:,vec(i));
            X(:,vec(i)) = Mid2Max(X(:,vec(i)), best);
        elseif (flag == 3)
            arr = input('请输入最佳区间,按照“[a,b]”的形式输入:\n');
            X(:,vec(i)) = Int2Max(X(:,vec(i)), arr(1), arr(2));
        end
    end
    disp('所有的数据均已完成正向化!')
end
%% 标准化
disp('***************正在进行标准化...***************');
[n,m] = size(X);
% 先检查有没有负数元素
isNeg = 0;
for i = 1 : n
    for j = 1 : m
        if(X(i,j) < 0)
            isNeg = 1;
            break;
        end
    end
end
if (isNeg == 0)
    squere_X = (X.*X);
    sum_X = sum(squere_X,1).^0.5; %按列求和,再开方
    stand_X = X./repmat(sum_X, n, 1);
else
    max_X = max(X,[],1); %按照列找出最大元素
    min_X = min(X,[],1); %按照列找出最小元素
    stand_X = X - repmat(min_X,n,1) ./ (repmat(max_X,n,1) - repmat(min_X,n,1));
end
disp('标准化完成!')
%% 计算样本概率、信息熵和熵权
disp('***************正在用熵权法确定权值...***************');
P = stand_X ./ repmat(sum(stand_X),n,1);
% 由于ln(0)没有定义,所以我们需要人为的把概率为0的手动指定为一个接近与0的数
for i = 1 : n
    for j = 1 : m
        if(P(i,j) == 0)
            P(i,j) = 0.00001;
        end
    end
end
H_x = sum(-P .* log(P)); %注意在MATLAB中,想要算ln(x)应该输入log(x);想要算lg(x)则应该输入log10(x)
e_j = H_x ./ log(n);
d_j = 1 - e_j;
%进行归一化,获得熵权
disp('熵权完成,权值为:');
w = d_j ./ sum(d_j)

区间型转极大型:

%% 区间型转极大型,传入参数为待正向化的向量,返回为正向化后的结果
function [res] = Int2Max(X, a, b)  
   M =  max(a - min(X), max(X) - b);
   for i = 1 : size(X)
       if(X(i) < a)
           X(i) = 1 - (a - X(i))/M;
       elseif (X(i) >= a && X(i) <= b)
           X(i) = 1;
       elseif (X(i) > b)
           X(i) = 1 - (X(i) - b)/M;
       end
   end
   res = X;
end

中间型转极大型:

%% 中间型转极大型,传入参数为待正向化的向量,返回为正向化后的结果
function [res] = Mid2Max(X, best)
   M =  max(abs(X - best));
   res = 1 - abs(X - best)/M;
end

极小型转极大型:

%% 极小型转极大型,传入参数为待正向化的向量,返回为正向化后的结果
function [res] = Min2Max(X)
   res = max(X) - X;
end
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
变异系数法是一种多属性决策分析方法,用于确定各决策因素的重。它结合了熵权法变异系数法的优点,既考虑了指标的重要性,又考虑了指标的稳定性。 其步骤如下: 1. 确定决策因素及其指标。 2. 对各指标进行归一化处理。 3. 计算各指标的信息,用于评估指标的重要性。 4. 根据信息计算各指标的重。 5. 计算各指标的变异系数,用于评估指标的稳定性。 6. 根据变异系数计算各指标的重。 7. 综合信息重和变异系数重,得出各决策因素的重。 以下是使用Python实现变异系数法的示例代码: ```python import numpy as np # 构建决策矩阵,这里以三个决策因素为例,每个因素有三个指标 decision_matrix = np.array([ [10, 15, 20], [5, 10, 15], [20, 25, 30] ]) # 归一化决策矩阵 normalized_matrix = np.zeros_like(decision_matrix) for i in range(decision_matrix.shape[0]): sum_of_row = np.sum(decision_matrix[i]) for j in range(decision_matrix.shape[1]): normalized_matrix[i][j] = decision_matrix[i][j] / sum_of_row # 计算信息 p = normalized_matrix / np.sum(normalized_matrix, axis=0) log_p = np.log2(p) log_p[np.isinf(log_p)] = 0 entropy = -np.sum(p * log_p, axis=0) weight_by_entropy = (1 - entropy) / np.sum(1 - entropy) # 计算变异系数 std_dev = np.std(normalized_matrix, axis=0) mean = np.mean(normalized_matrix, axis=0) variation_coefficient = std_dev / mean weight_by_variation_coefficient = variation_coefficient / np.sum(variation_coefficient) # 综合信息重和变异系数重,得出各决策因素的重 alpha = 0.5 weight_vector = alpha * weight_by_entropy + (1 - alpha) * weight_by_variation_coefficient print("决策因素的重为:", weight_vector) ``` 这段代码中,首先构建了一个决策矩阵`decision_matrix`,然后对其进行归一化,得到`normalized_matrix`。 接着,使用熵权法计算各指标的信息`entropy`,从而得到重向量`weight_by_entropy`。 然后,使用变异系数法计算各指标的变异系数`variation_coefficient`,从而得到重向量`weight_by_variation_coefficient`。 最后,将两个重向量按一定比例综合起来,得到各决策因素的重向量`weight_vector`即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值