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

2023-11-19

目录

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列的数据。

2.2 指标数据正向化

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

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

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

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

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

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

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

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

2.4 计算变异系数

计算每个指标的均值:

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

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

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

2.5 计算权重及得分

权重:

 得分:

 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;
	}

输出:

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;
	}

输出: 

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;
	}

输出;

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];
		}

输出:

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;
		}

 输出:

 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]);
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

权重计算方法三:变异系数法(Coefficient of Variation) 的相关文章

随机推荐

  • glog详解

    glog详解 1 glog的安装与使用 1 下载glog http code google com p google glog downloads detail name glog 0 3 3 tar gz 2 安装glog configu
  • 请用详细列出宝塔搭建Nacos的流程

    好的 为了在宝塔中搭建 Nacos 服务 您需要执行以下步骤 下载 Nacos 的最新版本并解压缩 使用文本编辑器打开 conf application properties 文件 并修改其中的数据库配置 使 Nacos 可以连接到您的数据
  • C++中队列的顺序存储

    队列 引言 示例 开发环境 运行结果 引言 队列先进先出 队头出队 队尾入队 其存储可以分为顺序存储和链式储存 本文记录队列的顺序存储 也就是队列中的元素存储的内存空间是连续的 这里使用数组来模拟线性队列 示例 直接上代码 SeqQueue
  • java arraylist 拷贝_Copy ArrayList的四种方式

    Copy ArrayList的四种方式 简介 ArrayList是我们经常会用到的集合类 有时候我们需要拷贝一个ArrayList 今天向大家介绍拷贝ArrayList常用的四种方式 使用构造函数 ArrayList有个构造函数 可以传入一
  • 第三周课程总结&实验报告一

    实验报告 1 打印输出所有的 水仙花数 所谓 水仙花数 是指一个3位数 其中各位数字立方和等于该数本身 例如 153是一个 水仙花数 实验代码 public class ShuiXianHua public static void main
  • L3-014 周游世界 (30 分)

    题目 题目链接 题解 DFS 采用的数据结构 vector 索引为起点 值为 终点 起点公司编号 当然你也可以保存终点公司编号 但是代码中的语句就需要改一下了 dfs 传入四个信息 当前节点 遇到的节点数 换乘数 当前节点所在公司的编号 由
  • python 的回调函数

    回调函数就是一个通过函数指针调用的函数 如果你把函数的指针 地址 作为参数传递给另一个函数 当这个指针被用来调用其所指向的函数时 我们就说这是回调函数 有些库函数 library function 却要求应用先传给它一个函数 好在合适的时候
  • 指针(一)

    这里写目录标题 一 什么是指针 二 指针和指针类型 三 野指针 四 指针运算 五 指针和数组 六 二级指针 七 指针数组 一 什么是指针 1 指针是内存中一个最小单元的编号 也就是地址 2 平时我们说的指针 通常指的是指针变量 是用来存放地
  • 大数据手册(Spark)--Spark基本概念

    文章目录 Spark 基本概念 Hadoop 生态 Spark 生态 Spark 基本架构 Spark运行基本流程 弹性分布式数据集 RDD Spark安装配置 Spark基本概念 Spark基础知识 PySpark版 Spark机器学习
  • 用户互动优化:微信营销系统实践

    在当今移动互联网时代 微信已经成为企业进行营销的重要平台之一 而用户互动作为营销的关键环节 对于提升品牌影响力 增强用户忠诚度至关重要 本文将深入探讨如何通过微信营销系统实践 优化用户互动 提升营销效果 建立更紧密的用户关系 1 理解用户互
  • 修改本地host文件加入可用ip使谷歌浏览器翻译插件重新生效

    修改本地host文件加入可用ip使谷歌浏览器翻译插件重新生效 第一步 找到host文件 可以使用这个工具进行对Hosts文件进行一个查找 鼠标放到对应路径上面 点击鼠标右键 选择打开路径就到对应 路径了 也可以复制到这个路径下面去找host
  • .NET6-Asp.Net Core webapi -从零开始的webapi项目

    本项目为本人22年毕设项目 后续会不断更新本篇文章 全部内容都会写在这一篇文章里 喜欢的请持续关注 一 如何创建 Asp Net Core webapi 项目 二 如何使用 EntityFrameWorkCore DbFirst 需要用到的
  • 人工智能 ai基础知识_如何使用人工智能改善基础医疗的成果和效率

    人工智能 ai基础知识 Only 7 percent of a message is based on the words it contains The rest 93 percent comes from the speaker s t
  • 第一个只出现一次的字符(Java)

    题目 在字符串中找出第一个只出现一次的字符 如输入 abaccdeff 则输出 b 第一思路 借助于数组来做 开辟一个长度为26的数组 用来存放字符串中每个字符出现的次数 这样第一次扫描去统计这个字符串中字符出现的次数 第二次去统计第一个出
  • [Leetcode] 3.无重复字符的最长子串

    题目描述 给定一个字符串 找出不含有重复字符的最长子串的长度 示例 给定 abcabcbb 没有重复字符的最长子串是 abc 那么长度就是3 给定 bbbbb 最长的子串就是 b 长度是1 给定 pwwkew 最长子串是 wke 长度是3
  • CUDA复制测试

    这里主要是测试了内存数据读写操作的几种方式 记录了一些测试结果 对于二维数组 10244 1024 4 1 二维线程格 每个线程对应一个元素 2 转换为int2类型 线程宽度减半 3 线程宽度和高度减半 单个线程操作邻近的4个元素 4 线程
  • 使用神经网络对手写体数字图片数据分类(MLP/PCA)

    使用神经网络对手写体数字图片数据分类 MLP PCA 使用sklearn neural network MLPClassifier类实现手写数字图片识别 MLP的常用的几个参数一般为activation 选择激活函数 如relu sigmo
  • 《2023新版JavaWeb开发教程》学习笔记总目录

    本篇文章是本人对于黑马程序员的 2023新版JavaWeb开发教程 的个人向知识点总结归类 用于巩固自身所学知识 以及查阅知识点和相关代码 并尝试养成做笔记的习惯 黑马程序员2023新版JavaWeb开发教程 实现javaweb企业开发全流
  • git status 展示的中文文件乱码

    乱码现象 解决方法 1 打开 项目根目录下的 git config 配置文件 2 在图中位置追加 quotepath false 效果图
  • 权重计算方法三:变异系数法(Coefficient of Variation)

    目录 1 原理简介 2 步骤详解 2 1 原始数据收集 2 2 指标数据正向化 2 3 数据标准化 消除量纲 2 4 计算变异系数 2 5 计算权重及得分 3 案例分析 3 1 获取原始数据 3 2 指标正向化 3 3 数据标准化 3 4