权重计算方法二:熵权法(EWM)

目录

1.原理介绍

2.基本步骤

3.步骤详解

3.1 数据归一化(标准化)

3.2 计算第j项指标下第i个方案的指标值比重

3.3 计算第j项指标的信息熵值

3.4 计算各指标权重

4.案例分析

4.1 题目简介

4.2 标准化后数据

4.3 计算第j项指标下第i个方案的指标值比重

4.4 计算第j项指标的信息熵值

4.5  计算各指标权重

4.6 计算得分

5.代码实现

5.1 代码(Java)

5.2 运行截图


1.原理介绍

        熵是对不确定信息的度量,熵与信息量成反比,熵值越小越好。熵值越小,信息量越大,权重越大。

        前文所讲的层次分析法是一种具有很强主观性的赋权方法,而熵权法则是一种客观赋权法,即可以通过数据本身计算出权重。

2.基本步骤

3.步骤详解

3.1 数据归一化(标准化)

由于各项指标计量单位不统一,因此在计算综合权重前要先对其进行归一化处理,即把指标的绝对值转化为相对值。

对于正向指标:

对于负向指标:

         其中系数0.998和0.002的目的是为了使 x_{ij} 的值大于0,防止在后续计算ln{x_{ij}}时出现ln0的情况。这里的0.998可以更改成任意更接近于1的数,如:0.999,0.997等。

3.2 计算第j项指标下第i个方案的指标值比重

P_{ij}=\frac{x_{ij}}{ \sum_{i=1}^{n}x_{ij}},且      \sum P_{ij}=1

3.3 计算第j项指标的信息熵值

e_{j}=-k\sum_{i=1}^{n}P_{ij}lnP_{ij},其中   k=\frac{1}{lnn}

3.4 计算各指标权重

\omega _j=\frac{​{1-e_j}}{\sum_{j=1}^{m}({1-e_j})}

4.案例分析

4.1 题目简介

        已知判断某一水域水质情况的好坏时可以通过x1-x9共9种指标来评判,现有A-K共11条河流的指标测量情况,请以此判断各河流水质的优良

河流x1x2x3x4x5x6x7x8x9
A886317505349642432
B7512431453311842
C794873624348727698
D7395934204654459
E36705351006742543
F4046926068192768
G20783598837035581
H6729383322734775
I383028724620504274
J952520421354565482
K40322714225968153

4.2 标准化后数据

河流x1x2x3x4x5x6x7x8x9
A0.9248530.6782550.1863330.5137470.4788510.6905310.8793890.2792210.338948
B0.7518670.020.020.4402110.0314710.7529060.4219720.2014550.441835
C0.8050930.5190.8073110.6398110.3641380.6749380.9902780.9531951.018
D0.7252531.0180.0976220.3456630.1002990.643750.7407780.020.616742
E0.2329070.7525740.5855330.0410111.0180.021.0180.2921820.452124
F0.2861330.4977661.0180.61880.650920.2227190.020.9531950.092021
G0.020.8375110.3859331.0180.8229891.0180.4774170.7198960.02
H0.6454130.3172770.41920.020.2379540.3474690.0338610.5773250.781361
I0.259520.3278940.3083110.7448630.3985520.2383120.6853330.5125190.771072
J1.0180.2748090.21960.4297050.020.76850.76850.6680520.853381
K0.2861330.3491280.2972220.1355580.1232410.8464690.0754441.0180.55501

4.3 计算第j项指标下第i个方案的指标值比重

河流x1x2x3x4x5x6x7x8x9
A0.1553030.1212860.0428840.1038430.1127660.1109540.1439030.0450720.057057
B0.1262540.0035760.0046030.0889790.0074110.1209760.0690520.0325190.074377
C0.1351920.0928080.1857990.1293230.0857520.1084480.1620490.1538640.171366
D0.1217850.1820390.0224670.0698680.023620.1034370.1212210.0032280.10382
E0.039110.1345750.1347580.0082890.2397320.0032140.1665860.0471640.076109
F0.0480480.0890110.2342890.1250770.1532870.0357860.0032730.1538640.01549
G0.0033580.1497640.0888210.2057660.1938080.1635710.0781250.1162050.003367
H0.1083790.0567350.0964770.0040430.0560360.0558310.0055410.0931910.131531
I0.0435790.0586340.0709570.1505570.0938560.0382920.1121480.0827310.129799
J0.1709440.0491410.050540.0868550.004710.1234820.1257570.1078370.143655
K0.0480480.0624310.0684050.02740.0290220.136010.0123460.1643250.093428

