熵权法

news/2024/10/11 19:49:34

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

信息熵借鉴了热力学中熵的概念,香农把信源所含有的信息量称为信息熵,用于描述平均而言事件信息量的大小,所以在数学上,信息熵是事件所包含的信息量的期望(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;endendres = 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));endenddisp('所有的数据均已完成正向化!')
end
%% 标准化
disp('***************正在进行标准化...***************');
[n,m] = size(X);
% 先检查有没有负数元素
isNeg = 0;
for i = 1 : nfor j = 1 : mif(X(i,j) < 0)isNeg = 1;break;endend
end
if (isNeg == 0)squere_X = (X.*X);sum_X = sum(squere_X,1).^0.5; %按列求和,再开方stand_X = X./repmat(sum_X, n, 1);
elsemax_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 : nfor j = 1 : mif(P(i,j) == 0)P(i,j) = 0.00001;endend
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 ~= -1for 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);endenddisp('所有的数据均已完成正向化!');
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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/70352.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

MacOS在VS code上运行Python失败,通过更改pythonPath解决

问题描述安装完成python后,默认的运行python命令是python3,而VSCode上默认命令是python 解决办法在file\preference\settings下(或使用快捷键Ctrl + ,),搜索python.pythonPath然后点击Add Item,加入 "python.pythonPath" = "python3"再修改一下调试结…

插值方法

插值是什么 在工程中,我们经常要用一条曲线将一些点依次连接起来,称为插值。 插值的可行性证明 插值法定理:对n+1个不同的节点有唯一多项式\(\phi (x)=a_0+a_1x+\cdots+a_nx^n\),使得\(\phi_n(x_j)=y_j(j=0,1,2,\cdots,n)\) 证明:将\(x_0\)到\(x_n\)带入多项式能得到一个线性…

5.4求解非凸非线性规划

import numpy as np from scipy.optimize import minimize# 定义目标函数 def objective(x):return -np.sum(np.sqrt(x)) # 注意:scipy的minimize默认是最小化问题,所以这里取负号# 定义约束条件 constraints = [{type: ineq, fun: lambda x: 10 - x[0]}, # x[0] <= 10{…

CentOS系统安全配置

一、账户安全及权限 禁用root以外的超级用户禁用root以外的超级用户 1.检测方法:点击查看代码 cat /etc/passwd 查看口令文件,文件格式如下 login_name:password:user_ID:group_ID:comment:home_dir:command 若user_ID=0,则该用户拥有超级用户的权限。查看此处是否有多…

基于最小二乘递推算法的系统参数辨识matlab仿真

1.程序功能描述 基于最小二乘递推算法的系统参数辨识。对系统的参数a1,b1,a2,b2分别进行估计,计算估计误差以及估计收敛曲线,然后对比不同信噪比下的估计误差。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序for i=(LEN0+4):LENz(i,1)=-A1*z(i-1,1)…

快乐数学7数学常数e

7 数学常数e 亦称自然常数、自然底数,或是欧拉数(Eulers number),是无理数的数学常数,以瑞士数学家欧拉命名;还有个较少见的名字纳皮尔常数,用来纪念苏格兰数学家约翰纳皮尔引进对数。它是一个无限不循环小数,数值约是(小数点后20位,https://oeis.org/A001113):7.1…

使用e【charts报错】

错误代码 <template><h1>home</h1><div id="main" style="width: 600px;height:400px;"></div> </template><script setup> import {onMounted} from vue; import * as echarts from echarts; // 确保正确导入 …

10.11 模拟赛(云智计划 模拟测#26)

S---【云智计划】---6月23日---模拟测#26 div1【补题】 - 比赛 - 梦熊联盟 (mna.wang) S---【云智计划】---6月23日---模拟测#26 div2【补题】 - 比赛 - 梦熊联盟 (mna.wang) 复盘 A。看到 \(n\) 为偶数思路秒出。10min 过样例。 B。好像不太会做啊。模拟了样例 2,猜出了一个很…