首页 > 其他分享 >熵权法

熵权法

时间:2024-10-11 19:47:19浏览次数:4  
标签:disp end %% sum vec 正向 权法

熵是热力学的一个物理概念,是体系混乱度或无序度的度量,熵越大表示系统越乱(即携带的信息越少),熵越小表示系统越有序(即携带的信息越多)。

信息熵借鉴了热力学中熵的概念,香农把信源所含有的信息量称为信息熵,用于描述平均而言事件信息量的大小,所以在数学上,信息熵是事件所包含的信息量的期望(mean,或称均值,或称期望,是试验中每次可能结果的概率乘以其结果的总和),根据期望的定义,可以设想信息熵的公式大概是:

Untitled

其中H是信息熵,q是信源消息个数,是消息 出现的概率。

可以将熵的大小认为是权重,具体见代码。

matlab代码

%% 极小型转极大型,传入参数为待正向化的向量,返回为正向化后的结果
function [res] = Min2Max(X)
   res = max(X) - X;
end
%% 区间型转极大型,传入参数为待正向化的向量,返回为正向化后的结果
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
%% 画图
x = rand(100,1);
y = x .* log(x);
plot(x,y);
%% main函数
% clear;clc;
% X=[]
% 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('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)

总代码

%% 初始化和数据读取
% clear;clc;
X = readmatrix('date.xlsx'); % 读取Excel数据

%% 正向化处理
disp('***************正在进行正向化...***************');
vec = input('请输入要正向化的向量组,请以数组的形式输入,如[1 2 3]表示1,2,3列需要正向化,不需要正向化请输入-1\n');
if vec ~= -1
    for i = 1 : length(vec)
        flag = input(['第' num2str(vec(i)) '列是哪类数据(【1】:极小型 【2】:中间型 【3】:区间型),请输入序号:\n']);
        if flag == 1 % 极小型
            X(:, vec(i)) = max(X(:, vec(i))) - X(:, vec(i));
        elseif flag == 2 % 中间型
            best = input('请输入中间型的最好值:\n');
            X(:, vec(i)) = 1 - abs(X(:, vec(i)) - best) / max(abs(X(:, vec(i)) - best));
        elseif flag == 3 % 区间型
            arr = input('请输入最佳区间,按照“[a,b]”的形式输入:\n');
            M = max(abs(X(:, vec(i)) - arr(1)), abs(X(:, vec(i)) - arr(2)));
            X(:, vec(i)) = 1 - (abs(X(:, vec(i)) - arr(1)) + abs(X(:, vec(i)) - arr(2))) / (2 * M);
        end
    end
    disp('所有的数据均已完成正向化!');
end

%% 标准化处理
disp('***************正在进行标准化...***************');
[n, m] = size(X);
squere_X = X .^ 2;
sum_X = sqrt(sum(squere_X, 1)); % 按列求和,再开方
stand_X = X ./ sum_X; % 使用广播操作

%% 计算样本概率、信息熵和熵权
disp('***************正在用熵权法确定权值...***************');
P = stand_X ./ sum(stand_X, 1); % 使用广播操作
P(P == 0) = 1e-10; % 避免log(0)的问题
H_x = sum(-P .* log(P), 1); % 信息熵
e_j = H_x ./ log(n); % 熵权
d_j = 1 - e_j; % 归一化后的权重
w = d_j ./ sum(d_j); % 熵权向量

disp('熵权完成,权值为:');
disp(w);

标签:disp,end,%%,sum,vec,正向,权法
From: https://www.cnblogs.com/cxy1114blog/p/18459131

相关文章

  • 评价模型TOPSIS与熵权法MATLAB代码
    函数代码functiontopsis_example(data,data_types,up_OK,down_OK,upper_bounds,lower_bounds,middle)%数据预处理[num_objects,num_attributes]=size(data);normalized_data=zeros(num_objects,num_attributes);%1.根据数据类型进行正向化......
  • 熵权法详细讲解+Python代码实现
    ......
  • Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码
    分析师:SikunChen在当今世界,粮食系统的稳定性至关重要。尽管现有的全球粮食系统在生产和分配方面表现出较高的效率,但仍存在大量人口遭受饥饿以及诸多粮食安全隐患。与此同时,在学术领域,准确评估情报学期刊的质量和影响力对于学术研究和信息传播意义重大。本研究旨在通过多种方法对......
  • Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码
    原文链接:https://tecdat.cn/?p=37724原文出处:拓端数据部落公众号 分析师:SikunChen在当今世界,粮食系统的稳定性至关重要。尽管现有的全球粮食系统在生产和分配方面表现出较高的效率,但仍存在大量人口遭受饥饿以及诸多粮食安全隐患。与此同时,在学术领域,准确评估情报学期刊的质......
  • jsp创权法律服务系统2k977
    jsp创权法律服务系统2k977本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能用户,律师,法律知识,案例信息,律师信息,律师预约开题报告内容进度安排:2023年12月20日—2024年01月20日:查阅和收集课题相......
  • 【学习笔记】Matlab和python双语言的学习(熵权法)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、熵权法的基本概念二、熵权法的基本步骤1、构建决策矩阵2、数据标准化3、计算指标的比重4、计算信息熵5、计算权重6、计算综合得分三、代码实现----Matlab四、代码实现----python总结......
  • 主观赋权法、客观赋权法、组合赋权法、评价指标体系构建
    在科研领域,为了对某个研究主题进行深入的探讨和评估,我们往往需要构建一套科学合理的评价体系,并为其中的各项评价指标赋予相应的权重。比如,在评价一项新技术的性能时,我们可能会考虑其创新性、实用性、成本效益等多个维度。那么,如何为这些维度赋予合适的权重,以更准确地反映新技术的......
  • 熵权法
    pdf:熵权法.pdf别人的:https://www.jianshu.com/p/bdfd8b6d28b5https://blog.csdn.net/qq_48774513/article/details/120636330适用范围客观赋值优点在权值确定的过程,完全是分析已有的数据,没有引入主观干预,具有较好的客观性目的确定每个指标所占权重,权重用于计算最终得......
  • (1)评价算法—熵权法
    文章目录​​1、什么是熵权法​​​​1.1优点​​​​1.2缺点​​​​1.3适用范围​​​​2、使用熵权法过程​​​​2.1数据预处理​​​​2.1.1清洗指标极值​​​​2......
  • topsis和熵权法
    主要解决多指标评价模型首先来看topsis,考虑一种类型数据首先正向化,比如都改成越大越好(如果越小越好?max-x;在某个区间内最好?中间型指标?)然后标准化,把原式数据改成0~......