我最近在学习数学建模,希望把我学到的东西都记录下来。尤其是记录一些模型的思路和代码,这样以后比赛的时候就能拿过来直接用了。由于本人水平有限,所以文章侧重于模型的应用,而模型背后的原理将不会加以证明。
我最近在做2021年国赛的C题,这道题是一道典型的评价类问题。本文将主要针对此题展开研究,介绍一下评价类问题常用的几种方法。
假设有m家公司,n个指标(假设均为正向化指标)。给出这m家公司关于这n个指标的所有数据,这些数据构成一个m行n列的矩阵,记为 A A A, A = ( a i j ) m ∗ n A=(a_{ij})_{m*n} A=(aij)m∗n。现要求对这m家公司进行排名。
公司 | 指标1 | 指标2 | …… | 指标n |
---|---|---|---|---|
公司1 | a 11 a_{11} a11 | a 12 a_{12} a12 | …… | a 1 n a_{1n} a1n |
公司2 | a 21 a_{21} a21 | a 22 a_{22} a22 | …… | a 2 n a_{2n} a2n |
…… | …… | …… | …… | …… |
公司m | a m 1 a_{m1} am1 | a m 2 a_{m2} am2 | …… | a m n a_{mn} amn |
题干描述非常简单,就是要依赖给出的这些数据,建立一个评价类模型,来评价这些公司。而评价类问题的重中之重,则是确定各个指标之间权重。评价类的模型主要有层次分析法,熵权法,TOPSIS法,模糊综合评价法,灰色关联分析等方法。前三种算法在此题中应用较好,后两种算法不太适合这道题。接下来重点介绍一下前三种算法。
层次分析法,又叫AHP。层次分析法得名是因为其需要构造一个层次结构。AHP对目标的各个指标之间逐一进行比较,得到权重。若各个指标的具体数据(即题干中的矩阵A)没有明确给出,也可以两两比较,从而得到具体数据矩阵。该方法的核心是层次结构和两两比较的方法。
层次结构分为目标层、准则层和方案层。目标层就是我们最终要达到的目标和结果。在此题中,我们的目标就是对这m家公司进行一个排序,那么目标也可以写成选择最强的公司。准则层就是我们达成目标层的判断依据,自然就是这n个指标了。方案层是和目标层相对应的,目标层就是要在方案层中选择一个方案。方案层也可以理解为是研究对象,我们的研究对象就是这m个公司。根据题意,画出下面的层次结构。
这n个指标的重要程度肯定是不一样的,我们需要定出这n个指标的权重。由于指标比较多,直接定权重难度较大,且主观因素太强,故我们采用的方法是对这些指标两两进行比较,从而在一定程度上削弱主观因素。设判断矩阵为B,B= ( b i j ) n ∗ n (b_{ij})_{n*n} (bij)n∗n。定义 b i j b_{ij} bij为与指标j相比,i的重要程度。 b i j b_{ij} bij具体的定法参见下表。
标度 | 含义 |
---|---|
1 | 表示两个因素相比,具有同样的重要性 |
3 | 表示两个因素相比,一个因素比另一个因素稍微重要 |
5 | 表示两个因素相比,一个因素比另一个因素明显重要 |
7 | 表示两个因素相比,一个因素比另一个因素强烈重要 |
9 | 表示两个因素相比,一个因素比另一个因素极端重要 |
2,4,6,8 | 上述两相邻判断的中值 |
倒数 | A和B相比,如果标度为3,那么B和A相比就是 1 3 \frac{1}{3} 31 |
人为构造的矩阵B就是层次分析法中的判断矩阵。 |
根据定义, b i j = i 的重要程度 j 的重要程度 b_{ij}=\frac{i的重要程度}{j的重要程度} bij=j的重要程度i的重要程度, b j k = j 的重要程度 k 的重要程度 b_{jk}=\frac{j的重要程度}{k的重要程度} bjk=k的重要程度j的重要程度, b i k = i 的重要程度 k 的重要程度 b_{ik}=\frac{i的重要程度}{k的重要程度} bik=k的重要程度i的重要程度,那么就应该有 b i k = b i j ∗ b j k b_{ik}=b_{ij}*b_{jk} bik=bij∗bjk成立。但是,实际上,这些值都是我们人为设定的,所以这个式子不一定成立。我们允许判断矩阵B不那么完美,但是误差也不能太大。这个时候就要进行一致性检验,看看这个矩阵的一致性误差是否在我们允许的范围内。矩阵的一致性检验有一套固定的流程,接下来不加证明地给出这一套流程。
设 λ m a x \lambda_{max} λmax为B的最大特征根, C I = λ m a x − n n − 1 CI=\frac{\lambda_{max}-n}{n-1} CI=n−1λmax−n
查阅下表可获得平均一致性指标RI的值。
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
RI | 0 | 0 | 0.58 | 0.90 | 1.12 | 1.24 | 1.32 | 1.41 | 1.45 |
C R = C I R I CR=\frac{CI}{RI} CR=RICI
当CR < 0.10时,认为判断矩阵的一致性是可以接受的,否则应对判断矩阵作适当修正。
构造出一个能通过一致性检验的判断矩阵之后,就可以利用这个矩阵求权重了。求权重有三种方法,接下来依次介绍。一般用第三种方法会多一些,但在实际应用中,也可以把三种方法得到的结果取平均值,得到最终的权重。
如果光看判断矩阵的每一列的话,我们不难发现,其实每一列归一化(每个元素除以其所在列的和)之后就是一个权重向量。但是每一列求得的权重向量不一定相同,所以对这n列求算术平均值就可以得到权重向量了。
那么算术平均值求得的第i个指标的权重 ω i = 1 n ∑ j = 1 n a i j ∑ k = 1 n a k j \omega_{i}=\frac{1}{n} \sum_{j=1}^{n}{\frac{a_{ij}}{\sum_{k=1}^{n}{a_{kj}}}} ωi=n1∑j=1n∑k=1nakjaij
在算术平均法求权重中,我们对于各列是采用算术平均的,那么其实也可以采用几何平均。
用几何平均值求得的第i个指标的权重 ω i = ( ∏ j = 1 n a i j ) 1 n ∑ k = 1 n ( ∏ j = 1 n a k j ) 1 n \omega_{i}=\frac{(\prod_{j=1}^{n}{a_{ij}})^{\frac{1}{n}}}{\sum_{k=1}^{n}(\prod_{j=1}^{n}{a_{kj}})^{\frac{1}{n}}} ωi=∑k=1n(∏j=1nakj)n1(∏j=1naij)n1
由于我们的判断矩阵通过了一致性检验,故可以用一致矩阵求权重的方法来做。我们求出矩阵B的最大特征值 λ m a x \lambda_{max} λmax及其对应的特征向量,并对该特征向量进行归一化就可以得到我们的权重了。
下面是用matlab写的代码。(代码不是我写的,原文链接:https://blog.csdn.net/qq_52785473/article/details/122442010)
data表示判断矩阵,可根据需要输入,或者从文件中获取。输出的是每个指标的权重 ω i \omega_{i} ωi。有了每个指标的权重之后,要比较公司的重要性,只需要加权平均,然后排序就可以了,这个工作非常简单,代码没有给出。
data = [1 1/2 4 3 3
2 1 7 5 5
1/4 1/7 1 1/2 1/3
1/3 1/5 2 1 1
1/3 1/5 3 1 1];%需要检验的一致性矩阵
[n,m]=size(data);
%求特征值特征向量,找到最大特征值对应的特征向量
[V,D]=eig(data);%求矩阵的特征值和特征向量,V为特征向量矩阵,D为特征值矩阵。
lenda=max(D);
lendada=max(lenda);%求对角线向量
col = find(D(1,:) == max(lenda));%求最大特征值
lenda_V = V(:, col);% 最大特征值的特征向量,能够用于计算特征权重
for i = 1:n
w(i,1) = lenda_V(i,1)/sum(lenda_V);
end
%一致性检验
CI=(lendada-n)/(n-1);
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59];
%判断是否通过一致性检验
CR=CI/RI(n);
if CR>=0.1
fprintf('没有通过一致性检验\n');
else
w
fprintf('通过一致性检验\n');
end
层次分析法的权重带有很重的主观色彩,而为了使权重更加客观,我们利用原始数据中的某些特性来确定权重。一列数据方差越小,所反映的信息量也越少,那么此时其权重就应该越低。而一列数据所反映的信息量越少,其信息熵就越大。所以指标的信息熵就是这样一个具有优良性质的特性。而且信息熵越大,权重就越低。
熵权法只是一个确定权重的方法,一般和别的方法(如TOPSIS法)一起使用。故这个方法就不给出代码了。
由于每一列数据可能代表不同类别,不同单位的信息,所以为了方便比较,我们需要对数据进行标准化处理。
我们令 x i j = a i j − m i n ( x i ) m a x ( x i ) − m i n ( x i ) x_{ij}=\frac{a_{ij}-min(x_i)}{max(x_i)-min(x_i)} xij=max(xi)−min(xi)aij−min(xi)
那么 { x i j } \{x_{ij}\} {xij}就是我们对A进行标准化处理之后的矩阵。
令 p i j = x i j ∑ i = 1 m x i j p_{ij}=\frac{x_{ij}}{\sum_{i=1}^m {x_{ij}}} pij=∑i=1mxijxij
对于第j个指标而言,其信息熵的计算公式为 E j = − 1 l n m ∑ i = 1 m p i j l n p i j E_j=-\frac{1}{lnm} \sum_{i=1}^m {p_{ij}lnp_{ij}} Ej=−lnm1∑i=1mpijlnpij
根据定义,信息熵是一个位于[0,1]的实数。由于信息熵和权重是负相关的,所以我们根据 1 − E j 1-E_j 1−Ej来制定权重。
ω j = 1 − E j ∑ j = 1 n ( 1 − E j ) \omega_j=\frac{1-E_j}{\sum_{j=1}^n {(1-E_j)}} ωj=∑j=1n(1−Ej)1−Ej
ω j \omega_j ωj即为第j个指标的权重。
第i家公司的综合得分为按照权重加权平均的结果,即 s i = ∑ j = 1 n ω j x i j s_i=\sum_{j=1}^n {\omega_j x_{ij}} si=∑j=1nωjxij
这样就能给出公司的排序啦
层次分析法和熵权法都是得到权重的方法,而得到权重之后直接通过加权平均来计算每一家公司的得分,对于数据没有充分地利用。而TOPSIS法则充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。
TOPSIS法又称优劣解距离法。直观理解,就是在所有指标中选出最大值(最小值),组成一个最优方案(最劣方案)。距离最优方案越近、离最劣方案越远的那个方案就是最优方案。
由于涉及到最优解、距离等概念,所以有必要对各个指标的初始数据进行一些处理。先将所有指标转化为极大型指标,再对所有数据进行标准化处理。这里不做过多展开。
首先要找出每个指标的最优解和最劣解,即矩阵A每一列的最大值和最小值。
令 X j + = m a x { a 1 j , a 2 j , … , a m j } X_j^+ =max\{a_{1j},a_{2j},…,a_{mj}\} Xj+=max{a1j,a2j,…,amj}, X j − = m i n { a 1 j , a 2 j , … , a m j } X_j^- =min\{a_{1j},a_{2j},…,a_{mj}\} Xj−=min{a1j,a2j,…,amj}。
定义第i家公司距离最优解的距离 D i + = ∑ j = 1 n ( X j + − a i j ) 2 D_i^+=\sqrt{\sum_{j=1}^{n} {(X_j^+-a_{ij})^2}} Di+=∑j=1n(Xj+−aij)2,其距离最最劣解的距离 D i − = ∑ j = 1 n ( X j − − a i j ) 2 D_i^-=\sqrt{\sum_{j=1}^{n} {(X_j^--a_{ij})^2}} Di−=∑j=1n(Xj−−aij)2。
这是假设每个指标权重相等的情况。如果第j个指标的权重为 ω j \omega_j ωj,那么可以更改上式为
{ D i + = ∑ j = 1 n ω j ( X j + − a i j ) 2 D i − = ∑ j = 1 n ω j ( X j − − a i j ) 2 \begin{cases} D_i^+=\sqrt{\sum_{j=1}^{n} {\omega_j(X_j^+-a_{ij})^2}} \\ D_i^-=\sqrt{\sum_{j=1}^{n} {\omega_j(X_j^--a_{ij})^2}} \end{cases} ⎩ ⎨ ⎧Di+=∑j=1nωj(Xj+−aij)2Di−=∑j=1nωj(Xj−−aij)2
令 S i = D i − D i + + D i − S_i=\frac{D_i^-}{D_i^++D_i^-} Si=Di++Di−Di−
S i S_i Si即为第i家公司的得分。
综上所述,TOPSIS法的公式可以用下面几个式子来描述:
{ X j + = m a x { a 1 j , a 2 j , … , a m j } X j − = m i n { a 1 j , a 2 j , … , a m j } D i + = ∑ j = 1 n ω j ( X j + − a i j ) 2 D i − = ∑ j = 1 n ω j ( X j − − a i j ) 2 S i = D i − D i + + D i − \begin{cases} X_j^+ =max\{a_{1j},a_{2j},…,a_{mj}\}\\ X_j^- =min\{a_{1j},a_{2j},…,a_{mj}\}\\ D_i^+=\sqrt{\sum_{j=1}^{n} {\omega_j(X_j^+-a_{ij})^2}} \\ D_i^-=\sqrt{\sum_{j=1}^{n} {\omega_j(X_j^--a_{ij})^2}}\\ S_i=\frac{D_i^-}{D_i^++D_i^-} \end{cases} ⎩ ⎨ ⎧Xj+=max{a1j,a2j,…,amj}Xj−=min{a1j,a2j,…,amj}Di+=∑j=1nωj(Xj+−aij)2Di−=∑j=1nωj(Xj−−aij)2Si=Di++Di−Di−
层次分析法和熵权法都是用来获取权重的方式,前者较为主观,后者则是基于数据性质的客观方法。TOPSIS法则是在给出权重后,利用和最优解最劣解之间的距离进行排名的一种方法。TOPSIS法一般可以和层次分析法或者熵权法结合使用,这样可以在给出权重后,充分利用原始数据进行排名。对于这道题而言,熵权-TOPSIS法是比较好的一种方法。