权重计算方法三:变异系数法(Coefficient of Variation)

这篇具有很好参考价值的文章主要介绍了权重计算方法三:变异系数法(Coefficient of Variation)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

目录

1.原理简介

2.步骤详解

2.1 原始数据收集

2.2 指标数据正向化

2.3 数据标准化(消除量纲)

2.4 计算变异系数

2.5 计算权重及得分

 3.案例分析

3.1 获取原始数据

3.2 指标正向化

3.3 数据标准化

3.4 计算变异系数

3.5 计算权重

 4.完整代码(Java)

4.1 方法类CoV.java

4.2 主类CoVmain.java



1.原理简介

        变异系数法是根据统计学方法计算得出系统各指标变化程度的方法,是直接利用各项指标所包含的信息,通过计算得到指标的权重,因此是一种客观赋权的方法。

        变异系数法根据各评价指标当前值与目标值的变异程度来对各指标进行赋权,若某项指标的数值差异较大,能明确区分开各被评价对象,说明该指标的分辨信息丰富,因而应给该指标以较大的权重;反之,若各个被评价对象在某项指标上的数值差异较小,那么这项指标区分各评价对象的能力较弱,因而应给该指标较小的权重。

2.步骤详解

2.1 原始数据收集

        假设一组数据中有m个指标,n条待评价样本,即一个n*m的矩阵,令其为X。其中xij表示第i行第j列的数据。

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

2.2 指标数据正向化

指标正向化的目的就是把所有的指标都转换为正向指标。

正向指标:又叫越大越优型指标,即该指标下的数据数值越大越好,例如成绩。

负向指标:又叫越小越优型指标,即该指标下的数据数值越小越好,例如排名。

对于正向指标:保持其原数据不变。

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

对于负向指标:采用如下方法。

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

 其中k为指定的任意系数,其值可为0.1,0.2等; max|xj|表示第 j 列数据(指标)绝对值的最大值。

2.3 数据标准化(消除量纲)

        由于不同的指标数据的单位不同,因此无法直接对其进行计算,而数据标准化的目的就是消除单位的影响,使所有数据都能够用同一种方法对其进行计算。令标准化后的数据矩阵为R.

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

2.4 计算变异系数

计算每个指标的均值:

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

计算每个指标的标准差(均方差):

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

        因为标准差可以描述取值的离散程度,即某指标的方差反映了该指标的的分辨能力, 所以可用标准差定义指标的权重。

计算每个指标的变异系数:

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

2.5 计算权重及得分

权重:

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

 得分:

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

 3.案例分析

        假设有以下数据,x1~x7为指标,ABC为三条待评价对象,其中x1和x4为负向指标,其余为正向指标。

x1 x2 x3 x4 x5 x6 x7
A 0.743 0.8267 0.8324 12 0.8637 0.0743 0.0409
B 0.7567 0.8033 0.8736 -10 0.8538 -0.0665 0.0716
C 0.8104 0.7667 0.8539 16 0.9038 0.0881 0.0657

3.1 获取原始数据

这里采用jxl包读取Excel。

//读取数据
	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];
	    pos = new double[rows][cols];
	    stand = 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;
	}

输出:

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

3.2 指标正向化

在此只需要对负向指标进行处理,正向指标保持原数据不变。

//指标正向化
	public double[][] positive(double[][] or){
		double k=0.1;
		pos=or;
		List<Integer> neg=new ArrayList<Integer>();//存储逆向指标所在列
		System.out.println("是否有逆向指标(越小越优型指标)?是:1否:2");
		int a=input.nextInt();
		double[] max=getMax(or);
		if(a==1) {
			System.out.println("输入逆向指标所在列(以“/”结尾):");
			while(!input.hasNext("/")) {
				neg.add(Integer.valueOf(input.nextInt()));
			}
			for(int i=0;i<orig.length;i++) {
				for(int j=0;j<neg.size();j++) {
					pos[i][neg.get(j)]=1/(k+max[neg.get(j)]+or[i][neg.get(j)]);
				}
			}
		}
		return pos;
	}

输出: 

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

3.3 数据标准化

//数据标准化
	public double[][] standar(double[][] p){
		double[] sum=new double[p[0].length];
		for(int i=0;i<p.length;i++) {
			for(int j=0;j<p[0].length;j++) {
				sum[j] += p[i][j]*p[i][j];
			}
		}
		for(int i=0;i<p.length;i++) {
			for(int j=0;j<p[0].length;j++) {
				stand[i][j] = p[i][j]/(Math.sqrt(sum[j]));
			}
		}
		return stand;
	}

输出;

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

