数学建模(熵权法 python代码 例子)

目录

介绍: 

模板:

例子:择偶

极小型指标转化为极大型(正向化):

中间型指标转为极大型(正向化):

区间型指标转为极大型(正向化):

标准化处理:

公式:

熵权:

公式:

​​​完整代码:

结果:

介绍: 

熵权法是一种多属性决策方法,用于确定各个属性在决策中的重要程度。该方法的核心思想是通过计算属性的熵值,来评估属性的信息量和不确定性,进而确定属性的权重。

熵是信息论中的概念,表示一个随机变量的不确定性。在决策中,一个属性的熵越大,说明该属性对决策的贡献越大,因为它包含了更多的信息。熵权法通过计算属性的熵,然后将每个属性的熵除以总的熵,得到每个属性的权重。

具体步骤如下:

  1. 收集决策所涉及的属性数据。
  2. 计算每个属性的熵值,使用熵的计算公式:熵 = -Σ(p*log2(p)),其中p表示属性的概率。
  3. 计算所有属性的熵之和,得到总的熵。
  4. 计算每个属性的权重,使用该属性的熵除以总的熵。
  5. 最后可以根据属性的权重,进行决策或排序。

熵权法在多属性决策中具有一定的优势,能够考虑到不同属性的权重,提高决策的准确性和可靠性。但是,在实际应用中,需要注意属性数据的准确性和合理性,以及熵的计算方法的选择等问题。

 模板:

import numpy as np

# 定义计算熵的函数
def entropy(data):
    # 计算每个属性的概率
    prob = np.array(data) / np.sum(data)
    # 计算熵
    entropy = -np.sum(prob * np.log2(prob))
    return entropy

# 定义熵权法函数
def entropy_weight(data):
    # 计算每个属性的熵
    entropies = [entropy(column) for column in data.T]
    # 计算总的熵
    total_entropy = np.sum(entropies)
    # 计算每个属性的权重
    weights = [entropy / total_entropy for entropy in entropies]
    return weights

# 示例数据
data = np.array([[10, 20, 30, 40], [40, 30, 20, 10]])

# 计算权重
weights = entropy_weight(data)
print("属性权重:", weights)

例子:择偶

 极小型指标转化为极大型(正向化):

   # 公式:max-x 
   if ('Negative' in name) == True:
            max0 = data_nor[columns_name[i + 1]].max()#取最大值
            data_nor[columns_name[i + 1]] = (max0 - data_nor[columns_name[i + 1]])  # 正向化
            # print(data_nor[columns_name[i+1]])

 中间型指标转为极大型(正向化):

 # 中间型指标正向化 公式:M=max{|xi-best|}  xi=1-|xi-best|/M
        if ('Moderate' in name) == True:
            print("输入最佳值:")
            max = data_nor[columns_name[i + 1]].max()
            min = data_nor[columns_name[i + 1]].min()
            best=input()
            M=0
            for j in data_nor[columns_name[i + 1]]:
                if(M<abs(j-int(best))):
                    M=(abs(j-int(best)))

            data_nor[columns_name[i + 1]]=1-(abs(data_nor[columns_name[i + 1]]-int(best))/M)
            #print(data_nor[columns_name[i + 1]])
            

 区间型指标转为极大型(正向化):

# 区间型指标正向化
        if('Section' in name)==True:
            print()
            print("输入区间:")
            a=input()
            b=input()
            a=int(a)
            b=int(b)
            max = data_nor[columns_name[i + 1]].max()
            min= data_nor[columns_name[i + 1]].min()
            if(a-min>max-b):
                M=a-min
            else:
                M=max-b
            #print(data_nor[columns_name[i + 1]][0])
            cnt=0
            for j in data_nor[columns_name[i + 1]]:
                if(j<int(a)):
                    data_nor[columns_name[i + 1]][cnt]=1-(a-j)/M
                elif (int(a)<= j <=int(b)):
                    data_nor[columns_name[i + 1]][cnt]=1
                elif (j>b):
                    data_nor[columns_name[i + 1]][cnt]=1-(j-b)/M
                #print(data_nor[columns_name[i + 1]][cnt])
                cnt+=1
            #print(data_nor[columns_name[i + 1]])
           
'''公式:
M = max{a-min{xi},max{xi}-b}  xi<a,则xi=1-(a-xi)/M; a<=xi<=b,则xi=1; xi>b,则1-(xi-b)/M
'''

