组合赋权法之matlab
目录1.简介2.算法原理2.1 指标正向化2.2 数据标准化2.3 计算主观权重2.4 计算客观权重2.5 计算组合权重2.6 计算的得分3.实例分析3.1 读取数据3.2 指标正向化3.3 数据范围标准化3.4 计算主观权重3.5 计算客观权重3.6 计算组合权重3.7 计算得分完整代码
目录
1.简介
主观赋权法(AHP)在根据决策者意图确定权重方面比客观赋权法(熵权法)具有更大的优势,但客观性相对较差,主观性相对较强;
而采用客观赋权法有着客观优势,但不能反映出参与决策者对不同指标重视程度,并且会有一定的权重和与实际指标相反的程度。
针对主客观赋权方法的优缺点,我们还力求将主观随机性控制在一定范围内,实现主客观赋权中的中正。客观方面。指标赋权公正,实现了主客观内在统一,评价结果真实、科学、可信。
因此,在对指标进行权重分配时,应考虑指标数据之间的内在统计规律和权威值。给出了合理的决策指标赋权方法,即采用主观赋权法(AHP)和客观赋权法(熵权法)相结合的组合赋权方法,以弥补单一赋权带来的不足。将两种赋权方法相结合的加权方法称为组合赋权法。
注意:本文所介绍的组合权重法请大家结合实际情况慎重使用,因为这个方法不太好
2.算法原理
2.1 指标正向化
这个步骤视情况自己决定把。。。。
不同的指标代表含义不一样,有的指标越大越好,称为越大越优型指标。有的指标越小越好,称为越小越优型指标,而有些指标在某个点是最好的,称为某点最优型指标。为方便评价,应把所有指标转化成越大越优型指标。
设有m个待评对象,n个评价指标,可以构成数据矩阵
设数据矩阵内元素,经过指标正向化处理过后的元素为 (Xij)'
-
越小越优型指标:C,D属于此类指标
其他处理方法也可,只要指标性质不变即可
-
某点最优型指标:E属于此类指标
设最优点为a, 当a=90时E最优。
其他处理方法也可,只要指标性质不变即可
-
越大越优型指标:其余所有指标属于此类指标
此类指标可以不用处理,想要处理也可,只要指标性质不变
2.2 数据标准化
因为每个指标的数量级不一样,需要把它们化到同一个范围内再比较。标准化的方法比较多,这里仅用最大最小值标准化方法。
设标准化后的数据矩阵元素为rij,由上可得指标正向化后数据矩阵元素为 (Xij)'
2.3 计算主观权重
- 得到最大特征值对应特征向量
- 得到权重向量
2.4 计算客观权重
- 计算信息熵
- 得到权重
2.5 计算组合权重
主客观组合权重是:指标的综合权数 Wj :
αj——层次分析法计算所得的权重
βj ——熵值法计算所得权重
2.6 计算的得分
3.实例分析
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 计算组合权重
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
返回:
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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)