从零开始的数模(十九)组合赋权法

Posted 烟雨平生9527

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的数模(十九)组合赋权法相关的知识,希望对你有一定的参考价值。

目录

一、概念

1.1相关概念

1.2原理

 二、基于python的组合赋权法

2.1 读取数据

完整代码

三、基于MATLAB的组合赋权法

完整代码


一、概念

1.1相关概念

主观赋权法(AHP)在根据决策者意图确定权重方面比客观赋权法(熵权法)具有更大的优势,但客观性相对较差,主观性相对较强;

        而采用客观赋权法有着客观优势,但不能反映出参与决策者对不同指标重视程度,并且会有一定的权重和与实际指标相反的程度。

        针对主客观赋权方法的优缺点,我们还力求将主观随机性控制在一定范围内,实现主客观赋权中的中正。客观方面。指标赋权公正,实现了主客观内在统一,评价结果真实、科学、可信。

        因此,在对指标进行权重分配时,应考虑指标数据之间的内在统计规律和权威值。给出了合理的决策指标赋权方法,即采用主观赋权法(AHP)和客观赋权法(熵权法)相结合的组合赋权方法,以弥补单一赋权带来的不足。将两种赋权方法相结合的加权方法称为组合赋权法。

注意:本文所介绍的组合权重法请大家结合实际情况慎重使用,因为这个方法不太好


1.2原理

1.2.1 指标正向化

1.2.2 数据标准化 

1.2.3 计算主观权重 

 1.2.4 计算客观权重

1.2.5 计算组合权重

1. 2.6 计算的得分

 二、基于python的组合赋权法

2.1 读取数据

data = pd.read_excel('D:\\桌面\\zuhefuquan.xlsx')
# print(data)
label_need=data.keys()[1:]#提取变量名
# print(label_need)
data1=data[label_need].values #只提取数据
print(data1)

 

 2.2 指标正向化

本实例中P1、P3属于此类指标

因此负向指标正向化

#越小越优指标位置,注意python是从0开始计数,对应位置也要相应减1
data2 = data1
index=[1,3] 
for i in range(0,len(index)):
    data2[:,index[i]]=max(data1[:,index[i]])-data1[:,index[i]]
print(data2)

在对剩余正向指标数据可以不做处理 

2.3 数据范围标准化

#0.002~1区间归一化
[m,n]=data2.shape #查看行数和列数
data3=data2
ymin=0.002
ymax=1
for j in range(0,n):
    d_max=max(data2[:,j])
    d_min=min(data2[:,j])
    data3[:,j]=(ymax-ymin)*(data2[:,j]-d_min)/(d_max-d_min)+ymin
print(data3)

2.4 计算主观权重 

#求特征值和特征向量
V,D = np.linalg.eig(data3)
# print('特征值:')
# print(V)
# print('特征向量:')
# print(D)
#最大特征值
tzz = np.max(V)
# print(tzz)
#最大特征向量
k=[i for i in range(len(V)) if V[i] == np.max(V)]
tzx = -D[:,k]
# print(tzx)
# #赋权重
quan=np.zeros((n,1))
for i in range(0,n):
    quan[i]=tzx[i]/np.sum(tzx)
a=quan.T
print(a)

2.5 计算客观权重

#计算信息熵
p=data3
for j in range(0,n):
    p[:,j]=data3[:,j]/sum(data3[:,j])
# print(p)
E=data3[0,:]
for j in range(0,n):
    E[j]=-1/np.log(m)*sum(p[:,j]*np.log(p[:,j]))
# print(E)
# 计算权重
b=(1-E)/sum(1-E)
print(b)

 

2.6 计算组合权重 

#计算组合权重
w=b
sum=0
for i in range(n):
    sum = sum + np.sqrt(a[i]*b[i])
#     print(sum)
for i in range(n):
    w[i] = np.sqrt(a[i]*b[i])/sum
print(w)

2.7 计算得分 

#计算得分
s=np.dot(data3,w)
Score=100*s/max(s)
for i in range(0,len(Score)):
    print(f"方案i百分制评分为::Score[i]")

完整代码

#导入相关库
import pandas as pd
import numpy as np
#读取数据
data = pd.read_excel('D:\\桌面\\zuhefuquan.xlsx')
# print(data)
label_need=data.keys()[1:]#提取变量名
# print(label_need)
data1=data[label_need].values #只提取数据
print(data1)
 
#越小越优指标位置,注意python是从0开始计数,对应位置也要相应减1
data2 = data1
index=[1,3] 
for i in range(0,len(index)):
    data2[:,index[i]]=max(data1[:,index[i]])-data1[:,index[i]]
print(data2)
 
#0.002~1区间归一化
[m,n]=data2.shape #查看行数和列数
data3=data2
ymin=0.002
ymax=1
for j in range(0,n):
    d_max=max(data2[:,j])
    d_min=min(data2[:,j])
    data3[:,j]=(ymax-ymin)*(data2[:,j]-d_min)/(d_max-d_min)+ymin
print(data3)
 
#求特征值和特征向量
V,D = np.linalg.eig(data3)
# print('特征值:')
# print(V)
# print('特征向量:')
# print(D)
#最大特征值
tzz = np.max(V)
# print(tzz)
#最大特征向量
k=[i for i in range(len(V)) if V[i] == np.max(V)]
tzx = -D[:,k]
# print(tzx)
# #赋权重
quan=np.zeros((n,1))
for i in range(0,n):
    quan[i]=tzx[i]/np.sum(tzx)
