从零开始的数模(二十)变异系数法

一、概念

1.1相关概念

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

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


1.2.算法原理

1.2.1 指标正向化

1.2.2 数据标准化 

1.2.3 计算变异系数 

1.2.4 计算权重以及得分 

 二、基于python的变异系数法

2.1问题描述

2.2代码实现

import pandas as pd
import numpy as np

#读取数据
data=pd.read_excel('风场运行数据.xlsx')

#数据正向化处理
label_need=data.keys()[1:]
data1=data[label_need].values
data2=data1.copy()
index=[3,5,6] #越小越优指标位置,注意python是从0开始计数,对应位置也要相应减1
k=0.1
for i in range(0,len(index)):
    data2[:,index[i]]=1/(k+max(abs(data1[:,index[i]]))+data1[:,index[i]])

#数据标准化
[m,n]=data2.shape
data3=data2.copy()
for j in range(0,n):
    data3[:,j]=data2[:,j]/np.sqrt(sum(np.square(data2[:,j])))

#计算变异系数
A=np.average(data3, axis=0)
S=np.std(data3, axis=0)
V=S/A

# 计算权重
w=V/sum(V)

#计算得分
s=np.dot(data3,w)
Score=100*s/max(s)
for i in range(0,len(Score)):
    print(f"第{i+1}个风场百分制得分为:{Score[i]}")

三、基于MATLAB的变异系数法

3.1 读取数据

data=xlsread('D:\桌面\变异系数.xlsx')

 3.2 指标正向化

%指标正向    化处理后数据为data1
data1=data;
%%负向指标(越小越优型指标)处理
index=[4,6,7];%负向指标位置
k=0.1;
for i=1:length(index)
  data1(:,index(i))=1./(k+max(abs(data(:,index(i))))+data(:,index(i)))
end

 3.3 数据标准化

%数据标准化 
data2=data1;
for j=1:size(data1,2)
    data2(:,j)= data1(:,j)./sqrt(sum(data1(:,j).^2));
end
data2

3.4 计算变异系数 

%计算变异系数
A=mean(data2) %求每列平均值
S=std(data2)  %求每列方差
V=S./A %变异系数

3.5 计算权重

%计算权重
w=V./sum(V)

 3.6 计算得分 

%计算得分
s=data2*w';
Score=100*s/max(s);
for i=1:length(Score)
    %A(i,:)=[row(i), col(i), rho_1(row(i), col(i))];
    fprintf('第%d个风场百分制评分为:%d\n',i,Score(i));   
end

完整代码 

clc;clear;
data=xlsread('D:\桌面\变异系数.xlsx');
%指标正向    化处理后数据为data1
data1=data;
%%负向指标(越小越优型指标)处理
index=[4,6,7];%负向指标位置
k=0.1;
for i=1:length(index)
  data1(:,index(i))=1./(k+max(abs(data(:,index(i))))+data(:,index(i)));
end
%数据标准化 
data2=data1;
for j=1:size(data1,2)
    data2(:,j)= data1(:,j)./sqrt(sum(data1(:,j).^2));
end
data2;
%计算变异系数
A=mean(data2); %求每列平均值
S=std(data2);  %求每列方差
V=S./A; %变异系数
%计算权重
w=V./sum(V);
%计算得分
s=data2*w';
Score=100*s/max(s);
for i=1:length(Score)
    %A(i,:)=[row(i), col(i), rho_1(row(i), col(i))];
    fprintf('第%d个风场百分制评分为:%d\n',i,Score(i));   
end

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
变异系数法是一种多属性决策分析方法,用于确定各决策因素的权重。它与CRITIC权重法类似,也是基于主观判断和专家意见,但是它不需要构建判断矩阵,而是直接对各指标的变异程度进行评估,从而计算出权重。 其步骤如下: 1. 确定决策因素及其指标。 2. 对各指标进行归一化处理。 3. 计算各指标的变异系数,即标准差除以平均值。 4. 根据变异系数计算各指标的权重。 变异系数法适用于各指标之间的相关性较小的情况,但是在指标之间存在显著相关性的情况下,其结果可能会失真。 以下是使用Python实现变异系数法的示例代码: ```python import numpy as np # 构建决策矩阵,这里以三个决策因素为例,每个因素有三个指标 decision_matrix = np.array([ [10, 15, 20], [5, 10, 15], [20, 25, 30] ]) # 归一化决策矩阵 normalized_matrix = np.zeros_like(decision_matrix) for i in range(decision_matrix.shape[0]): sum_of_row = np.sum(decision_matrix[i]) for j in range(decision_matrix.shape[1]): normalized_matrix[i][j] = decision_matrix[i][j] / sum_of_row # 计算变异系数 std_dev = np.std(normalized_matrix, axis=0) mean = np.mean(normalized_matrix, axis=0) variation_coefficient = std_dev / mean # 计算权重 weight_vector = variation_coefficient / np.sum(variation_coefficient) print("决策因素的权重为:", weight_vector) ``` 这段代码中,首先构建了一个决策矩阵`decision_matrix`,然后对其进行归一化,得到`normalized_matrix`。 接着,使用`np.std`和`np.mean`函数分别计算出各指标的标准差和平均值,从而得到变异系数`variation_coefficient`。 最后,通过`variation_coefficient`计算出各指标的权重向量`weight_vector`即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

烟雨平生9527

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

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

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

打赏作者

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

抵扣说明:

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

余额充值