从零开始的数模(十九)组合赋权法
Posted 烟雨平生9527
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的数模(十九)组合赋权法相关的知识,希望对你有一定的参考价值。
目录
一、概念
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代码)