4.4 计算第j项指标的信息熵值

指标x1x2x3x4x5x6x7x8x9
信息熵值0.9151320.9285910.8885450.8941660.8511470.927680.8840520.9191450.919939

4.5  计算各指标权重

指标x1x2x3x4x5x6x7x8x9
权重0.097370.0819280.1278740.1214240.170780.0829740.1330280.0927660.091855

4.6 计算得分

河流x1x2x3x4x5x6x7x8x9得分
A88631750534964243248.77173
B751243145331184229.30177
C79487362434872769865.44425
D739593420465445940.37694
E3670535100674254350.31363
F404692606819276847.95403
G2078359883703558154.82417
H672938332273477533.47667
I38302872462050427445.34118
J95252042135456548245.64744
K4032271422596815333.50219

由以上得分可得河流水质情况由好到差依次为C>G>E>A>F>J>I>D>K>H>B

5.代码实现

5.1 代码(Java)

package EWM;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.WriteException;

public class ewm {
	//private String filepath;//文件路径
	private double[][] orig; //原始矩阵
	private double[][] uniform;//归一化后的矩阵 
	int rows,cols;//存储Excel的行和列数
	
	Scanner input = new Scanner(System.in);
	
	//矩阵每列最大值
	public double[] Max(double[][] m) {
		double max[] = new double[m[0].length];
		for(int j=0;j < m[0].length;j++) {
			max[j] = m[0][j];
			for(int i=0;i < m.length;i++) {
				if(m[i][j] >= max[j]) {
					max[j] = m[i][j];
				}
			}
		}
		return max;
	}
	
	//矩阵每列最小值
	public double[] Min(double[][] m) {
		double min[] = new double[m[0].length];
		for(int j=0;j < m[0].length;j++) {
			min[j] = m[0][j];
			for(int i=0;i < m.length;i++) {
				if(m[i][j] <= min[j]) {
					min[j] = m[i][j];
				}
			}
		}
		return min;
	}
	
	public void matrixoutput(double[][] x) {
		for(int i=0;i<x.length;i++) {
			for(int j=0;j<x[0].length;j++) {
				System.out.print(x[i][j]+"   ");
			}
			System.out.println();
		}
	}
	
	//读取数据
	public double[][] read(String filepath) throws IOException, BiffException,WriteException {
		//创建输入流
		InputStream stream = new FileInputStream(filepath);
		//获取Excel文件对象
		Workbook  rwb = Workbook.getWorkbook(stream);
		//获取文件的指定工作表 默认的第一个
	    Sheet sheet = rwb.getSheet("Sheet1");
	    rows = sheet.getRows();
	    cols = sheet.getColumns();
	    orig = new double[rows][cols];
	    uniform = new double[rows][cols];
		//row为行
		for(int i=0;i<sheet.getRows();i++) {
			for(int j=0;j<sheet.getColumns();j++) {
				String[] str = new String[sheet.getColumns()];
		        Cell cell = null;
		        cell = sheet.getCell(j,i);    
			    str[j] = cell.getContents();
			    orig[i][j] = Double.valueOf(str[j]);
			    //uniform[i][j] = Double.valueOf(str[j]);
			}
	    }
		
		return orig;
	}
	
	//数据归一化
	public double[][] uniform(double[][] x) {
		List<Integer> neg = new ArrayList<Integer>();//存储逆向指标所在列
		
		for(int i=0;i<x.length;i++) {
			for(int j=0;j<x[0].length;j++) {
				uniform[i][j] = 0.998*(x[i][j] - Min(x)[j])/(Max(x)[j] - Min(x)[j]) + 0.002;
			}
		}
		
		System.out.println("数据中是否有逆向指标?是:1,否:2");
		int a = input.nextInt();
		if(a == 1) {
			System.out.println("输入逆向指标所在列(以“/”结尾):");
			while(!input.hasNext("/")) {
				neg.add(Integer.valueOf(input.nextInt()));
			}
			for(int i=0;i<x.length;i++) {
				for(int j=0;j<neg.size();j++) {
					uniform[i][neg.get(j)] = 0.998*(Max(x)[neg.get(j)] - x[i][neg.get(j)])/(Max(x)[neg.get(j)] - Min(x)[neg.get(j)]) + 0.002;
				}
			}
		}
			

		
		return uniform;
	}
	