标准化处理:

公式:

def normalization(data_nor):
    data_nors = data_nor.values
    data_nors = np.delete(data_nors, 0, axis=1)#去掉第一行
    squere_A = data_nors * data_nors#矩阵相乘
    # print(squere_A)
    sum_A = np.sum(squere_A, axis=0)#按列求和

    sum_A = sum_A.astype(float)

    stand_A = np.sqrt(sum_A)#平方根
    
    columns_name = data_nor.columns.values
    
    cnt=0
    for i in columns_name[1:]:
        #print(data_nor[i])
        data_nor[i]=data_nor[i]/stand_A[cnt]
        cnt+=1

    #print(data_nor)

    return data_nor

熵权:

公式:

# 定义计算熵权方法
def entropy_weight(data_nor):
    columns_name = data_nor.columns.values
    n = data_nor.shape[0]
    E = []
    for i in columns_name[1:]:
        # 计算信息熵
        # print(i)
        data_nor[i] = data_nor[i] / sum(data_nor[i])

        data_nor[i] = data_nor[i] * np.log(data_nor[i])
        data_nor[i] = data_nor[i].where(data_nor[i].notnull(), 0)
        # print(data_nor[i])
        Ei = (-1) / (np.log(n)) * sum(data_nor[i])
        E.append(Ei)
    # print(E)
    # 计算权重
    W = []
    for i in E:
        wi = (1 - i) / ((len(columns_name) - 1) - sum(E))
        W.append(wi)
    # print(W)
    return W

 ​​​​完整代码:

#coding=gbk
import pandas as pd
import numpy as np
import re
import warnings

# 定义文件读取方法
def read_data(file):
    file_path = file
    raw_data = pd.read_excel(file_path, header=0)
    # print(raw_data)
    return raw_data

# 定义数据正向化
def data_normalization(data):
    data_nor = data.copy()
    columns_name = data_nor.columns.values
    #print(columns_name)
    for i in range((len(columns_name) - 1)):
        name = columns_name[i + 1]
        print("输入这一类数据类型(Positive、Negative、Moderate、Section:)")
        name=input()

        # 极小型指标正向化
        if ('Negative' in name) == True:
            max0 = data_nor[columns_name[i + 1]].max()#取最大值
            data_nor[columns_name[i + 1]] = (max0 - data_nor[columns_name[i + 1]])  # 正向化
            # print(data_nor[columns_name[i+1]])

        # 中间型指标正向化
        if ('Moderate' in name) == True:
            print("输入最佳值:")
            max = data_nor[columns_name[i + 1]].max()#取最大值
            min = data_nor[columns_name[i + 1]].min()#取最小值
            best=input()
            M=0
            for j in data_nor[columns_name[i + 1]]:
                if(M<abs(j-int(best))):
                    M=(abs(j-int(best)))

            data_nor[columns_name[i + 1]]=1-(abs(data_nor[columns_name[i + 1]]-int(best))/M)
            #print(data_nor[columns_name[i + 1]])


        # 区间型指标正向化
        if('Section' in name)==True:
            print("输入区间:")
            a=input()
            b=input()
            a=int(a)
            b=int(b)
            max = data_nor[columns_name[i + 1]].max()
            min= data_nor[columns_name[i + 1]].min()
            if(a-min>max-b):
                M=a-min
            else:
                M=max-b
            #print(data_nor[columns_name[i + 1]][0])
            cnt=0
            for j in data_nor[columns_name[i + 1]]:
                if(j<int(a)):
                    data_nor[columns_name[i + 1]][cnt]=1-(a-j)/M
                elif (int(a)<= j <=int(b)):
                    data_nor[columns_name[i + 1]][cnt]=1
                elif (j>b):
                    data_nor[columns_name[i + 1]][cnt]=1-(j-b)/M
                cnt+=1
            #print(data_nor[columns_name[i + 1]])

    # print(data_nor)
    return data_nor


def normalization(data_nor):
    data_nors = data_nor.values
    data_nors = np.delete(data_nors, 0, axis=1)
    squere_A = data_nors * data_nors#矩阵相乘
    # print(squere_A)
    sum_A = np.sum(squere_A, axis=0)#按列求和

    sum_A = sum_A.astype(float)

    stand_A = np.sqrt(sum_A)#开平方

    columns_name = data_nor.columns.values

    cnt=0
    for i in columns_name[1:]:
        data_nor[i]=data_nor[i]/stand_A[cnt]#每个元素除以相对应的平方根
        cnt+=1

    #print(data_nor)
    return data_nor


