提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
通过模型算法,熟练对Matlab和python的应用。
学习视频链接:
https://www.bilibili.com/video/BV1EK41187QF?p=7&vd_source=67471d3a1b4f517b7a7964093e62f7e6
一、熵权法的基本概念
在之前的文章中,介绍的评价决策的算法都带有主观因素,都是人为地决定不同因素的权重,在本文中,将介绍一种客观的赋权方法----熵权法。
熵权法(Entropy Weight Method)是一种客观赋权方法,用于确定多指标决策问题中各指标的权重。它基于信息论中的熵概念,通过计算各指标的信息熵来反映指标的变异程度,进而确定各指标的权重。
在物理学中,熵(Entropy)是一个重要的概念,通常用来描述系统的混乱程度和宏观状态的可能性。所以熵权法的核心思想是:如果一个指标的变异程度越大,即各方案在该指标上的表现差异越大,那么该指标包含的信息量就越多,其在决策中的重要性也就越高。
二、熵权法的基本步骤
1、构建决策矩阵
收集各方案在各指标上的原始数据,构建一个 n x m 的决策矩阵 A,其中 n 是方案的数量,m 是指标的数量.。
2、数据标准化
对决策矩阵进行标准化处理,以消除量纲和量级的影响。
3、计算指标的比重
计算标准化矩阵中每个指标的比重 pi,即第 i 个方案在第 j 个指标上的值占该指标总值的比例。
4、计算信息熵
计算每个指标的信息熵 e,信息熵反映了指标的变异程度。信息熵越大,表示该指标的变异程度越小,信息量越少。
5、计算权重
根据信息熵计算每个指标的权重 w。权重 w 与信息熵 e 成反比,即信息熵越大,权重越小。
6、计算综合得分
用权重矩阵 W 与标准化矩阵相乘,得到各方案的综合得分 S。
本文依旧使用明星找对象的实例:
三、代码实现----Matlab
上篇文章我们已经通过对不同指标正向化,得到正向化后的指标矩阵:
接下来根据公式编写代码即可:
clear;clc
% 判断矩阵(正向化后的矩阵)
% A = [9 0 0 0;8 3 0.9 0.5;6 7 0.2 1]
A = input('判断矩阵A:');
[n,m] = size(A);
% 矩阵标准化
Stand_A = A ./ (sum(A .* A)).^0.5;
% 计算概率矩阵
p = Stand_A ./ repmat(sum(Stand_A,1),n,1);
% 计算信息熵
D = zeros(1,m);
for i = 1:m
e = -1/log(n) * sum(p(:,i) .* mylog(p(:,i)));
D(i) = 1 - e;
end
W = D ./ sum(D);
prize = sum(repmat(W,3,1) .* Stand_A, 2);
由于在该实例中计算得出的概率矩阵有元素为 0 ,所以在下一步取对数时会出现 NaN,所以我们重新定义了一个函数,当元素为 0 时,函数返回 0 ;当元素不为 0 时,函数返回其对数值。
function [lnp] = mylog(p)
n = length(p); % 向量p的长度
lnp = zeros(n,1);
for i = 1:n
if p(i) == 0
lnp(i) = 0;
else
lnp(i) = log(p(i));
end
end
end
最终运行出的得分与视频中江北老师提供的结果不太一致,计算得分时,我是将权重矩阵与标准化矩阵点乘,除了得分的运行结果不一致外,其他数据结果均相同,此处存疑
四、代码实现----python
import numpy as np
# 判断矩阵(正向化后的矩阵)
A = np.array([[9, 0, 0, 0],[8, 3, 0.9, 0.5],[6, 7, 0.2, 1]])
# 矩阵标准化
Stand_A = A / (np.sum(A * A,0)) ** 0.5
# 求解比重p
p = Stand_A / np.sum(Stand_A,0)
def mylog(p):
k = p.shape[0]
lnp = np.zeros(n)
for i in range(n):
if p[i] == 0:
lnp[i] = 0
else:
lnp[i] = np.log(p[i])
return lnp
# 计算信息熵
n,m = p.shape
D = np.zeros(m)
for i in range(m):
e = -1/np.log(n) * np.sum(p[:,i] * mylog(p[:,i]))
D[i] = 1 - e
# 计算熵权
W = D / np.sum(D)
# 计算得分
prize = np.sum(np.tile(W,(3,1)) * Stand_A, 1)
总结
本文介绍了使用熵权法计算权重,并分别使用Matlab和python进行代码编写。
标签:python,sum,矩阵,指标,信息熵,Matlab,计算,np,权法 From: https://blog.csdn.net/m0_65032457/article/details/140749705