3.4 计算变异系数

		//均值
		double[] sum=new double[st[0].length];
		for(int j=0;j<st[0].length;j++) {
			for(int i=0;i<st.length;i++) {
				sum[j] += st[i][j];
			}
			A[j]=sum[j]/st.length;
		}
		
		//标准差
		double[] sum1=new double[st[0].length];
		for(int j=0;j<st[0].length;j++) {
			for(int i=0;i<st.length;i++) {
				sum1[j] += (st[i][j]-A[j])*(st[i][j]-A[j]);
			}
			S[j]=Math.sqrt(sum1[j]/st.length);
		}
		
		//变异系数
		for(int j=0;j<st[0].length;j++) {
			V[j]=S[j]/A[j];
		}

输出:

变异系数法,数学建模,java,学习,算法,矩阵,数学建模

3.5 计算权重

		//各指标权重
		double sumv=0;
		for(int j=0;j<st[0].length;j++) {
			sumv += V[j];
		}
		for(int j=0;j<st[0].length;j++) {
			wi[j] = V[j]/sumv;
		}

 输出:

变异系数法,数学建模,java,学习,算法,矩阵,数学建模文章来源地址https://www.toymoban.com/news/detail-822985.html

 4.完整代码(Java)

4.1 方法类CoV.java

/*
 * 假设有m个方案,n个指标,憨憨为方案,列为指标
 * 变异系数法(Coefficient of variation method)计算步骤
 * 1.指标正向化:都转换为正向指标(越大越优型指标)
 * 2.数据标准化:消除负数和量纲影响
 * 3.计算变异系数:Aj(指标均值),Sj(指标标准差),则变异系数Vj=Sj/Aj
 * 4.计算权重:Wj=Vj/sum(Vj)
 */
package CoV;

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 CoV {
	private double[][] orig; //原始矩阵
	private double[][] pos;//正向化矩阵
	private double[][] stand;//标准化后的矩阵 
	int rows,cols;//存储Excel的行和列数
	
	Scanner input = new Scanner(System.in);
	
	//矩阵每列绝对值最大值
	public double[] getMax(double[][] m) {
		double max[] = new double[m[0].length];
		for(int j=0;j < m[0].length;j++) {
			max[j] = Math.abs(m[0][j]);
			for(int i=0;i < m.length;i++) {
				if(Math.abs(m[i][j]) >= max[j]) {
					max[j] = Math.abs(m[i][j]);
				}
			}
		}
		return max;
	}
	
	//输出二维矩阵
	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(String.format("%.3f\t", x[i][j]));
			}
			System.out.println();
		}
	}
	
	//输出一维矩阵
	public void matrixoutput1(double[] x) {
		for(int i=0;i<x.length;i++) {
			System.out.print(String.format("%.3f\t", x[i]));
		}
		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];
	    pos = new double[rows][cols];
	    stand = 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[][] positive(double[][] or){
		double k=0.1;
		pos=or;
		List<Integer> neg=new ArrayList<Integer>();//存储逆向指标所在列
		System.out.println("是否有逆向指标(越小越优型指标)?是:1否:2");
		int a=input.nextInt();
		double[] max=getMax(or);
		if(a==1) {
			System.out.println("输入逆向指标所在列(以“/”结尾):");
			while(!input.hasNext("/")) {
				neg.add(Integer.valueOf(input.nextInt()));
			}
			for(int i=0;i<orig.length;i++) {
				for(int j=0;j<neg.size();j++) {
					pos[i][neg.get(j)]=1/(k+max[neg.get(j)]+or[i][neg.get(j)]);
				}
			}
		}
		return pos;
	}
	
	//数据标准化
	public double[][] standar(double[][] p){
		double[] sum=new double[p[0].length];
		for(int i=0;i<p.length;i++) {
			for(int j=0;j<p[0].length;j++) {
				sum[j] += p[i][j]*p[i][j];
			}
		}
		for(int i=0;i<p.length;i++) {
			for(int j=0;j<p[0].length;j++) {
				stand[i][j] = p[i][j]/(Math.sqrt(sum[j]));
			}
		}
		return stand;
	}
	
	//计算变异系数、权重和得分
	public double[][] weigth(double[][] st) {
		double[] A=new double[st[0].length];
		double[] S=new double[st[0].length];
		double[] V=new double[st[0].length];
		double[] wi=new double[st[0].length];
		double[][] W=new double[4][st[0].length];
		
		//均值
		double[] sum=new double[st[0].length];
		for(int j=0;j<st[0].length;j++) {
			for(int i=0;i<st.length;i++) {
				sum[j] += st[i][j];
			}
			A[j]=sum[j]/st.length;
		}
		
		//标准差
		double[] sum1=new double[st[0].length];
		for(int j=0;j<st[0].length;j++) {
			for(int i=0;i<st.length;i++) {
				sum1[j] += (st[i][j]-A[j])*(st[i][j]-A[j]);
			}
			S[j]=Math.sqrt(sum1[j]/st.length);
		}
		
		//变异系数
		for(int j=0;j<st[0].length;j++) {
			V[j]=S[j]/A[j];
		}
		
		//各指标权重
		double sumv=0;
		for(int j=0;j<st[0].length;j++) {
			sumv += V[j];
		}
		for(int j=0;j<st[0].length;j++) {
			wi[j] = V[j]/sumv;
		}
		
		for(int j=0;j<st[0].length;j++) {
			W[0][j] = A[j];
			W[1][j] = S[j];
			W[2][j] = V[j];
			W[3][j] = wi[j];
		}
		
		return W;
		
	}
	
}