# 定义计算熵权方法
def entropy_weight(data_nor):
    columns_name = data_nor.columns.values
    n = data_nor.shape[0]
    E = []
    for i in columns_name[1:]:
        # 计算信息熵
        # print(i)
        data_nor[i] = data_nor[i] / sum(data_nor[i])

        data_nor[i] = data_nor[i] * np.log(data_nor[i])
        data_nor[i] = data_nor[i].where(data_nor[i].notnull(), 0)
        # print(data_nor[i])
        Ei = (-1) / (np.log(n)) * sum(data_nor[i])
        E.append(Ei)
    # print(E)
    # 计算权重
    W = []
    for i in E:
        wi = (1 - i) / ((len(columns_name) - 1) - sum(E))
        W.append(wi)
    # print(W)
    return W


# 计算得分
def entropy_score(data, w):
    data_s = data.copy()
    columns_name = data_s.columns.values
    for i in range((len(columns_name) - 1)):
        name = columns_name[i + 1]
        data_s[name] = data_s[name] * w[i]
    return data_s

if __name__ == "__main__":
     file = 'filepath'  # 声明数据文件地址
     data = read_data(file)  # 读取数据文件
     data_nor = data_normalization(data)  # 数据正向化,生成后的数据data_nor

     print("\n正向化后的数据:")
     print(data_nor)
     data_nor=normalization(data_nor)
     print("\n标准化后的数据:")
     print(data_nor)
     W = entropy_weight(data_nor)  # 计算熵权权重

     data_s = entropy_score(data, W)  # 计算赋权后的得分,使用原数据计算
     #data_nor_s = entropy_score(data_nor, W)

     print("\n权值:",W)
     print("\n赋权后的得分:")
     print(data_s)
     #print(data_nor_s)

结果: 

 

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

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

相关文章

电脑设备管理器在哪?这里有详细指南!

电脑设备管理器是Windows操作系统中一个重要的工具&#xff0c;它允许用户查看和管理计算机中的硬件设备。无论是查找设备驱动程序、识别硬件问题还是管理设备属性&#xff0c;设备管理器都是一个不可或缺的工具。在本文中&#xff0c;我们将介绍三种常见的方法&#xff0c;以分…

Docker容器化技术(docker-compose安装部署案例)

docker-compose编排工具 安装docker-compose [rootservice ~]# systemctl stop firewalld [rootservice ~]# setenforce 0 [rootservice ~]# systemctl start docker[rootservice ~]# wget https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-…

Python——pgzero游戏打包exe执行时报错

Python——pgzero游戏打包exe执行时报错 记录一次使用 pgzero 开发游戏&#xff0c;使用 pyinstaller 打包时报错 目录结构&#xff1a; 1. 第一次报错 打包指令&#xff1a; pyinstaller -Fw .\code.py结果打开报错 报错如下&#xff1a; Traceback (most recent call…

【机器学习300问】39、高斯分布模型如何实现异常检测?

一、异常检测是什么&#xff1f; &#xff08;1&#xff09;举几个例子 ① 信用卡交易异常检测 在信用卡交易数据分析中&#xff0c;如果某个用户的消费习惯通常是小额且本地化消费&#xff0c;那么突然出现一笔大额且跨国的交易就可能被标记为异常。 ② 电机温度异常检测 在电…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(1)

所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第1节 云原生架构产生背景 云原生&#xff08;Cloud Native&#xff09;是近几年云计算领域炙手可热的话题&#xff0c;云原生技术已成为驱动业务增长的重要引擎。同时&#xff0c;作为新型基础设施的重要支撑技术&…

新一代 数据安全管理平台是什么,对于各行各业的公司又有什么价值?

新一代数据安全管理平台&#xff0c;在数据安全建设体系中可发挥“全局风险治理、统一指挥调度”的重要作用&#xff0c;为用户提供跨数据类型、存储孤岛和生态系统集成数据的产品和服务&#xff0c;从而实现更简单、一致的数据安全。 数据安全管理平台是以数据访问行为分析为基…

Redis如何设置键的生存时间或过期时间