a=quan.T
print(a)
 
#计算信息熵
p=data3
for j in range(0,n):
    p[:,j]=data3[:,j]/sum(data3[:,j])
# print(p)
E=data3[0,:]
for j in range(0,n):
    E[j]=-1/np.log(m)*sum(p[:,j]*np.log(p[:,j]))
# print(E)
# 计算权重
b=(1-E)/sum(1-E)
print(b)
 
#计算组合权重
w=b
sum=0
for i in range(n):
    sum = sum + np.sqrt(a[i]*b[i])
#     print(sum)
for i in range(n):
    w[i] = np.sqrt(a[i]*b[i])/sum
print(w)
 
#计算得分
s=np.dot(data3,w)
Score=100*s/max(s)
for i in range(0,len(Score)):
    print(f"方案i百分制评分为::Score[i]")

三、基于MATLAB的组合赋权法

3.1 读取数据

data=xlsread('D:\\桌面\\zuhefuquan.xlsx')

3.2 指标正向化

本实例中P1、P3属于此类指标

因此负向指标正向化

data1=data;
%%越小越优型处理
index=[1,3];%越小越优指标位置
for i=1:length(index)
  data1(:,index(i))=max(data(:,index(i)))-data(:,index(i));
end
data1

在对剩余正向指标数据可以不做处理 

3.3 数据范围标准化

为什么不做0,1的标准化呢,因为一标准化有不少数据变成了0,对结果起到副作用

data1=mapminmax(data1',0.02,1) %标准化到0.002-1区间

3.4 计算主观权重

%求特征值特征向量,找到最大特征值对应的特征向量
[V,D]=eig(data1);
tzz=max(max(D));     %找到最大的特征值
c1=find(D(1,:)==tzz);%找到最大的特征值位置
tzx=V(:,c1) %最大特征值对应的特征向量
%赋权重
[n,m]=size(data); %查看数据行数和列数
quan=zeros(n,1);
for i=1:n
quan(i,1)=tzx(i,1)/sum(tzx);
end
a=quan'

3.5 计算客观权重

data3 = data1;
%得到信息熵
[m,n]=size(data3);
p=zeros(m,n);
for j=1:n
    p(:,j)=data3(:,j)/sum(data3(:,j));
end
for j=1:n
   E(j)=-1/log(m)*sum(p(:,j).*log(p(:,j)));
end
%计算权重
b=(1-E)/sum(1-E)

 

 3.6 计算组合权重

%计算得分
s=data1*w';
Score=100*s/max(s);
for i=1:length(Score)
    fprintf('方案%d百分制评分为:%4.2f\\n',i,Score(i));   
end

3.7 计算得分

%计算得分
s=data1*w';
Score=100*s/max(s);
for i=1:length(Score)
    fprintf('方案%d百分制评分为:%4.2f\\n',i,Score(i));   
end

 

完整代码

%组合赋权法
clc;clear;
data=xlsread('D:\\桌面\\zuhefuquan.xlsx');
data1=data;
%%越小越优型处理
index=[1,3];%第一三个指标为负向指标,
for i=1:length(index)
  data1(:,index(i))=max(data(:,index(i)))-data(:,index(i));
end
data1;
data1=mapminmax(data1',0.02,1); %标准化到0.002-1区间
data2 = data1;
%求特征值特征向量,找到最大特征值对应的特征向量
[V,D]=eig(data2);
tzz=max(max(D));     %找到最大的特征值
c1=find(D(1,:)==tzz);%找到最大的特征值位置
tzx=V(:,c1); %最大特征值对应的特征向量
%赋权重
[n,m]=size(data); %查看数据行数和列数
quan=zeros(n,1);
for i=1:n
quan(i,1)=tzx(i,1)/sum(tzx);
end
a=quan';
 
data3 = data1;
%得到信息熵
[m,n]=size(data3);
p=zeros(m,n);
for j=1:n
    p(:,j)=data3(:,j)/sum(data3(:,j));
end
for j=1:n
   E(j)=-1/log(m)*sum(p(:,j).*log(p(:,j)));
end
%计算权重
b=(1-E)/sum(1-E);
w=b;
sum = 0;
for i=1:n
sum=sum+sqrt(a(i)*b(i));
end
for i=1:n
w(i)=sqrt(a(i)*b(i))/sum;
end
w;
%计算得分
s=data1*w';
Score=100*s/max(s);
for i=1:length(Score)
    fprintf('方案%d百分制评分为:%4.2f\\n',i,Score(i));   
end

以上是关于从零开始的数模(十九)组合赋权法的主要内容,如果未能解决你的问题,请参考以下文章

从零开始的数模(十六)神经网络

数学建模MATLAB应用实战系列(八十八)-组合权重法应用案例(附MATLAB和Python代码)

从零开始学习CANoe(十九)—— Python和CANoe的数据交互

从零开始的linux 第十九章(mv命令详解)

从零开始学安全(二十九)●上传漏洞代码分析

数学建模MATLAB应用实战系列(八十九)-CRITIC法应用案例(附MATLAB和Python代码)