4.2 主类CoVmain.java

package CoV;

import java.io.IOException;

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

public class CoVmain {
	public static void main(String args[]) throws BiffException, WriteException, IOException {
		CoV cov=new CoV();
		
		double[][] orig = cov.read("cov.xls");
		//输出原始矩阵,行为评价对象,列为评价指标
		System.out.println("原始矩阵为:");
		cov.matrixoutput(orig);
		
		double[][] pos = cov.positive(orig);
		System.out.println("正向化矩阵为:");
		cov.matrixoutput(pos);
		
		double[][] stand = cov.standar(pos);
		System.out.println("标准化矩阵为:");
		cov.matrixoutput(stand);
		
		double[][] W = cov.weigth(stand);
		//输出每个指标的均值、标准差、变异系数和权重,依次按行排列
		System.out.println("均值矩阵为:");
		cov.matrixoutput1(W[0]);
		System.out.println("标准差矩阵为:");
		cov.matrixoutput1(W[1]);
		System.out.println("变异系数矩阵为:");
		cov.matrixoutput1(W[2]);
		System.out.println("权重矩阵为:");
		cov.matrixoutput1(W[3]);
	}
}

到了这里,关于权重计算方法三:变异系数法(Coefficient of Variation)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数学建模:变异系数法

    🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 变异系数法的设计原理是: 若某项指标的 数值差异较大 ,能明确区分开各被评价对象,说明该指标的分辨信息丰富,因而应给该指标以 较大的权重 ; 若某项指标的 数值差异较小 ,那么这项指标区分各评价对象的能力较弱

    2024年02月11日
    浏览(40)
  • 三种客观赋权法——熵权法、变异系数法、CRITIC

            在计算权值之前,需要对原始的数据进行一定的处理。         数据的清洗是解决问题的第一步,包括 缺失值处理和异常值处理 两方面。         对于缺失值,通常有三种可选的操作——删除、插补、不处理。其中插补的方式有很多,例如均值插补、固定值插

    2023年04月16日
    浏览(34)
  • 13种权重的计算方法

    权重计算方法有很多种,不同的方法有不同的特点和适用情况。AHP层次分析法和熵值法在权重计算中属于比较常用的方法。除此之外,还有一些与权重计算相关的方法,今天一文总结了13种与权重计算相关的方法,大家可以对比选择使用。 一句话简单描述13种权重计算方法,

    2024年02月05日
    浏览(33)
  • 熵权法计算权重

    基于信息论的熵值法是根据各指标所含信息有序程度的差异性来确定指标权重的客观赋权方法,仅依赖于数据本身的离散程度。 熵用于度量不确定性,指标的离散程度越大(不确定性越大)则熵值越大,表明指标值提供的信息量越多,则该指标的权重也应越大。 熵权法多用

    2024年02月04日
    浏览(47)
  • python计算相关系数R

    方法一: 方法二 参考:https://mp.weixin.qq.com/s/nABJf4WBR4Y4oEZiYKPK4Q

    2024年02月13日
    浏览(36)
  • Web 基尼系数的计算

    2024年01月23日
    浏览(46)
  • 什么是网站权重?网站权重查询方法有哪些?

    什么是网站权重?网站权重查询方法有哪些? 什么是网站权重? 网站权重是搜索引擎给网站赋予的权威值。 网站权重不等于网站排名,但是影响网站排名。 网站权重查询的方法: 方法一:用SEO查询工具。 具体操作如下: 打开SEO查询工具,输入网站域名,选择要查询的功能

    2024年02月10日
    浏览(50)
  • js计算皮尔逊相关系数

    代码如下; 调用:  效果:

    2024年01月25日
    浏览(40)
  • 信度系数的计算公式你了解吗?

    信度分析用于测量样本回答结果是否可靠,即样本有没有真实作答量表类题项。 重要提示: 信度分析仅仅是针对 量表数据,非量表数据一般不进行信度分析。 1.SPSSAU操作如下图: SPSSAU仪表盘 2.案例背景 此案例分析心理学中研究运动员意志品质的调查问卷数据,共对312人进行

    2024年02月05日
    浏览(42)
  • 众智科学:计算聚集系数和邻里重叠度

    实验内容: 输入:任意的 有向图 输出: 1)每个节点的聚集系数 2)每个节点对的邻里重叠度 相关定义介绍: 聚集系数:节点A的聚集系数 = A的任意两个朋友之间也是朋友的概率(即邻居间朋友对的个数除以总对数) 邻里重叠度:与A、B均为邻居的节点数/ 与节点A、B中至少

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包