键的生存时间或过期时间 概述。 通过EXPIRE命令或者PEXIPIRE命令&#xff0c;客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL)&#xff0c;在经过指定的秒数或者毫秒数之后&#xff0c;服务器就会自动删除生存时间为0的键: 127.0.0.1:6379>…

Oracle:ORA-01830错误-更改数据库时间格式

1,先把报错SQL语句拿出来执行&#xff0c;看看是不是报的这个错 ORA-01830: 日期格式图片在转换整个输入字符串之前结束 2&#xff0c;然后查看默认日期格式是不是“YYYY-MM-DD HH24:MI:SS”&#xff08;正确格式&#xff09;。&#xff1b; 执行&#xff1a; SELECT * FRO…

美团24秋招第一套笔试试题

小美的字符串匹配度 我的代码&#xff08;16/20&#xff09; import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextL…

Apache Superset

前言 最近在准备一个小的项目&#xff0c;需要对 Hive 的数据进行展示&#xff0c;所以想到了把 Hive 的数据导出到 MySQL 然后用 Superset 进行展示。 Superset 1.1 Superset概述 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接…

表格固定行固定列问题

效果图 代码&#xff1a; 1.第一部分&#xff1a;表格固定行&#xff1a;用合计行来实现 <el-tableclass"fixedRowcol":data"tableData"bordershow-summarysum-text"合计"ref"table"></el-table> 2.第二部分&#xff1…

Docker 【通过Dockerfile构建镜像】【docker容器与镜像的关系】

文章目录 前言一、前期的准备工作二、上手构建一个简单的镜像三、DcokerFile1 指令总览2 指令详情 四、Dockerfile文件规范五、docker运行build时发生了什么?六、调试手段1. 修改镜像打包后&#xff0c;如何验证新内容已更新至镜像 七、Dockerfile优化方案 前言 docker构建镜…

【Spark编程基础】实验三RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作&#xff1b; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

burpsuit教程汉化+Repeater(非常详细),从零基础入门到精通,看完这一篇就够了

前言&#xff1a;释疑解惑 《BP使用教程一》发布后&#xff0c;后台收到了许多小伙伴的私信问BP是怎么汉化的&#xff0c;在这里统一为大家解答一下。 BP的汉化依赖于汉化jar包&#xff0c;在启动时引入汉化包即可&#xff0c;废话不多说&#xff0c;直接上命令&#xff1a; …

MySQL:基础篇

一、数据库概述 基本概念 RDBMS&#xff08;关系型数据库&#xff09;和非DBMS对比 RDBMS 实质&#xff1a; 优势&#xff1a; 非DBMS 介绍&#xff1a; 类型&#xff1a; RDBMS设计规则 表、字段、记录 表之间的关联关系 1、一对一 2、一对多 3、多对多 4、自我引用 二、…

Linux网络编程: TCP协议首部与可选项简述

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…

蓝桥杯 第3217题 简单的异或难题 C++ Java Python

题目 思路和解题方法 计算给定数组中子数组异或和的问题。它采用了前缀异或的方法来预处理数组&#xff0c;然后对于每个查询&#xff0c;通过异或操作计算子数组的异或和。 读取输入的数组&#xff0c;并计算每个位置的前缀异或和。对于每个查询&#xff0c;读取查询的左右边界…

有哪些好用的客户管理软件?这5款系统好在哪里?

问题链接&#xff1a;有哪些客户管理比较好的软件&#xff1f; - 知乎 从题主的描述来看&#xff0c;问题主要聚集在客户信息管理、销售流程管理、客户优先级管理这几大方面&#xff0c;再回答这个问题之前&#xff0c;我们要先明确几个问题。比如&#xff0c;客户对企业的重要…

蓝桥杯--错误票据

求解答&#xff0c;不知道出现什么问题(虽然知道自己写的挺麻烦的&#xff0c;但是孩子能写出来就不容易了&#xff09; public class top2 {//错误票据public static void main(String[] args){Scanner scannernew Scanner(System.in);int wscanner.nextInt();String []snew S…

uniapp 开发微信小程序 出现启用组件按需注入问题如何解决

问题描述 在使用uniapp 开发微信小程序&#xff0c;进行上架发布时 代码质量栏 出现启用组件按需注入问题。 虽然现实代码上传成功&#xff0c;但是作为一个吹毛求疵的老猿人&#xff0c;肯定是无法容忍的。那么如何解决呢&#xff1f; 问题解决方案 在uniapp端&#xff0c…