首页 > 编程语言 >【学习笔记】Matlab和python双语言的学习(熵权法)

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

时间:2024-07-28 14:29:45浏览次数:18  
标签:python sum 矩阵 指标 信息熵 Matlab 计算 np 权法

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

文章目录


前言

通过模型算法,熟练对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

相关文章

  • 【python】网络通信编程例子
    以下是一个简单的Python示例,展示了如何在Linux下使用套接字进行基本的网络通信,包括创建服务器和客户端。服务器端代码importsocket#创建一个IPv4TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定服务器地址和端口server_addr......
  • 如何将Python版本从3.9降级到3.7?
    我正在开发RaspberryPi。这些是我的操作系统信息:pi@raspberrypi:~$uname-marmv7lpi@raspberrypi:~$cat/etc/os-releasePRETTY_NAME="RaspbianGNU/Linux11(bullseye)"NAME="RaspbianGNU/Linux"VERSION_ID="11"VERSION="11(bullseye)......
  • Python终端输出彩色字符方法
    colorama是一个python专门用来在控制台、命令行输出彩色文字的模块,完全兼容linux和windows各个版本。 1.Python3.x中安装colorama模块: pipinstallcolorama'''可用格式常数:【颜色RED,GREEN都需要大写】Fore:BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHI......
  • 我无法安装 pygame 模块,所以我尝试观看视频,它告诉我这样做。在那个视频中他得到了 pyt
    c:\User\admin>piplistSyntaxError:unexpectedcharacterafterlinecontinuationcharacter我试图获取python模块列表,但出现语法错误出现SyntaxError:unexpectedcharacterafterlinecontinuationcharacter错误是因为你的用户名中包含一个特殊字符......
  • python第五节--conda命令
    这里写自定义目录标题基本命令环境管理包管理环境文件环境变量Conda配置高级操作常见问题基本命令检查Conda版本:conda--version更新Conda:condaupdateconda环境管理创建新环境:condacreate--namemyenv创建包含特定Python版本的新环境:conda......
  • 如何使用python向另一台计算机发送请求
    基本上我有一个聊天室,我将把它变成一个网络(我知道这听起来没有多大意义),但基本上我想知道是否可以让python脚本捕获计算机上的所有传出请求并将其发送到另一台计算机(c2)。然后我希望c2自己发出请求。这是对我正在做的事情的淡化解释,但任何帮助都会很棒!当然可以!虽然从头......
  • AttributeError:'int'对象没有属性'index'(python)
    我正在Python上进行“猜单词”,但我无法弄清楚这个错误。AttributeError:'int'objecthasnoattribute'index'(python)它在线上给了我一个错误letterIndex=word.index(guess)defcheckLetter(word):blanks='_'*len(str(word))print('W......
  • 尝试在Python中使用for循环来输出大于或等于序列中的数字
    这是我的Python代码:largest_so_far=-1print('before',largest_so_far)forthe_numin[9,41,12,3,74,15]:ifthe_num>largest_so_far:largest_so_far=the_numprint(largest_so_far,'isbiggerthan',the_num)......
  • 如何在 wxPython 的 for 循环中添加文本输入框?
    我是wxPython的新手,正在开发一个带有GUI的基本程序,让用户标记图像。现在,当用户单击“导入”按钮时,他们可以选择一个目录。然后,代码使用matplotlib在for循环中显示该目录中的每个图像。但是,我不知道如何在for循环中访问用户输入。这就是该函数现在的样子:importmatplo......
  • 【Python】字母 Rangoli 图案
    一、题目YouaregivenanintegerN.YourtaskistoprintanalphabetrangoliofsizeN.(RangoliisaformofIndianfolkartbasedoncreationofpatterns.)Differentsizesofalphabetrangoliareshownbelow:#size3----c------c-b-c--c-b-a-b-c--c......