学习数学建模,教程为B站数模加油站,这里当笔记 / 心得。
之前看的清风,讲的很长,还不清晰,写了一般,后面看了数模加油站之后转了。
层次分析法(AHP)
基本步骤
- 建立递阶层次结构模型
- 构造出各层的所有判断矩阵
- 一致性检验
- 求权重后进行评价
建立递阶层次结构模型
只需要找出三层的各个选项即可,分别为:目标、评价指标、待评价的对象。
构造出各层的所有判断矩阵
判断矩阵:
主要对一个指标相对于另一个指标的重要程度的描述,用矩阵表示应该是方便描述和计算。
这一部分比较主观,所以可能出现问题。
比如:
观察第二行第三列和第四列可以得到:作品数量<颜值<作品质量
但是直接比较作品数量和作品质量,即第四行第三列,可以得出作品数量>作品质量。
得出的结果前后矛盾,所以需要一致性检验。
一致性检验
一致矩阵: a i j = a i k ∗ a k j a_{ij} = a_{ik} * a_{kj} aij=aik∗akj 且 矩阵的各行各列成倍数关系。
条件1:
a
i
j
=
a
i
k
∗
a
k
j
a_{ij} = a_{ik} * a_{kj}
aij=aik∗akj
a
i
k
=
b
i
b
k
a_{ik} =\frac{b_i}{b_k}
aik=bkbi,
a
k
j
=
b
k
b
j
a_{kj} =\frac{b_k}{b_j}
akj=bjbk,
b
k
b_k
bk 约分即可得出。(
b
i
b_i
bi表示k评价指标的重要程度)
条件2:各行各列成倍数关系
以列为例,对于第 k 列和第 j 列有
a
i
k
=
b
j
b
k
a
i
j
a_{ik} = \frac{b_j}{b_k} a_{ij}
aik=bkbjaij,所以第 k 列是第 j 列的
b
j
b
k
\frac{b_j}{b_k}
bkbj倍
一致性检验原理: 检验我们构造的判断矩阵和一致性矩阵是否有太大的差别。
证明就略过了。
一致性检验步骤:
- 计算一致性指标 C I = λ m a x − n n − 1 CI = \frac{\lambda_{max}-n}{n-1} CI=n−1λmax−n ( λ m a x \lambda_{max} λmax为一致矩阵最大的特征值,n为指标个数)
- 查找对应的平均随机一致性指标RI(查表)
- 计算一致性比例CR
举例:
求权重后进行评价
通过一致性检验后,就可以对每个指标计算权重,再求加权和即可。
计算权重共有三种方法:
- 算数平均值
- 几何平均值
- 特征向量
算数平均值
- 将每列进行归一化
- 每个指标的权重为每行求算术平均值
import numpy as np
# 定义判断矩阵A
A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 2], [1/5, 1/2, 1/2, 1]])
# 计算每列的和
ASum = np.sum(A, axis=0)
# 获取A的行和列
n, _ = A.shape
# 归一化
Stand_A = A / ASum
# 各列相加到同一行
ASumr = np.sum(Stand_A, axis=1)
# 计算权重向量
weights = ASumr / n
print(weights)
几何平均值
- 每行求几何平均值。(相乘开n次方)
- 将得到的几何平均值进行归一化。
# 将A中每一行元素相乘得到一列向量
prod_A = np.prod(A, axis=1)
# 将新的向量的每个分量开n次方等价求1/n次方
prod_n_A = np.power(prod_A, 1/n)
# 归一化处理
re_prod_A = prod_n_A / np.sum(prod_n_A)
特征向量
找到最大的特征值对应的特征向量,进行归一化。
# 找出对应的特征向量
max_vector = eig_vectors[:,np.argmax(eig_values)]
# 对特征向量进行归一化处理,得到权重
weights = max_vector / np.sum(max_vector)