草庐IT

数学建模之熵权法(EWM)matlab实例实现

Icy Hunter 2023-12-16 原文

本文参考http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html

熵权法是一种客观赋值的方法,即它通过数据所包含的信息量来确定权重,形象的说如果每个人考试都能考100分,那么这个指标对于这些人的评价是毫无意义的,因为没有任何区分度,熵权法就是通过区分度来确定对于特征的权值,从而能够对事物进行综合的评价。

一般来说,若某个指标的信息熵指标权重确定方法之熵权法越小,表明指标值得变异程度越大,提供的信息量越多,在综合评价中所能起到的作用也越大,其权重也就越大。相反,某个指标的信息熵指标权重确定方法之熵权法越大,表明指标值得变异程度越小,提供的信息量也越少,在综合评价中所起到的作用也越小,其权重也就越小。

基于此熵权法步骤如下:

首先需要将数据标准化即让数据分布在0-1之间,方式有多种
例如归一化,即 当前特征元素-当前特征列的最小值/当前特征列的最大值-当前特征列的最小值(本文采用此方法):

或者标准化

然后计算各指标的信息熵
pij表示的是当前元素在当前特征列的占比
Ej代表此特征的信息熵
且规定0ln0 = 0

最后就是确定各指标的权重
由于信息熵越大,其所代表的数据不确定性越大
因此信息熵越小,代表其区分度越高,即说明此特征越重要
因此需要1-Ei来获取对应特征的实际重要程度
再通过除以所有特征重要程度之和,即能计算出,此特征在所有特征中的重要程度占比,从而计算出对应特征的权重。

下边展示一道例题:

由于从题目中能够看出,各指标都是正向指标,因此最终特征值*特征权重求和也都是包含正向因素,值越大代表评价越高,但是如果包含负向评价的话,我认为,可能特征值取反应该就能转变成正向评价了吧。

第一步先进行归一化处理

data = [100,90,100,84,90,100,100,100,100
    100,100,78.6,100,90,100,100,100,100
    75,100,85.7,100,90,100,100,100,100
    100,100,78.6,100,90,100,94.4,100,100
    100,90,100,100,100,90,100,100,80
    100,100,100,100,90,100,100,85.7,100
    100,100,78.6,100,90,100,55.6,100,100
    87.5,100,85.7,100,100,100,100,100,100
    100,100,92.9,100,80,100,100,100,100
    100,90,100,100,100,100,100,100,100
    100,100,92.9,100,90,100,100,100,100];
[Y,PS] = mapminmax(data',0,1);%由于此函数是按行进行归一化的,因此先转置再转回来就好了
to_one = Y';

结果如下:

第二步求特征元素占比

ele_weight = [];
sum_col = sum(to_one); %默认按列求和
[row, col] = size(to_one); %获取原数据矩阵的行和列
for i = 1:row
    for j = 1:col
        ele_weight(i,j) = to_one(i,j)/sum_col(j); %计算出归一化后每个元素在所在特征列的占比
    end
end

第三步求各元素信息熵

E_ele = [];
for i = 1:row
    for j = 1:col
        if ele_weight(i,j) == 0 %规定0*ln(0) = 0,不赋值默认为0
            continue
        end
        E_ele(i,j) = -ele_weight(i,j)*log(ele_weight(i,j));%计算信息熵,matlab中log即取ln
    end
end
E = sum(E_ele./log(row));%计算此特征的信息熵
sum_E = sum(E)

最后一步通过特征信息熵求出特征权重并计算分数

W = (1-E)./(col-sum_E);%通过信息熵计算对应特征的权重,列数即为特征数
W = W';%转置便于矩阵乘法直接计算出对应的评价分数

data * W

matlab完整代码如下:

clc,clear
data = [100,90,100,84,90,100,100,100,100
    100,100,78.6,100,90,100,100,100,100
    75,100,85.7,100,90,100,100,100,100
    100,100,78.6,100,90,100,94.4,100,100
    100,90,100,100,100,90,100,100,80
    100,100,100,100,90,100,100,85.7,100
    100,100,78.6,100,90,100,55.6,100,100
    87.5,100,85.7,100,100,100,100,100,100
    100,100,92.9,100,80,100,100,100,100
    100,90,100,100,100,100,100,100,100
    100,100,92.9,100,90,100,100,100,100];
[Y,PS] = mapminmax(data',0,1);%由于此函数是按行进行归一化的,因此先转置再转回来就好了
to_one = Y';

ele_weight = [];
sum_col = sum(to_one); %默认按列求和
[row, col] = size(to_one); %获取原数据矩阵的行和列
for i = 1:row
    for j = 1:col
        ele_weight(i,j) = to_one(i,j)/sum_col(j); %计算出归一化后每个元素在所在特征列的占比
    end
end

E_ele = [];
for i = 1:row
    for j = 1:col
        if ele_weight(i,j) == 0 %规定0*ln(0) = 0,不赋值默认为0
            continue
        end
        E_ele(i,j) = -ele_weight(i,j)*log(ele_weight(i,j));%计算信息熵
    end
end

E = sum(E_ele./log(row));%计算此特征的信息熵
sum_E = sum(E);
W = (1-E)./(col-sum_E);%通过信息熵计算对应特征的权重
W = W';%转置便于矩阵乘法直接计算出对应的评价分数

data * W

有关数学建模之熵权法(EWM)matlab实例实现的更多相关文章

  1. ruby-on-rails - 建模收藏夹 - 2

    我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor

  2. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  3. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  4. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  5. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  6. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  7. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  8. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