【学习笔记】Matlab和python双语言的学习(熵权法)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

通过模型算法,熟练对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进行代码编写。

  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值