-
【数学建模】熵值法与多指标评价系统
2017-01-26 22:22:19一.熵的基本概念熵最初是热力学中的一个概念,后来延伸到信息领域。熵是对系统无序度的度量,系统越无序,熵越大。熵的统计学定义是: 某个宏观状态的微观状态数,取对数lnWlnW 举个例子,抛10次硬币,...熵值法在多获取更多关于算法、人工智能、复杂性科学的内容,欢迎关注我的公众号《复杂与美》
##一.熵的基本概念
熵最初是热力学中的一个概念,后来延伸到信息领域。熵是对系统无序度的度量,系统越无序,熵越大。熵的统计学定义是:
某个宏观状态的微观状态数,取对数lnWlnWlnW
举个例子,抛10次硬币,正面朝上的次数是3是宏观状态,对应的微观状态数,也就是使得正面朝上的排列组合数为3。可以看出熵越大,该熵对应的状态出现的概率也越大,弄清楚定义之后也就不难理解为什么熵越大系统会越稳定了。
##二.熵值法在多指标评价系统中的应用
对于多指标系统评价的赋权问题除了采用层次分析法(AHP)等主观分析方法外,还可以通过熵值法来确定权重。
**熵值法的核心思想是用信息的无序度来衡量信息的效用值。**信息的无序度越低(越不稳定),该信息的效用值就越大。换句话说,越稳定的信息越无用。
在多指标系统中应用熵值法是基于以下假定:那些很稳定基本不怎么变化的指标对最终评价造成的影响也很小。信息的离散程度越大越重要。
国内外关于熵值法的资料不是很多,我认为主要原因还是这个假定不是很有说服力,因为实际中存在大量比较稳定但也同样重要的信息,这种信息即使是很小一点的变动也会引起结果的很大变化,在非线性动力系统中有大量这样的例子。
我认为,信息的离散程度只是信息的某一方面的反映,信息的重要性也是信息某方面的反映,单单从信息的离散程度或是重要性都无法还原信息本身,而通过信息的某个侧面去推测信息的另一个侧面这种方法确实不太靠谱。
综上,这种方法虽然是一种客观的评分方法,但由于理论上的硬伤,还是不能在多指标评价系统中出于优势地位。
不过由于评价这种东西本来就很主观,也没有客观的标准去评价某个方法的有效性,所以对多指标评价的方法也很难分出孰优孰劣。如果是有专业知识作为指导还是最好选择主观赋权的方法。##三.熵值法算法步骤
-
选取n个样本,m个指标,则
xijx_{ij}xij
为第i个样本的第j个指标的数值(i=1, 2…, n; j=1,2,…, m);
-
指标的归一化处理:异质指标同质化
由于各项指标的计量单位并不统一,因此在用它们计算综合指标前,先要对它们进行标准化处理,即把指标的绝对值转化为相对值,并令
xij=∣xij∣x_{ij}=|x_{ij}|xij=∣xij∣
从而解决各项不同质指标值的同质化问题。而且,由于正向指标和负向指标数值代表的含义不同(正向指标数值越高越好,负向指标数值越低越好),因此,对于高低指标我们用不同的算法进行数据标准化处理。其具体方法如下:
对于正向指标:
zij=xij−min(xj)max(xj)−min(xj){z}_{ij}=\frac{x_{ij}-min (x_j) }{max(x_j)-min(x_j)}zij=max(xj)−min(xj)xij−min(xj)
对于负向指标:
zij=max(xj)−xijmax(xj)−min(xj){z}_{ij}=\frac{max (x_j) -x_{ij}}{max(x_j)-min(x_j)}zij=max(xj)−min(xj)max(xj)−xij
则zijz_{ij}zij为第i个样本的第j个指标的数值(i=1, 2…, n; j=1, 2,…, m)。
-
计算第j项指标下第i个城市占该指标的比重:
pij=zij∑i=1nzij,i=1,...,n,j=1,...,mp_{ij}=\frac{z_{ij}}{\sum_{i=1}^nz_{ij}},i=1,...,n,j=1,...,mpij=∑i=1nzijzij,i=1,...,n,j=1,...,m
-
计算第j项指标的熵值:
ej=−k∑i=1npijln(pij)e_j=-k\sum_{i=1}^np_{ij}ln(p_{ij})ej=−k∑i=1npijln(pij)
其中k=1/ln(n)>0k=1/ln(n)>0k=1/ln(n)>0
满足ej≥0e_j\ge0ej≥0
-
计算信息效用值:
dj=1−ejd_j=1-e_jdj=1−ej
-
计算各项指标的权值:
wj=dj∑j=1mdjw_j=\frac{d_j}{\sum_{j=1}^{m}d_j}wj=∑j=1mdjdj
-
多层评价系统的评价
根据熵的可加性,可以利用下层结构的指标信息效用值按比例确定对应于上层结构的权重WjW_jWj的数值。对下层结构的每类指标的效用值求和,得到上层指标的效用值和,记作Dk(k=1,2,...,K)D_k(k=1,2,...,K)Dk(k=1,2,...,K)。进而得到全部指标效用值的总和
D=∑k=1KDkD=\sum_{k=1}^KD_kD=∑k=1KDk
则相应主题的权重为:
Wk=DkDW_k=\frac{D_k}{D}Wk=DDk
-
-
基于模糊层次分析法的矿山安全综合评价模型
2020-07-08 18:44:59为了全面、准确、定量地评价矿山安全状况,依据影响矿山安全的因素,选取并建立了包括管理、环境、技术、人员等4个评价准则、12个指标的多因素多指标评价体系。利用层次分析法确定各评价指标的权重,定义了评价指标等级... -
matlab如何求指标的权向量_【Matlab】案例讲解层次分析法的Matlab实现
2020-12-28 23:10:28我写过层次分析法的Matlab实现:张敬信:【评价算法】层次分析法zhuanlan.zhihu.com其中的ahp函数是来自《吴鹏. Matlab高效编程技巧与应用:25个案例分析》,我只是增加或改写了注释说明。但是该函数对大家使用不...我写过层次分析法的Matlab实现:张敬信:【评价算法】层次分析法zhuanlan.zhihu.com
其中的ahp函数是来自《吴鹏. Matlab高效编程技巧与应用:25个案例分析》,我只是增加或改写了注释说明。但是该函数对大家使用不太友好,非常复杂难用,倒不是函数定义的不好,只是因为它是将整个多层次的层次结构模型,一次代入该函数,一次完成全部的计算,所以就变得很复杂和难用。
这次重写一个简单易用的,一次只解决一个层次结构的层次分析法计算,多个结构多用几次就好了。层次分析法原理见上篇文章,这里不再赘述。
以么焕民老师在智慧树平台的数学建模课程中的,层次分析法案例为基础,来具体阐述。
问题描述:某人要出去旅游,有 3 个备选景点,需要从景色、费用、居住条件、饮食、旅途共5 个因素来考量。
一. 构建层次结构
二. 构造成对比较矩阵
5个因素分别记为X1,X2,X3,X4,X5
某人根据自己的考量,给出的成对比较矩阵:
以
为例,表示在某人看来费用比景色的相对重要程度是
,即认为费用是景色的
倍重要,其它矩阵元素的解释类似。
A = [ 1 1/2 4 3 3;
2 1 7 5 5;
1/4 1/7 1 1/2 1/3;
1/3 1/5 2 1 1;
1/3 1/5 3 1 1];
三. 计算权向量及一致性检验
么老师是用方根法近似计算的,实际上完全没有必要,直接用eig()函数算精确的就行了。两种方法我都实现一下。方根法近似计算
W = prod(A, 2) % 计算每一行乘积
n = size(A, 1); % 矩阵行数
W = nthroot(W, n) % 计算n次方根
W = W / sum(W) % 归一化处理, 计算特征向量, 即权向量
Lmax = mean((A * W) ./ W) % 计算最大特征值
2. 用eig()精确计算
[V,D] = eig(A)
[Lmax,ind] = max(diag(D)); % 求最大特征值及其位置
Lmax % 最大特征值
W = V(:,ind) / sum(V(:,ind)) % 最大特征值对应的特征向量做归一化, 即权向量
3. 再计算一致性指标和一致性比率
n = size(A, 1);
CI = (Lmax - n) / (n - 1) % 计算一致性指标
% Saaty随机一致性指标值
RI = [0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51];
CR = CI / RI(n) % 计算一致性比率
一致性比率 CR=0.0161 < 0.1 满足一致性要求,故前面的权重向量可以使用。
关于一致性的解释:
是
的
倍重要,
是
的
倍重要,则
是
的
倍重要,所以在比较
与的
重要性时,不能和
倍相差太多。
四. 计算组合全向量及其一致性检验
以上只是计算完了层次结构中的:准则层
个因素对目标层的决策权重,即一个层次结构。
还有方案层分别对准则层的
个因素的层次结构需要计算。这可以理解为
个景点分别对每个因素的贡献度(重要度)。
5 个层次结构就是 5 个成对比较矩阵:
这就需要按上述计算 5遍。这怎么能忍,当然是自定义函数解决了。先来谈谈我对自定义函数的一些体会
需要重复做多次同一种计算过程(前面第三部分那一系列的计算),一个好办法是,将该计算过程写成函数,就能方便多次使用了。
(1) 编程中的函数,是用来实现某个功能,其一般形式为:
(返回值1,..., 返回值m) = 函数名(输入1, ..., 输入n)
你只要把输入给它,它就能在内部进行相应处理,把你想要的返回值给你。
这些输入和返回值,在函数定义时,都要有固定的类型(模具)限制,叫做形参(形式上的参数);在函数调用时,必须给它对应类型的具体数值,才能真正的去做处理,这叫做实参(实际的参数)。
所以,定义函数就好比创造一个模具,调用函数就好比用模具批量生成产品。
使用函数最大的好处,就是将实现某个功能,封装成模具,从而可以反复使用。这就避免了写大量重复的代码,程序的可读性也大大加强。
(2) 那么,怎么自定义一个函数?
我想要自定义一个函数,能够实现“完成一个层次结构的层次分析法的计算”的功能。
基于前面函数的理解,
第一步,分析输入和输出,设计函数外形:输入有几个 ,分别是什么,适合用什么数据类型存放;
输出有几个,分别是什么,适合用什么数据类型存放。
本问题,
输入有 1 个:成对比较矩阵(用矩阵存放);
输出有4 个:权重向量(用向量存放)、最大特征值(浮点数存放)、一致性指标(浮点数存放)、一致性比率(浮点数存放)。
然后就可以基于 Matlab 自定义函数的语法,设计自定义函数的外形:
function[W, Lmax, CI, CR] =AHP(A)% 实现单层次结构的层次分析法
% 输入: A为成对比较矩阵
% 输出: W为权重向量, Lmax为最大特征值, CI为一致性指标, CR为一致性比率
注:函数名和变量可以随便起名,但是建议用有含义的单词。另外,为函数增加注释是一个好习惯。这些都是为了代码的可读性。
第二步,梳理功能的实现过程(就是前文的调试过程)
拿一个具体的输入,比如成对比较矩阵
,分析怎么到达想要的那
个返回值结果的。
复杂的功能,就需要更耐心的梳理和思考甚至借助一些算法,当然也离不开代码片段的调试。
注:把一个具体的输入,调试通过,得到正确的返回值结果,这一步骤很有必要。
第三步,将第二步的代码封装到函数体(选精确计算的)
function[W, Lmax, CI, CR] =AHP(A)% 实现单层次结构的层次分析法
% 输入: A为成对比较矩阵
% 输出: W为权重向量, Lmax为最大特征值, CI为一致性指标, CR为一致性比率
[V,D] = eig(A);
[Lmax,ind] = max(diag(D)); % 求最大特征值及其位置
W = V(:,ind) / sum(V(:,ind)); % 最大特征值对应的特征向量做标准化
Lmax = mean((A * W) ./ W); % 计算最大特征值
n = size(A, 1); % 矩阵行数
CI = (Lmax - n) / (n - 1); % 计算一致性指标
% Saaty随机一致性指标值
RI = [0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51];
CR = CI / RI(n); % 计算一致性比率
发现没有?就是前面梳理过程的代码原样复制过来的!原来的变量赋值语句不需要了,只需要形参。另外,为行尾没有分号的行添加了分号,函数不需要输出中间结果。
3. 调用自定义函数
Matlab自定义函数保存为与函数名同名的.m文件,这里是 AHP.m
确保该 AHP.m 文件在当前路径下,即确保该文件在Matlab界面左侧的“当前文件夹”窗口能看到它。那么就可以使用该函数。
以前文的矩阵
为例,测试该自定义的 AHP 函数:
A = [ 1 1/2 4 3 3;
2 1 7 5 5;
1/4 1/7 1 1/2 1/3;
1/3 1/5 2 1 1;
1/3 1/5 3 1 1];
[W, Lmax, CI, CR] = AHP(A)
运行结果:
有了该函数,就是有了可以实现层次分析法的“模具”,该“模具”只要提供成对比较矩阵给它,它就能给你返回:权重向量、最大特征值、一致性指标、一致性比率。
2. 回到问题,那5个层次结构的计算就简单了:
B1 = [ 1 2 5;
1/2 1 2;
1/5 1/2 1];
B2 = [1 1/3 1/8;
3 1 1/3;
8 3 1];
B3 = [ 1 1 3;
1 1 3;
1/3 1/3 1];
B4 = [ 1 3 4;
1/3 1 1;
1/4 1 1];
B5 = [1 1 1/4;
1 1 1/4;
4 4 1 ];
[W1, Lmax1, CI1, CR1] = AHP(B1);
[W2, Lmax2, CI2, CR2] = AHP(B2);
[W3, Lmax3, CI3, CR3] = AHP(B3);
[W4, Lmax4, CI4, CR4] = AHP(B4);
[W5, Lmax5, CI5, CR5] = AHP(B5);
返回结果太长了,加分号不让它直接输出,而是整理到一起再输出:
% 合并结果
rlts3 =[W1 W2 W3 W4 W5; Lmax1 Lmax2 Lmax3 Lmax4 Lmax5;
CI1 CI2 CI3 CI4 CI5; CR1 CR2 CR3 CR4 CR5]
这与么老师的课程里的结果是一致的(我这个更精确哦):
再来计算组合权向量:
a3 = rlts3(1:3,:) * W
这说明 3 个景点的权重分别是:0.2993,0.2453,0.4554
所以,这个某人应该选择的是去第3个景点去旅游。
最后注:这篇文章足够简单了吧,看完再不会用就该从自己身上找原因了。
主要参考文献:
么焕民,数学建模(层次分析法),智慧树平台在线课程。
——————————————
原创作品,转载请注明,禁止用于出版。
-
使用matlab编写的熵权法
2020-08-17 11:05:19按照信息论基本原理的解释,信息是系统有序程度的一个度量,熵是系统无序程度的一个度量;根据信息熵的定义,对于某项指标,可以用熵...因此,可利用信息熵这个工具,计算出各个指标的权重,为多指标综合评价提供依据。 -
TOPSIS法
2020-03-22 23:38:252、层次分析法的局限性: (1) 评价的决策层不能太多,太多的话n会很大,判断矩阵和一致矩阵差异可能会很大。 (2) 决策层中指标的数据是已知的。 基本过程 将原始数据矩阵统一指标类型(一般正向化...TOPSIS法
1、定义
国内常简称为优劣解距离法。TOPSIS 法是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。(多目标决策 TOPSIS 模型)
2、层次分析法的局限性:
(1) 评价的决策层不能太多,太多的话n会很大,判断矩阵和一致矩阵差异可能会很大。
(2) 决策层中指标的数据是已知的。基本过程
将原始数据矩阵统一指标类型(一般正向化处理)得到正向化的矩阵,再对正向化的矩阵进行标准化处理以消除各指标量纲的影响,并找到有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法对数据分布及样本含量没有严格限制,数据计算简单易行。
具体步骤
第一步:将原始矩阵正向化
所谓的将原始矩阵正向化,就是要将所有的指标类型统一转化为极大型指标。(转换的函数形式可以不唯一哦~ )
最常见的四种指标
四种指标如何正向化
1、极小型指标——>极大型指标
极小型指标转换为极大型指标的公式:,如果所有的元素均为正数,那么也可以使用1/x
具体例子:
2、中间型指标——>极大型指标
中间型指标:指标值既不要太大也不要太小,取某特定值最好(如水质量评估PH 值)
是一组中间型指标序列,且最佳的数值为,正向化公式
具体例子:
3、 区间型指标——> 极大型指标
区间型指标:指标值落在某个区间内最好,例如人的体温在36°~37°这个区间比较好。
是一组中间指标序列,且最佳区间为,那么正下序列化公式:
具体例子:
第二步:正向化矩阵标准化
标准化的目的是消除不同指标量纲的影响。
消除不同指标量纲的一种方法
假设有n个要评价的对象,m个评价指标(已经正向化),构成的正向化矩阵
那么,对其标准化的矩阵为Z,Z中的每一个元素: (每个元素/sqrt(其所在列的元素的平方和)
注意:* 标准化的方法有很多种,其主要目的就是去除量纲的影响,未来我们还可能见到更多种的标准化方法,例如:(x‐x的均值)/x的标准差;具体选用哪一种标准化的方法在多数情况下并没有很大的限制,这里我们采用的是前人的论文中用的比较多的一种标准化方法。第三步:计算得分并归一化
假设有n个要评价的对象,m个评价指标(已经正向化),构成的正向化矩阵
定义最大值(找出每一列的最大值构成一个行向量)
定义最小值 (找出每一列的最小值构成一个行向量)
定义第i(i=1,2,……,n)个评价对象与最大值的距离
定义第i(i=1,2,……,n)个评价对象与最小值的距离
那么,我们可以计算得出第i(i=1,2,……,n)个评价对象未归一化的得分:
很明显 ,且 越大越小,即越接近最大值。注意:
(1)这里还没有考虑指标的权重,后面的模型拓展内容会考虑指标的权重来进行计算。
(2)要区别开归一化和标准化。
归一化的计算步骤也可以消去量纲的影响,但更多时候,我们进行归一化的目的是为了让我们的结果更容易解释,或者说让我们对结果有一个更加清晰直观的印象。例如将得分归一化后可限制在0‐1这个区间,对于区间内的每一个得分,我们很容易的得到其所处的比例位置。 -
基于python利用熵权法计算数据权重——一个简单的图形用户界面编程
2020-11-12 10:30:50目录简介技术流程数据代码:极差标准化代码:熵权法赋权实验操作与流程关于数据获取 ...因此,可利用信息熵这个工具,计算出各个指标的权重,为多指标综合评价提供依据。 (上段直接拷贝自百度百科) 技术简介
师弟又催我给他公众号写文了,这次还点名要这个题目……所以我就先到自己的博客里写写练练手……
(下面是正式的简介)
根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其信息熵值越小,指标的离散程度越大, 该指标对综合评价的影响(即权重)就越大,如果某项指标的值全部相等,则该指标在综合评价中不起作用。因此,可利用信息熵这个工具,计算出各个指标的权重,为多指标综合评价提供依据。
(上段直接拷贝自百度百科)技术流程
参考相关的文献,我们知道要做熵值法赋权,首先要进行标准化,把所有指标的数据拉到一个尺度然后才有对比的价值。因此,第一步就是对数据进行标准化处理。在此之上,我们第二步再开始进行熵值法的赋权计算。
(其实本来应该分三步的,即第一步是数据标准化,第二步是求各指标信息熵,第三步是求各指标权重,但是由于之前写代码我把后两部合并了,所以……两步到位吧……)
然后,基于这个技术流程,我们会写两个GUI。为什么是两个呢,因为我其他工作也用到了数据标准化处理,所以我把数据标准化处理的GUI单独写了一个(我的锅)。数据
我拿我上上篇文章(基于python的机器学习回归:可视化、预测及预测结果保存(附代码))的数据删掉target就当作这次的实验示范数据吧!
数据长下面这个样子:
一共551行,共计550条数据,10个指标:
然后我们的目的就是算出这10个指标的熵权,熵权总和必须为1。代码:极差标准化
又到了喜闻乐见的代码部分。
首先,我们先写一个极差标准化的代码,预处理一下我们的数据。(这边就不多介绍极差标准化了,看了公式就明白什么意思了)import tkinter as tk from tkinter.filedialog import * from tkinter.messagebox import * import xlrd import xlwt # 极差标准化部分 ##########1.读取Excel文件########## def load_data(FilePath,ExcelSheet): workbook = xlrd.open_workbook(str(FilePath)) #excel路径 sheet = workbook.sheet_by_name(ExcelSheet) #sheet表 return sheet ##########2.极差标准化运算######## def normalization(sheet,StartCol,EndCol,StartRow,EndRow,ConverseCol,SavePath): #起始列,终止列,起始行,终止行,逆向指标所在列(列表格式),保存路径 #######创建一个workbook######## workbook = xlwt.Workbook(encoding = 'utf-8') # 创建一个workbook 设置编码 worksheet = workbook.add_sheet('Sheet') # 创建一个worksheet #######读取行列,并计算极差标准化值####### for j in range(StartCol-1,EndCol): #获取列代码 Cols = sheet.col_values(j) #ColsName = Cols[0] #获取列名并删除 del Cols[0] #删除列名 ColsMax = max(Cols) #获取整列的最大值,最小值 ColsMin = min(Cols) ExtremeSub = ColsMax - ColsMin #计算极差 for i in range(StartRow-1,EndRow): #获取行代码 PreValue = sheet.cell(i,j).value #获取对应行列单元格里数据 Value = (PreValue-ColsMin)/ExtremeSub for Conve in ConverseCol: #计算逆向指标 if j == Conve-1: #如果是逆向指标列,采用另一种计算方法 Value = (ColsMax-PreValue)/ExtremeSub #逆向指标值计算 worksheet.write(i , j , label=Value) #写入对应单元格 workbook.save(str(SavePath)) #保存 # GUI相关函数 # 初始文件路径 def Get_FilePath(): file_get = askopenfilename() # 选择打开什么文件,返回文件名 file_path.set(file_get) # 设置变量filename的值 # 获取保存路径 def Get_SavePath(): save_get = asksaveasfilename(defaultextension='.xls') # 设置保存文件,并返回文件名,指定文件名后缀为.xls save_path.set(save_get) # 设置变量filename的值 # 极差标准化执行模块 def exe_norma(): try: Sheet = load_data(str(file_path.get()),str(read_sheet_name.get())) #读取Sheet normalization(Sheet,int(start_col.get()),int(end_col.get()),int(start_row.get()),int(end_row.get()),eval(converse_col.get()), str(save_path.get())) #极差标准化与保存Sheet #从上面读取的sheet,起始列,终止列,起始行,终止行,逆向指标所在列(列表格式),保存路径 showinfo(title='执行完毕', message=f'极差标准化计算成功,结果保存在{str(save_path.get())}') except: showwarning(title='执行出错', message='无法执行极差标准化计算,请检查所输入的信息') # GUI界面部分 root = tk.Tk() root.title('极差标准化工具') root.geometry('800x380') file_path = tk.StringVar() save_path = tk.StringVar() # 选择文件、获取路径 tk.Label(root, text='选择文件:').place(x=10,y=20) tk.Entry(root, textvariable=file_path, width=90).place(x=80,y=20) tk.Button(root, text='打开文件', command=Get_FilePath).place(x=730,y=15) # 读取的sheet名称 tk.Label(root, text='读取sheet:').place(x=10,y=70) read_sheet_name = tk.Entry(root, width=90) read_sheet_name.place(x=80,y=70) # 起始、终止行列 tk.Label(root, text='起始列:').place(x=10,y=120) start_col = tk.Entry(root, width=13) start_col.place(x=80,y=120) tk.Label(root, text='终止列:').place(x=190,y=120) end_col = tk.Entry(root, width=13) end_col.place(x=260,y=120) tk.Label(root, text='起始行:').place(x=370,y=120) start_row = tk.Entry(root, width=13) start_row.place(x=440,y=120) tk.Label(root, text='终止行:').place(x=550,y=120) end_row = tk.Entry(root, width=13) end_row.place(x=620,y=120) # 逆向指标所在列 tk.Label(root, text='逆向指标列:').place(x=10,y=170) converse_col = tk.Entry(root, width=30) converse_col.place(x=80,y=170) tk.Label(root, text='用中括号"[ ]"括起,列号用英文输入下的逗号","分隔,如无逆向指标输入"[]"').place(x=310,y=170) # 保存路径 tk.Label(root, text='保存路径:').place(x=10,y=220) tk.Entry(root, textvariable=save_path, width=90).place(x=80,y=220) tk.Button(root, text='选择目录', command=Get_SavePath).place(x=730,y=215) # 运行按钮 tk.Button(root, text='开始进行极差标准化计算', command=exe_norma, width=30, height=2).place(x=290,y=280) root.mainloop()
之前的文章里代码我一般不会解释的,更何况这里我们写的是GUI~都在注释里惹。
想直接用的朋友们可以直接拷贝,然后运行就行了(只要该有的import包你都有,基本上没有什么问题)。
运行出来会出现一个界面,长这个样子:
剩下具体的操作在后面再说。代码:熵权法赋权
与上一节相同,这里仍然是GUI界面,所以我直接贴代码。
把代码拷贝到另一个.py文件里运行就行了。import tkinter as tk from tkinter.filedialog import * from tkinter.messagebox import * import xlrd import xlwt from math import log # 熵值法处理数据部分 ##########1.读取Excel文件########## def load_data(FilePath,ExcelSheet): workbook = xlrd.open_workbook(str(FilePath)) #excel路径 sheet = workbook.sheet_by_name(ExcelSheet) #sheet表 return sheet ##########2.熵值法运算######## def get_entropy(sheet,StartCol,EndCol,StartRow,EndRow,SavePath): #起始列,终止列,起始行,终止行,保存路径 #######创建一个workbook######## workbook = xlwt.Workbook(encoding = 'utf-8') # 创建一个workbook 设置编码 worksheet = workbook.add_sheet('Sheet') # 创建一个worksheet ######获取样本数和指标数###### m = EndCol+1-StartCol #指标数 n = EndRow+1-StartRow #样本数 ColBlank = StartCol - 1 #前面的空列数 #####获取计算熵值法需要的元素####### AbovePartList = [] LCLSBVS = [] for j in range(StartCol-1,EndCol): #获取列代码 ColLSBV = [] Cols = sheet.col_values(j) #ColsName = Cols[0] #获取列名并删除 del Cols[0] #删除列名 EachSampleInThisIndicatorSum = sum(Cols) #每个样本的该列指标求和 for i in range(StartRow-1,EndRow): PreValue = sheet.cell(i,j).value if PreValue == 0: PreValue = 0.000000001 LnSumBracketVar = (PreValue/EachSampleInThisIndicatorSum) * log(PreValue/EachSampleInThisIndicatorSum) ColLSBV.append(LnSumBracketVar) ColLSBVSum = sum(ColLSBV) #计算括号内的和 LnCLSBVS = ColLSBVSum / log(n) #除以 ln(n) LCLSBVS.append(LnCLSBVS) #########熵值法公式上下部分###### AbovePart = 1 + LnCLSBVS #上半部分 AbovePartList.append(AbovePart) #把上半部分存为列表 LCLSBVSSum = sum(LCLSBVS) BelowPart = m + LCLSBVSSum #下半部分固定值 ##########写入############# for j in range(0,m): #指标数 Value = AbovePartList[j] / BelowPart #值等于上半部分除以下半部分 worksheet.write(StartRow-1 , j+ColBlank , label=Value) #写入 workbook.save(str(SavePath)) #保存 # GUI相关函数 # 初始文件路径 def Get_FilePath(): file_get = askopenfilename() # 选择打开什么文件,返回文件名 file_path.set(file_get) # 设置变量filename的值 # 获取保存路径 def Get_SavePath(): save_get = asksaveasfilename(defaultextension='.xls') # 设置保存文件,并返回文件名,指定文件名后缀为.xls save_path.set(save_get) # 设置变量filename的值 # 极差标准化执行模块 def exe_norma(): try: Sheet = load_data(str(file_path.get()),str(read_sheet_name.get())) #读取Sheet get_entropy(Sheet,int(start_col.get()),int(end_col.get()),int(start_row.get()),int(end_row.get()), str(save_path.get())) #极差标准化与保存Sheet #从上面读取的sheet,起始列,终止列,起始行,终止行,逆向指标所在列(列表格式),保存路径 showinfo(title='执行完毕', message=f'熵值法处理数据成功,结果保存在{str(save_path.get())}') except: showwarning(title='执行出错', message='无法执行熵值计算,请检查所输入的信息') # GUI界面部分 root = tk.Tk() root.title('熵值法处理工具') root.geometry('800x330') file_path = tk.StringVar() save_path = tk.StringVar() # 选择文件、获取路径 tk.Label(root, text='选择文件:').place(x=10,y=20) tk.Entry(root, textvariable=file_path, width=90).place(x=80,y=20) tk.Button(root, text='打开文件', command=Get_FilePath).place(x=730,y=15) # 读取的sheet名称 tk.Label(root, text='读取sheet:').place(x=10,y=70) read_sheet_name = tk.Entry(root, width=90) read_sheet_name.place(x=80,y=70) # 起始、终止行列 tk.Label(root, text='起始列:').place(x=10,y=120) start_col = tk.Entry(root, width=13) start_col.place(x=80,y=120) tk.Label(root, text='终止列:').place(x=190,y=120) end_col = tk.Entry(root, width=13) end_col.place(x=260,y=120) tk.Label(root, text='起始行:').place(x=370,y=120) start_row = tk.Entry(root, width=13) start_row.place(x=440,y=120) tk.Label(root, text='终止行:').place(x=550,y=120) end_row = tk.Entry(root, width=13) end_row.place(x=620,y=120) # 保存路径 tk.Label(root, text='保存路径:').place(x=10,y=170) tk.Entry(root, textvariable=save_path, width=90).place(x=80,y=170) tk.Button(root, text='选择目录', command=Get_SavePath).place(x=730,y=165) # 运行按钮 tk.Button(root, text='开始进行熵值法处理计算', command=exe_norma, width=30, height=2).place(x=290,y=230) root.mainloop()
运行了也会出现一个界面,长这个样子:
具体的操作依然在后面。实验操作与流程
首先,我们现在手上已经get到数据了。是一个10个指标的,550条的数据集合(10列,550行)。把这个数据的excel文件放在我们找得到的地方。
然后打开极差标准化GUI的代码,运行之。把该写的信息写上。如下图:
选择文件,点右边的打开文件然后找到你的文件双击就行了。
读取sheet,就是看你excel里sheet的名称是什么。
起始列终止列,就是你的指标列,我们是10个指标,并且从第1列放到第10列,所以写1和10就行。
起始行终止行,就是你数据条,因为第一行是label,所以我们就从2开始到551。
逆向指标列,就是那种值越小最后的数值越好的指标(相反我们常用的正向指标列是值越大越好)。比如说我之前做的一个城市评价体系,其中有一个是人口老龄化占比,这个就是典型的逆向指标;而什么城镇人口,GDP这些就是正向指标。因为实验中我们没逆向指标,所以就直接填[]
;如果有的话,比如第4列第5列是逆向指标,那么我们填[4, 5]
保存路径,就是你要保存的位置,这个打开方式和选择文件一样。
最后,我们点击下面的大按钮“开始进行极差标准化计算”。就会出现这么一个窗口:
到它说的这个位置,就会看到一个新的excel。打开它,大概长这样:
同样是10列,550行,只不过这里我们第一行没了label。这个就是我们数据的极差标准化后的结果,两个excel单元格是一一对应的。
然后我们接下来打开熵权法赋权的GUI的.py文件,运行之。与上面一样,填上该填的信息。如下图:
选择文件,我们就选我们极差标准化处理后的文件(一定不要选到一开始那个数据文件,不然权重会出错的!!!)。
读取sheet,填入sheet名。
起始列终止列,起始行终止行,和前面一样。
保存路径,这个计算后就是最终的结果了,选一个你找得到的想保存的路径。
最后,点击下面的“开始运行熵值法处理计算”。弹出这么一个窗口:
打开生成的excel文件,这个就是它的权重了。
然后我们把一开始的那个数据的label贴上去,并且求和看看:
一一对应!破费科特!关于数据获取
虽然这篇文章用到的样本集数据获取是免费的,但是还是球球大家让我恰点钱吧QAQ~(二维码在下面)。
需要数据的小伙伴们可以在csdn私信我或者联系我邮箱(chinshuuichi@qq.com)。虽然但是,还是建议大家邮箱联系,因为亲测csdn私信的bug还挺多的……另外我及不及时回复比较随缘了,我尽量一天看一次邮箱。
希望大家能打赏支持一下(我的乞讨码在下面)~
-----------------------分割线(以下是乞讨内容)-----------------------
-
论文研究 - 海绵城市计划邻里级建设的绿色基础设施实践和可持续发展关键绩效指标框架
2020-05-15 09:21:51为了支持对多目标GI规划和综合评估做出可靠的决策,层次分析法(AHP)已被用作一种结构化和系统化的技术。 此外,包括必要维度在内的一系列可持续发展关键绩效指标(KPI)是社区规模可持续性的基础。 因此,基于AHP... -
综合评价与决策方法(待补全)
2021-01-06 15:00:46文章目录综合评价与决策方法理想解法定义及有关概念TOPSIS法的算法步骤实例及解题步骤MATLAB伪代码数据包络分析(DEA)定义及有关概念C2RC^2RC2R模型C2RC^2RC2R的MATLAB伪代码灰色关联分析法定义及有关概念具体步骤... -
数模算法:熵权法(用于客观确定权值)
2020-05-23 17:51:05定义 根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其熵...因此,可利用信息熵这个工具,计算出各个指标的权重,为多指标综合评价提供依据。 综合来说这种评价法比较具有客观性 算法步骤 . -
学习笔记----层次分析法
2021-01-22 22:46:01层次分析法是指将一个复杂的多目标决策问题作为一个系统,将目标分解为多个目标或准则,进而分解为多指标(或准则、约束)的若干层次,通过定性指标模糊量化方法算出层次单排序(权数)和总排序,以作为目标(多指标... -
第四段第一天_数学模型之层次分析法
2020-01-21 20:16:08所谓层次分析法,是指将一个复杂的多目标决策问题作为一个系统,将目标分解为多个目标或准则,进而分解为多指标(或准则、约束)的若干层次,通过定性指标模糊量化方法算出层次单排序(权数)和总排序,以作为目标... -
高数叔建模第五章:综合评价方法与计算
2021-01-31 23:55:53计算各指标的熵权例题层次分析法(主观权重方法)定义计算步骤成对比较阵和权向量模型求解代码总结模糊数学的概念思想原理经典集合与特征函数 均方差定权法 背景 建模中经常要做综合评价,综合评价中经常要将多... -
数模算法:模糊综合评价模型
2020-05-25 20:28:24概念引入 模糊集合:用来描述模糊性概念的集合 隶属函数:对模糊集合的刻画,一般值域范围[0,1] 隶属函数的三种确定方法 模糊统计法(专家打分,少...多级模糊综合评价模型(指标很多,需要归类) 因素集,评语级 ... -
基于Choquet积分的三角模糊数多属性决策方法及matlab应用
2020-04-12 03:30:55模糊积分和模糊测度都是由Sugeno教授提出,模糊积分法是一种综合性的评价方法。 (二)模糊积分评价的应用原理 步骤1:本文通过问卷调查的方式来确定指标值和权重值,由于调查的指标值和权重值的模糊性和主观性,... -
论文研究-基于多场景和区间模糊数的输电网规划综合决策.pdf
2019-09-20 17:59:07针对情景分析法在应用中难以准确量化及场景过多问题, 定义综合考虑情景概率及影响程度的评价因子指标实现对典型场景的筛选. 决策过程中, 采用基于梯形隶属函数的区间数模糊决策方法求取方案隶属度, 克服了规划指标... -
熵权法(the Entropy Weight Method)以及MATLAB实现
2019-06-15 20:32:00因此,可利用信息熵这个工具,计算出各个指标的权重,为多指标综合评价提供依据。 物理意义 物质微观热运动时,混乱程度的标志。热力学中表征物质状态的参量之一,通常用符号S表示。在经典热力学中,可用增量定义为... -
数学建模(十二)------关联分析类------熵权法(the entropy weight method(EWM) )
2019-01-25 15:51:47定义:按照信息论基本原理的解释,信息是系统有序程度的一个度量,熵是系统...因此,可利用信息熵这个工具,计算出各个指标的权重,为多指标综合评价提供依据。 ❤️这个的网上的博客就别看了,都是乱七八糟的。 ... -
论文研究-基于模糊粗糙集的TOPSIS供应商评估方法.pdf
2019-07-22 20:12:13由于供应商选择是一个多目标评价问题, 不确定的因素很多, 如果仅靠经验判断则无法避免结果的主观性, 针对这一问题采用了定性和定量相结合的方法, 利用模糊粗糙集求得指标的客观权重, 利用专家评分法来定义指标的主观... -
论文研究-基于FAHP和FMCDM构建软件可信性评估模型.pdf
2019-07-22 17:57:48结合软件可信性评估的特点及模糊理论的最新进展,提出一种基于模糊层次分析法和模糊多指标决策理论的评估模型。首先针对软件可信性没有一致定义的现状,提出了相对可信性的概念;接着基于模糊数理论,用三角模糊数... -
PinPKM-V201525(官网发布的最后一个免费无使用限制版本)
2015-11-08 09:58:08将“定义的搜索”保存到一个目录树中,因为使用了动态日期,所以功能强大, 可允分进行个人知识的深度挖掘。 提醒 问答学习系统:基本问答的形式,来解决“一知半解”的学习问题 知识点的简单排序功能 Windows7下... -
最全的中国标准目录收集
2013-07-16 16:02:33GB 11639-1989 溶解乙炔气瓶多孔填料技术指标测定方法 GB 11640-1989 铝合金无缝气瓶 GB 11641-1989 轻型汽车排气污染物排放标准 GB 11643-1999 公民身份号码 GB 11652-1989 烟花爆竹劳动安全技术规程 GB 11654-1989... -
医学图像配准技术与应用.pdf
2019-05-21 07:35:061.1.1图像配准的数学定义 1.1.2图像配准的基本框架 1.1.3图像配准方法的分类 1.1.4图像配准的步骤 1.2图像配准在医学领域的应用 1.2.1医学图像配准的发展历史 1.2.2配准技术的应用 1.2.3医学图像... -
计算机二级公共基础知识
2011-04-30 14:00:09在树结构中,每一个结点可以有多个后件,称为该结点的子结点。没有后件的结点称为叶子结点。例如,在图1-1中,结点D,E,F均为叶子结点。 度 在树结构中,一个结点所拥有的后件的个数称为该结点的度,所有结点中最大... -
操作系统重点
2013-01-15 16:59:50进程的定义:进程是程序在并发环境中的执行过程。 进程与程序的主要区别。进程最基本的属性是动态性和并发性。 2.进程的状态及其转换 进程的3种基本状态是:运行态、就绪态和阻塞态。掌握教材33页的进程状态... -
软件工程知识点
2012-12-02 21:34:25系统确认验证需要以用户为主体,以需求规格说明书中对软件的定义为依据,由此对软件的各项规格进行逐项地确认,以确保已经完成的软件系统与需求规格的一致性。为了方便用户在系统确认期间能够积极参入,也为了系统在... -
软件工程-理论与实践(许家珆)习题答案
2011-01-12 00:49:42数据字典是数据流图中所有元素的定义的集合,一般由以下四类条目组成(C)。 A) 数据说明条目、控制流条目、加工条目、数据存储条目 B) 数据流条目、数据项条目、文件条目、加工条目 C) 数据源条目、数据流条目、... -
ASP.NET精品课程+源代码
2009-01-05 20:15:51 掌握常用的超文本标记语言和语法,以及网页中各种对象的定义和应用; 掌握ASP.NET的各类控件基本知识与应用; 掌握常用的Web窗体的设计方法; 掌握配置ASP.NET应用程序的方法; 掌握网站建设的总体... -
网页版自然语言标注工具、图片文字去除,可用于漫画翻译 、186种语言的数字叫法库、Amazon发布基于知识的人-人开放领域对话数据集 、中文文本纠错模块代码、繁简体转换 、 Python实现的多种文本可读性评价指标、类似...
-
2005-2009软件设计师历年真题
2010-05-18 19:20:10• 数组(静态数组、动态数组)、线性表、链表(单向链表、双向链表、循环链表)、队列、栈、树(二叉树、查找树、平衡树、线索树、线索树、堆)、图等的定义、存储和操作 • Hash(存储地址计算,冲突处理) ... -
现代直流伺服控制技术及其系统设计
2009-10-14 15:56:216.3多环路(从属控制)系统的设计 6.4复合控制系统的设计 7一个现代PWM直流伺服电动机控制 系统的分析与设计实例 7.1系统设计概述 7.2主要元器件和部件的选择与设计 7.3系统静、动态设计计算 第10章 PWM系统...