北太天元学习39-熵权法选购手机
信息熵(Information Entropy)是信息理论中的一个概念,用于描述信息的不确定性和随机性。它是由克劳德·艾尔伍德·香农在1948年提出的。 信息熵理论在通信、数据压缩、密码学等领域有广泛应用。

信息熵是一个表示信息平均不确定性的度量。例如, 一个正常的骰子投掷一下正面朝上的点数
X 是一个随机变量, P(X=1) = ... = P(X=6) = 1/6, 那么它的信息熵是
-6* 1/6* log_2 ( 1/6)
大约是2.6 (单位是bit 比特).
当然,信息熵的定义可以是不同的,例如上面这个例子的信息熵也可以定义成
- k 6 * 1/6 * log (1/6)
其中 log 表示自然对数(这是和北太天元的内置函数log的含义保持一致), k = 1/log(6)
这样计算得到的信息熵 是 1. 下面我们将采用这个来定义信息熵, 即设随机变量X取值为1,..., n, 且 P(X=i) = pi, 那么定义其信息熵是
S(X) = - k * (p1 * log(p1) + ... + pn *log(pn) )
其中 k = 1/log(n), log是自然对数。
如果要找一个用来作弊的骰子,使得 P(X=1) = p1, ..., P(X=6) = p6, 其中 p1,..., p6
都属于[0,1] , 而且 p1+...+p6 = 1. 此时的信息熵是
-k * ( p1 * log( p1 ) + ... + p6 * log(p6) )
这里的k 还是 1/log(6), 可以证明 在 p1=...=p6=1/6 时,上面的熵取到最小值(
证明提示: 利用 f(x) = -k x * log(x) 的上凸性,然后 ( f(p1)+...+f(p6) )/6 <= f ( (p1+...+p6)/ 6 ). )
),作弊也就是让骰子掷出点数的混乱度降低了,从而更容易猜对点数了。 例如,极端情况,
p1=1, p2 = ... = p6 =0,
此时的熵是 0 (注意,约定 0 *log 0 = 0 ), 也就是说掷出的点是非常容易猜对的,就猜1点。
我们还可以证明这样的定义的信息熵的取值属于区间[0,1].
熵权法是一种基于信息熵确定各个指标在综合评价中的权重的方法。
熵是系统无序程度的一个度量。根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其信息熵值越小,指标的离散程度越大,该指标对综合评价的影响(即权重)就越大。如果某项指标的值全部相等,则该指标在综合评价中不起作用。
因此,熵权法利用信息熵这个工具,通过计算出各个指标的权重,为多指标综合评价提供依据。该方法适用于信息不完全、未来情况不确定的情况,以及各指标之间相互独立的情况。在实际应用中,熵权法被广泛应用于投资决策、风险管理、绩效评估等领域。
我们还是以北太天元学习38-TOPSIS方法选购手机为例来给出熵权法的步骤。
不同的指标代表含义不一样,有的指标越大越好,称为极大型指标。有的指标越小越好,称为极小型指标,在北太天元学习38中,我们还介绍了区间型指标,是屏幕的尺寸,这里我们把这个指标改成指定最优值型指标,也就是说该指标在某个点是最好的,例如6寸屏幕是最好的。
为方便评价,我们还是把所有指标转化成极大型型指标。
熵权法的步骤是 1. 正向化, 2. 标准化 , 3. 结算每个指标的信息熵 4. 计算每个指标的权重,5.
计算每个备选的分数。
我下面就直接给出北太天元用熵权法给选购的5种不同的手机进行打分的代码。
参考北太天元学习38中对手机的指标的描述,第一列是RAM,第二列是MEMORY,第三列是
手机屏幕尺寸,第四列是电池容量,第五列是价格。 请看这个专栏文章相应的视频看我对
代码的解释,另外,我在视频里还解释了如何使用调试模式运行脚本。

% 北太天元用熵权法选购手机的m脚本 entropy_w.m
%决策矩阵
data = [ 8 128 5 2400 800 ;
8 256 5.5 3000 1500 ;
16 256 6 3200 3000 ;
32 512 10 3200 10000 ;
8 256 4 3000 2000 ];
% 正向化处理之后得到的决策矩阵是 data1
data1=data;
%% 极小型指标, 对极小型指标的处理还是和北太天元学习38是一样的
index=[5];% 这些指标是越小越好
for i=1:length(index)
data1(:,index(i))=max(data(:,index(i)))-data(:,index(i));
end
%% 指定最优值型指标 (指定了最优值,偏离这个最优值越远越不好)
index=[3];
a=6;% 指定的最优值
for i=1:length(index)
v = data1(:,index(i));
w = abs( v - a );
data1(:,index(i))=1- w ./ max(w);
end
%数据归一化的mapminmax函数北太天元暂时是缺少的,
% 我们用m函数mapminmaxEx1来实现
data2=mapminmaxEx1(data1',0.002,1); % 把data1每一列的数据都映射到[0.002,1]
data2=data2';
%计算信息熵
[m,n]=size(data2);
p=zeros(m,n);
for j=1:n
p(:,j)=data2(:,j)/sum(data2(:,j));
end
%data2的每一列都是极大型指标,经过上面处理的p(:,j)可以看成看成一个概率,
%因为得分越高被选取的概率越大.
%计算信息熵
E = zeros(1,n); % 预先分配信息熵的存储空间
for j=1:n
E(j)=-1/log(m)*sum(p(:,j).*log(p(:,j)));
end
% 计算每一个指标的权重
w=(1-E)/sum(1-E);
%计算分数
s=data2*w';
Score=100*s/max(s);
disp('手机的得分如下: ')
disp(Score)
% 北太天元脚本函数 mapminmaxEx1.m 用来代替暂时缺失的 mapminmax 函数
%归一化是一种将数据缩放到 [lb, ub] 范围内的方法。
% 通过使用mapminmax函数,我们可以将数据归一化到 [lb, ub] 范围内化。
% 这个函数把矩阵A的每一行的数据映射到[lb,ub]之间,最小值映射到lb, 最大值映射到ub.
function B = mapminmaxEx1(A, lb, ub)
max_A = max(A,[], 2);
% 注意取每一行的最大值,得到一个列向量, [] 不能省略,不然含义不同
% 你来时试试 max([ 1 2; 3, 4], 2) 和 max( [ 1 2; 3, 4], [], 2) 的计算结果有什么不同
min_A = min(A,[], 2);
B =(A -min_A) ./ ( max_A - min_A) * (ub-lb) + lb;
end
另外,统计物理的熵的定义和信息科学的熵的定义略有不同,我在维也纳的时候曾经去瞻仰过Boltzmann墓,墓碑上是熵的定义:
