权重计算方法二:熵权法(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
    评论
spsstopsis熵权法是一种综合评价方法,结合了熵权法和topsis法。在使用spsstopsis熵权法进行分析时,首先使用熵权法计算各评价指标的权重,然后利用权重值对原始数据进行加权处理得到新数据。接下来,利用topsis法对新数据进行计算,得到评价对象的优劣排序结果。 具体来说,spsstopsis熵权法的步骤可以分为以下几个: 1. 方向处理:在进行评价指标计算之前,需要对数据进行方向处理。方向处理的目的是将所有指标的方向都调整为与评价目标一致,这样可以确保指标值越大越好或越小越好。 2. 量纲处理:由于不同评价指标可能具有不同的量纲,需要对原始数据进行量纲处理,将其转化为无量纲的相对指标值。常见的量纲处理方法包括标准化、极差法等。 3. 非负平移:在进行熵权法计算时,需要对处理后的数据进行非负平移,使其变为非负数。这样可以确保熵权法计算的准确性。 总结来说,spsstopsis熵权法是一种综合评价方法,通过熵权法计算权重和topsis法对数据进行计算,得到评价对象的排序结果。该方法在实际应用中可以帮助我们进行多指标综合评价和决策分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [面板数据熵权topsis法分析流程](https://blog.csdn.net/m0_37228052/article/details/130385846)[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: 100%"] [ .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、付费专栏及课程。

余额充值