	//确定第j个指标在第i个项目的比重Pij
	public double[][] Pig(double[][] m){
		double[][] p = new double[m.length][m[0].length];
		double[] sum = new double[m[0].length];
		//每列之和
 		for(int j=0;j<m[0].length;j++) {
 			sum[j] = 0;
			for(int i=0;i<m.length;i++) {
				sum[j] += m[i][j];
			}
		}
 		
 		for(int j=0;j<m[0].length;j++) {
			for(int i=0;i<m.length;i++) {
				p[i][j] = m[i][j]/sum[j];
			}
		}
 		
		return p;
	}
	
	//计算第j项指标的信息熵值eij
	public double[] Eij(double[][] p) {
		double[] e = new double[p[0].length];
		double k = 1/Math.log(p.length);
		double[] sum = new double[p[0].length];
		
 		for(int j=0;j<p[0].length;j++) {
 			sum[j] = 0;
			for(int i=0;i<p.length;i++) {
				sum[j] += p[i][j]*Math.log(p[i][j]);
			}
		}
 		
 		for(int j=0;j<p[0].length;j++) {
			e[j] = -1*k*sum[j];
		}
 		
 		return e;
	}
	
	//计算各指标的权值
	public double[] weight(double[] e) {
		double[] w = new double[e.length];
		double sum = 0;
		
		for(int j=0;j<e.length;j++) {
			sum += (1-e[j]);
		}
		
		for(int j=0;j<e.length;j++) {
			w[j] = (1-e[j])/sum;
		}
		
		return w;
	}
}
package EWM;

import java.io.IOException;

import jxl.read.biff.BiffException;
import jxl.write.WriteException;

public class ewmmain {
	public static void main(String args[]) throws BiffException, WriteException, IOException {
		ewm ewm = new ewm();
		
		double[][] a = ewm.read("ewm.xls");
		//输出原始矩阵,行为评价对象,列为评价指标
		System.out.println("原始矩阵为:");
		ewm.matrixoutput(a);
		
		double[][] x = ewm.uniform(a);
		System.out.println("标准化(归一化)矩阵:");
		ewm.matrixoutput(x);
		
		double[][] p = ewm.Pig(x);
		System.out.println("确定第j个指标在第i个项目的比重Pij矩阵:");
		ewm.matrixoutput(p);
		
		double[] e = ewm.Eij(p);
		System.out.println("确定第j个指标的信息熵值:");
		for(int i=0;i<e.length;i++) {
			System.out.print(e[i]+"    ");
		}
		System.out.println();
		
		double[] w = ewm.weight(e);
		System.out.println("确定各指标的权值:");
		for(int i=0;i<w.length;i++) {
			System.out.print(w[i]+"    ");
		}
	}
}

5.2 运行截图

  • 31
    点赞
  • 339
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
Matlab实现熵权法的步骤如下: 1. 进行数据的归一化处理。可以使用mapminmax函数将原始数据矩阵x进行归一化处理。在一些版本的Matlab中可能存在bug,需要进行额外的处理。可以使用以下代码进行归一化: [X,ps]=mapminmax(x'); % 归一化 ps.ymin=0.002; % 归一化后的最小值 ps.ymax=0.996; % 归一化后的最大值 ps.yrange=ps.ymax-ps.ymin; % 归一化后的极差 X=mapminmax(x',ps); % 反归一化回到原数据 X=X'; % X为归一化后的数据,n行(对象),m列(指标)。 2. 求解各元素的信息熵。可以使用以下代码计算信息熵: 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)); % 计算信息熵,使用log函数取自然对数 end end E = sum(E_ele./log(row)); % 计算此特征的信息熵 sum_E = sum(E) 3. 使用weight函数来实现熵值法计算各指标的权重和各行的得分。可以使用以下代码实现: function [s,w]=weight(x) [n,m]=size(x); % 返回对象个数n,指标个数m ... end 以上就是Matlab实现熵权法的基本步骤。在进行数据归一化后,通过计算各元素的信息熵,可以得到指标的权重。通过weight函数,可以得到各行的得分。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [熵权法及matlab实现](https://blog.csdn.net/weixin_42620091/article/details/86665391)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [数学建模熵权法EWM)matlab实例实现](https://blog.csdn.net/qq_52785473/article/details/122391016)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离陌lm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值