Part 1 层次分析法
1.1 主要内容
层次分析法(Analytic Hierarchy Process, AHP)是一种多准则决策分析方法,主要用来解决复杂的决策问题。它通过以下几个方面发挥作用:
-
分解复杂问题:将复杂问题分解为多个层次,通常包括目标层、准则层和方案层。
-
量化决策准则:通过成对比较的方式,量化各准则和方案之间的相对重要性。
-
一致性检验:通过计算一致性指标和一致性比率,检验决策者在成对比较中的逻辑一致性,确保决策过程的合理性和可靠性。
-
权重计算:利用最大特征值对应的特征向量,计算出各准则和方案的权重,反映它们在决策中的重要性。
-
综合评价:将准则层和方案层的权重与方案层的评分相结合,计算出各方案的综合得分,有助于决策者从多个角度综合评价各个方案。
-
决策支持:最终,根据综合得分,决策者可以选择最优方案。
-
层次分析法的应用领域非常广泛,包括但不限于:
- 项目管理:评估不同项目的优先级和可行性。
- 技术评估:比较不同技术方案的优劣。
- 资源分配:决定如何分配有限的资源。
- 政策制定:评估不同政策方案的影响。
- 市场分析:分析不同市场策略的效果。
- 风险评估:评估不同风险因素的相对重要性。
1.2 流程及原理
1.选择指标,构建层次模型
- 经过大量文献考证或社会调查后选取
- 发放调查问卷
- 使用德尔菲法去征求专家意见
德尔菲法(Delphi method)是一种系统化的预测方法,最初由兰德公司在20世纪50年代开发,用于在信息不完全或问题复杂的情况下进行决策或预测。这种方法通过多轮咨询专家的意见,逐步达成共识。以下是德尔菲法的基本步骤:
确定问题:明确需要预测或决策的问题。
选择专家:选择一组具有相关领域知识和经验的专家。
第一轮调查:向专家发送问题和相关背景资料,要求他们提供初步意见和预测。
收集和分析第一轮反馈:将专家的反馈进行汇总和分析,找出共识和分歧点。
第二轮调查:将第一轮的反馈结果反馈给专家,要求他们重新考虑自己的意见,并提供更详细的理由。
重复过程:根据需要,进行多轮调查,直到专家们的意见趋于一致或达到预定的共识水平。
最终分析和报告:将最终的专家意见和预测结果整理成报告,供决策者参考。
2.对目标层到准则层之间和准则层到方案层之间构建比较矩阵。
3.对每个比较矩阵计算CR值检验是否通过CR检验,如果没有通过检验需要调整比较矩阵。
4.求出每个矩阵最大的特征值对应的归一化权重向量
。
5.根据不同矩阵的归一化权向量计算出不同方案的得分进行比较。
(1)层次模型图
①从结构上看,层次分析法将模型大致分为目标层、准则层和方案层。
- 目标层:决策的最终目的,是你的评价目标。
- 准则层:影响决策的关键因素,是你的评价指标体系。
- 方案层:可供选择的各个方案。
(注意,方案层是一定要有多个对象进行比较的,因为层次分析法是基于比较的方法)
②在准则层和方案层,通过成对比较的方式,确定各元素之间的相对重要性,并构建判断矩阵(成对比较矩阵)(假如有m个准则n个样本,需要构建的矩阵数量为m,矩阵大小为(n,n)),通过一致性检验,计算准则层和方案层的权重,确保判断矩阵的一致性在可接受范围内,再将准则层和方案层的权重与方案层的评分相结合,计算出各方案的综合得分。
在层次分析法(AHP)中,确保判断矩阵的一致性是非常重要的。一致性是指在成对比较中,元素之间的相对重要性是逻辑一致的。如果一个判断矩阵的一致性较差,可能会导致最终决策的不准确。
理解一致性的概念:
- 一致性意味着如果一个元素A相对于B更重要,那么B相对于A应该更不重要。
- 一致性还意味着如果A相对于B更重要,B相对于C更重要,那么A相对于C也应该更重要。
使用成对比较:
- 在准则层和方案层,通过成对比较的方式,确定各元素之间的相对重要性。
- 通常使用1-9标度来表示两个元素之间的相对重要性,其中1表示同等重要,9表示一个元素比另一个元素重要9倍(一般让专家或决策者对准则层的每个元素[准则]进行成对比较,确定一个准则相对于另一个准则的相对重要性)。
构建判断矩阵:
- 将成对比较的结果填入判断矩阵中。例如,如果A相对于B更重要,B相对于C更重要,则矩阵中的相应元素应为:
计算权重:
- 使用数学方法(如主成分分析或 [ 特征值法:通过数学方法(如特征值分解)计算判断矩阵的特征值和特征向量,最大特征值λmax 对应的特征向量是最重要的 ] )从判断矩阵中提取权重向量。
- 权重向量应满足判断矩阵的一致性要求。
进行一致性检验:
- 计算一致性指标(Consistency Index, CI)。一致性指标的计算公式为:
其中,λmax 是判断矩阵的最大特征值,n 是判断矩阵的维度。
比较一致性比率(Consistency Ratio, CR):
- 一致性比率是一致性指标与随机一致性指数(Random Index, RI)的比值。RI 取决于判断矩阵的阶数,通常可以从文献中查到。
- 一致性比率的计算公式为: CR=CI/RI
- 如果 CR<0.1,则认为判断矩阵的一致性是可接受的;如果CR≥0.1,则需要重新审视判断矩阵,可能需要重新进行成对比较。
- 归一化得到权重向量:
计算最大特征值:首先需要计算判断矩阵的最大特征值 λmax。
找到对应的特征向量:与最大特征值λmax 对应的特征向量 w,可以通过解特征方程Aw=λmaxw 获得。
归一化特征向量:将特征向量 w 进行归一化处理,使其成为权重向量w′。归一化的方法是将特征向量的每个元素除以该向量所有元素之和。具体公式如下:
其中,xi 是特征向量 w 的第 i 个元素,n 是特征向量的维度。
检查归一化后的权重向量:确保归一化后的权重向量 𝑤′w′ 满足所有元素之和为1的条件。
应用权重向量:将归一化后的权重向量应用于决策分析中,作为各准则或方案的相对重要性。
重新审视和调整:
- 如果一致性比率不满足要求,需要重新审视判断矩阵中的成对比较,找出不一致的地方,并进行调整。
- 重新进行成对比较,确保逻辑一致性,然后重新计算权重和一致性指标。
③目标层和准则层两个相邻的层次之间也要构建成对比较矩阵,矩阵的每一项表示因素i和因素j的相对重要程度。由于对角线上元素都是自己和自己做比较,所以对角线上元素为1。
图1 使用层次分析法选择空调示例
图2 准则层与方案层判断矩阵示例
图3 目标层与准则层之间的判断矩阵示例
注:
- 标度的定义是谁更重要或有优势,不是直接比较其量的大小。例如在三种空调对于功耗的判断矩阵中,[1,2] 的值为 3,指的不是空调 A 的功耗相对于空调 B 比较有大,这意味着空调 A 比空调 B 更耗电。标度的实际意思是空调 A 的功耗相对于空调 B 比较有优势,这意味着空调 A 比空调 B 更有优势,更省电。
- 判断矩阵的数值不能随便乱填,需要遵守逻辑规范。例如,在三种空调对于寿命的判断矩阵中可知,空调 B 的寿命比空调 C 更有优势,而空调 C 也比 空调 A 更有优势,那么就不能说空调 A 比 空调 B 更有优势,这显然是违背逻辑的 ,为了避免这种逻辑上的差错,可以先填矩阵,后利用一致性检验(下文即将介绍)来判断矩阵是否存在逻辑上的错误,若有则修改标度。
- 为了达到目标,目标层和准则层节点之间的相对重要程度,决定这些数值大小的可以是决策者的主观判断,也可以是基于调查或文献来判断,也可以是由专家讨论决定。
在完成目标层与准则层的层次单排序与一致性检验之后,还需对准则层到方案层的多个判断矩阵进行层次单排序与一致性检验。
1.3 案例分析
例 某日从三条河流的基站处抽检水样,得到了水质的四项检测指标如表5.1所示。请根据提供数据对三条河流的水质进行评价。其中,DO代表水中溶解氧含量,越大越好;CODMn表示水中高锰酸盐指数,NH3-N表示氨氮含量,这两项指标越小越好;pH值没有量纲,在6~9区间内较为合适。
①分析数据,构建层次模型图
②对目标层到准则层构建一个大小为4的方阵(示例数值自行确定)
③对这个矩阵做特征值分解,定位到了最大的特征值与特征向量,进而计算CI和CR
import numpy as np
# 构建矩阵
A = np.array([[1, 1/5, 1/3, 1],
[5, 1, 3, 5],
[3, 1/3, 1, 3],
[1, 1/5, 1/3, 1]])
# 获得指标个数
m = len(A)
n = len(A[0])
RI = [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51]
# 使用 np.linalg.eig 函数求判断矩阵的特征值和特征向量,V为特征值,D为特征向量
V, D = np.linalg.eig(A)
# 使用 np.max 函数获取最大特征值
B = np.max(V)
index = np.argmax(V) # 获取最大特征值的索引
# 获取最大特征值对应的特征向量
C = D[:, index]
# 计算CI和CR
CI = (B - n) / (n - 1)
CR = CI / RI[n - 1] # 注意:RI的索引应为n-1
if CR < 0.10:
print("CI=", CI)
print("CR=", CR)
print("对比矩阵A通过一致性检验,各向量权重向量Q为:")
C_sum = np.sum(C)
Q = C / C_sum
print(Q)
else:
print("对比矩阵A未通过一致性检验,需对对比矩阵A重新构造")
运行结果:
注:python进行矩阵分解的时候是在复数域内进行分解,所得到的向量也是复数向量。虚部为0的情况下想要单独分析实部,通过Q.real即可达成取实部的效果。
④4个权重向量的排布
将准则层到方案层得到的7个成对比较矩阵对应的权重向量排列为一个矩阵,矩阵的每一行表示对应的方案,矩阵的每一列代表评价准则。将这一方案权重矩阵与目标层到准则层的权重向量进行数量积,得到的分数就是最终的评分。
最终得到的一个结论是:在评价过程中水中溶解氧含量与钴金属含量占评价体系比重最大,而四川攀枝花龙洞的水质虽然含钴元素比另外两个更高,但由于溶解氧更多,NH3-N的含量更小,水体不显富营养化。就整体而言,四川攀枝花龙洞得分高于重庆朱沱和湖北宜昌南津关。
个人理解
在层次分析法中,各个准则指标具有相对重要性,而对于每个方案,各指标对其的影响也有相对性,将两个相对性通过数值可视化,在统一的标尺下进行数值相乘(占比)的比较,最后得到想要的结果。
Part 2 熵权分析法
2.1 主要内容
熵权法(Entropy Weight Method)是一种基于信息熵原理的多准则决策分析方法。它通过计算各准则的权重来解决决策问题,这些权重反映了准则的相对重要性。熵权法的基本思想是:信息熵越小,包含的信息量越大,该准则的权重也就越大。
熵在物理学中通常用来描述系统的无序程度。在熵权分析法中,熵的概念被用来衡量准则的离散程度或信息量。一个准则的熵值越小,说明该准则在不同方案中的差异越大,因此其权重应该越大。
2.2 基本步骤
-
构建决策矩阵:设决策问题有 m 个备选方案和 n 个评价准则。构建一个 m×n 的决策矩阵 R=[rij],其中 rij 表示第 i 个方案在第 j 个准则下的评价值。
-
标准化决策矩阵:为避免量纲造成的影响,首先要对指标进行标准化处理。根据指标含义,可将指标分为正向指标(取值越大越好)和逆向指标(取值越小越好),分别通过如下方法进行标准化:
-
确定准则的权重:根据差异系数计算准则的权重 :
-
计算准则的熵值:对于每个准则j,计算其熵值ej:
其中,ln 表示自然对数。
-
确认各指标的权重:
-
计算方案的综合得分:将每个方案在各个准则下的标准化评价值与其对应的权重相乘,然后求和,得到该方案的综合得分:
-
做出决策:根据综合得分,选择得分最高的方案作为最优方案。
熵权法的优点
- 客观性:权重的确定基于客观数据,减少了主观判断的影响。
- 科学性:利用信息熵原理,科学地反映了准则的相对重要性。
- 适用性:适用于各种多准则决策问题,尤其是在数据具有不确定性时。
熵权法的缺点
- 数据要求:需要大量的数据支持,对数据的质量和准确性要求较高。
- 计算复杂:计算过程较为复杂,尤其是在处理大规模数据时。
2.3 对指标进行标准化处理的意义
衡量好坏的标准因指标而异。由于指标的多样性,有些指标越大越好,如成绩;有些越小越好,如房贷;有些在特定区间过高或过低都不佳,如血压;还有些存在最优值,偏差越大越差。
若模型未经数据预处理直接计算,可能出现问题。
指标正向化它涉及将原本的负向指标转为正向指标,例如将死亡率转为生存率、故障率转为可靠度。通过正向化,目标或结果的达成情况更直观,提高指标的可解释性和可操作性。
2.4 案例分析
① 首先,读取数据并对指标进行正向化。首先,pH这一列虽然是区间型指标,但是可以用pH=7作为最优 值将其看作中间值型指标处理,与7的偏差越大则得分越小。DO和鱼类密度是极大型指标,剩下三个是 极小型指标,所以用倒数的方法正向化。
import pandas as pd
import numpy as np
# 读取Excel文件
newdata = pd.read_excel("test.xlsx", sheet_name='Sheet5')
# 对pH值进行处理,使其越接近7越重要
newdata['pH*'] = 1 - abs(newdata['pH*'] - 7)
# 对CODMn、NH3-N和垃圾密度进行倒数处理,使其越大越重要
newdata['CODMn'] = 1 / newdata['CODMn']
newdata['NH3-N'] = 1 / newdata['NH3-N']
newdata['垃圾密度'] = 1 / newdata['垃圾密度']
# 将地点名称设置为索引,并删除缺失值
newdata = newdata.set_index('地点名称').dropna()
def entropyWeight(data):
# 将数据转换为numpy数组
data = np.array(data)
# 归一化处理,计算每个准则下各方案的相对重要性
P = data / data.sum(axis=0)
# 计算熵值,熵值越小表示该准则的差异性越大,包含的信息量越多
E = -np.nansum(P * np.log(P) / np.log(len(data)), axis=0)
# 计算权系数,即差异系数,差异系数越大表示该准则的权重越大
weights = (1 - E) / (1 - E).sum()
return weights
# 假设data是一个DataFrame,只包含需要计算权重的列
# data = newdata.drop(columns=['地点名称'])
# weights = entropyWeight(data)
运行结果:
个人理解
在熵权分析法中,各个指标的权重由其无序性(在方案中的分布差异程度)决定,越无序(即差异越大)的对于得到可排序的最终结果越有益,值得注意的是,各指标要做标准化的数据预处理,以防熵值计算错误,标准化后要依据标准化的值重新归一化准则和指标的权重(其中,准则的权重由对应所有方案的指标决定,指标的权重由所有方案得到的熵值决定),最后将两值相乘。
Part 3 TOPSIS分析法
3.1 主要内容
TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为基于归一化后的原始数据矩阵,找出有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法对数据分布及样本含量没有严格限制,数据计算简单易行。
TOPSIS评价法基本思想为,对原始决策方案进行归一化,然后找出最优方案和最劣方案,对每一个决策计算其到最优方案和最劣方案的欧几里得距离, 然后再计算相似度。若方案与最优方案相似度越高则越优先。
3.1.1 一般的TOPSIS分析法
层次分析法里面我们用成对比较矩阵主观地消除量纲影响;熵权法里面我们用熵值和正向化消除了量纲影响;在TOPSIS分析法中,我们通过计算每个方案离理想解和负理想解的距离来判断优劣。理想解是最佳方案,各项指标最优;负理想解是最差方案,各项指标最差。这种方法就像“近朱者赤近墨者黑”,离最好的方案越近,表现就越优秀,离最差的方案越远,表现就越差。
对于距离,有多种方式可以衡量它。包括最常用的欧几里得距离、曼哈顿距离、余弦距离等多种计算方式。
基本流程:
其中,在(1)中正向化可以考虑min-max规约,为了消除不同指标量纲的影响,需要再对正向化后的矩阵进行标准化处理:
在(4)中,
3.1.2 改进的TOPSIS分析法
在经典TOPSIS方法中,计算欧几里得距离时,不同指标的差的平方会被直接相加。然而,考虑到不同指标在评价体系中的重要性可能存在差异,因此在计算距离时应对各个指标赋予相应的权重。权重的确定可以通过熵权法或层次分析法来实现。通常在解决TOPSIS问题时,我们会处理大量的数据,因此,权重可以通过数据驱动的熵权法来获得。
3.2 基本步骤
3.3 案例分析
①(以2.4为例)
import numpy as np
import pandas as pd
# TOPSIS方法函数
def TOPSIS(A1, w):
# 将输入的决策矩阵转换为numpy数组
Z = np.array(A1)
# 初始化正理想解和负理想解矩阵
Zmax = np.ones([1, A1.shape[1]], float) # 正理想解,初始化为全1
Zmin = np.ones([1, A1.shape[1]], float) # 负理想解,初始化为全1
# 计算正理想解和负理想解
for j in range(A1.shape[1]):
if j == 1: # 如果是成本类指标(负向指标)
Zmax[0, j] = min(Z[:, j]) # 取最小值为正理想值
Zmin[0, j] = max(Z[:, j]) # 取最大值为负理想值
else: # 如果是效益类指标(正向指标)
Zmax[0, j] = max(Z[:, j]) # 取最大值为正理想值
Zmin[0, j] = min(Z[:, j]) # 取最小值为负理想值
# 初始化相对贴近度C的列表
C = []
# 计算各个方案的相对贴近度C
for i in range(A1.shape[0]):
# 计算方案i与正理想解的距离
Smax = np.sqrt(np.sum(w * np.square(Z[i, :] - Zmax[0, :])))
# 计算方案i与负理想解的距离
Smin = np.sqrt(np.sum(w * np.square(Z[i, :] - Zmin[0, :])))
# 计算相对贴近度C
C.append(Smin / (Smax + Smin))
# 将相对贴近度C的列表转换为DataFrame
C = pd.DataFrame(C)
# 返回相对贴近度C的DataFrame
return C
输入归一化后的数据和权重系数就可以获得评价结果。利用上一节里面讲到的归一化方法进行数据处理 并通过熵权法获得权重,调用代码可以得到最终结果。得分最高的是江苏南京林山,为0.657;得分最 低的是湖北宜昌南津关,得分仅0.232。 可以看到,TOPSIS方法与层次分析法和熵权法都不同,它不是一个构造权重的方法,而是根据权重去进 行得分折算的方法。这为我们分析评价类模型提供了一个新思路。
②
3.4 指标正向化
3.4.1 常见的四种指标
3.4.2 中间型指标 —>极大型指标
3.4.3 区间型指标—>极大型指标
3.4.4 总结
- 如果有多个指标且不全是极大型指标,则进行指标正向化。
- 之后对正向化矩阵进行标准化,目的是消除不同指标量纲的影响。
- 标准化:
个人理解
在TOPSIS分析法中,三个重要的关键词是——正向化(统一所有准则)、标准化(处理m个指标之间的关系)、归一化(更好看出各个要评价的对象之间的关系)。
Part 4 CRITIC方法
CRITIC权重法是一种基于数据波动性的客观赋权法。其思想在于两项指标,分别是波动性(对比强度)和 冲突性(相关性)指标。对比强度使用标准差进行表示,如果数据标准差越大说明波动越大,权重会越高; 冲突性使用相关系数进行表示,如果指标之间的相关系数值越大,说明冲突性越小,那么其权重也就越低。权重计算时,对比强度与冲突性指标相乘,并且进行归一化处理,即得到最终的权重。CRITIC权重法适用于数据稳定性可视作一种信息,并且分析的指标或因素之间有着一定的关联关系的数据。
注意:CRITIC方法和熵权法一样都属于数据驱动的方法类型,需要数据量支持。
- 输入:至少两项或以上的定量变量。
- 输出:输入定量变量对应的权重值。
4.1 基本步骤
4.2 案例分析
(以2.4为例)
import numpy as np
import pandas as pd
def CRITIC(df):
# 计算输入数据集df的标准差,axis=1表示沿着每一列(每个准则)计算
std_d = np.std(df, axis=1)
# 计算输入数据集df的均值,axis=1表示沿着每一列(每个准则)计算
mean_d = np.mean(df, axis=1)
# 计算输入数据集df的相关系数矩阵
cor_d = np.corrcoef(df)
# 计算准则的权重,这里使用了1减去相关系数矩阵的和来表示准则的独立性
w_j = (1 - cor_d).sum(0) * std_d
# 打印准则的权重
print(w_j)
# 计算准则的权重,这里使用了均值和1减去均值的比值与准则权重的乘积
# 这种方法考虑了准则的均值对权重的影响,均值越接近1,其权重越大
w = (mean_d / (1 - mean_d) * w_j) / sum(mean_d / (1 - mean_d) * w_j)
# 打印最终的准则权重
print(w)
##############################
# 假设有一个DataFrame df,包含多个准则的评估数据
# df = pd.DataFrame(data)
# 调用CRITIC函数计算权重
# result = CRITIC(df)
##############################
经过计算,结果为:
pH* 0.180598
DO 0.199151
CODMn 0.185891
NH3-N 0.097907
鱼类密度 0.248081
垃圾密度 0.088372
个人理解
CRITIC权重法和熵权分析法有类似之处,它们都会考虑数据本身的内部波动情况,同时也会考虑整体(外部)的情况,其中,熵权分析法是通过指标标准化看外部,而CRITIC权重法是通过指标之间的相似度看;
Part 5 模糊评价法
5.1 主要内容
模糊综合评价法是一种基于模糊数学理论的多准则决策分析方法,它通过模糊数学的方法处理决策问题中的不确定性和模糊性。这种方法特别适用于那些准则难以量化或者评价标准不明确的情况。
模糊综合评价法的基本思想就是用属于程度代替属于或不属于,从而刻画“中介状态”。首先确定被评价对象的因素(指标)集合评价(等级)集;再分别确定各个因素的权重及它们的隶属度矢量,获得模糊评判矩阵;最后把模糊评判矩阵与因素的权矢量进行模糊运算并进行归一化,得到模糊综合评价结果。
基本原理
-
模糊性:在现实世界中,很多决策问题的评价标准并不是绝对清晰的,而是存在一定的模糊性。模糊综合评价法通过模糊数学的方法来处理这种模糊性。
-
隶属度:评价对象在各个准则下的表现可以通过隶属度函数来描述。隶属度函数的值介于0和1之间,表示评价对象在某个准则下的表现程度。
-
模糊关系:决策者的评价可以通过模糊关系矩阵来表达,这个矩阵描述了评价对象在各个准则下的表现与评价等级之间的关系。
基本步骤
-
确定评价准则:明确决策问题的评价准则,这些准则可以是效益、成本、风险等。
-
构建评价集:确定评价的等级,如优、良、中、差等,构建评价集 𝑈={𝑢1,𝑢2,…,𝑢𝑛}U={u1,u2,…,un}。
-
构建因素集:确定决策的因素,如方案、项目等,构建因素集 𝑉={𝑣1,𝑣2,…,𝑣𝑚}V={v1,v2,…,vm}。
-
建立因素权重集:确定各因素的权重,权重可以通过专家打分、层次分析法等方法获得。
-
构建模糊关系矩阵:根据评价准则和评价集,建立模糊关系矩阵 R,其元素 rij 表示因素 vi 在准则uj 下的隶属度。
-
确定单因素评价矩阵:对每个因素vi,根据模糊关系矩阵 R 计算其在各个评价等级下的隶属度,构建单因素评价矩阵。
-
进行模糊综合评价:将单因素评价矩阵与因素权重集相乘,得到综合评价向量,表示各个因素的综合评价值。注:
-
做出决策:根据综合评价值,选择评价值最高的因素作为最优决策。
优点
- 处理模糊性:能够有效处理决策问题中的不确定性和模糊性。
- 灵活性:评价准则和评价等级可以根据实际情况灵活设定。
- 直观性:通过隶属度函数直观地表达评价对象的表现。
缺点
- 主观性:隶属度函数的确定可能涉及主观判断,影响评价结果的客观性。
- 计算复杂:尤其是当评价准则和因素较多时,计算过程可能较为复杂。
- 超模糊现象:当指标集U较大,即指标集个数凡较大时,在权矢量和为1的条件约束下,相对隶属度权系数往往偏小,权矢量与模糊矩阵R不匹配,结果会出现超模糊现象,分辨率很差,无法区分谁的隶属度更高,甚至造成评判失败,此时可用分层模糊评估法加以改进。
5.2 案例分析
①
# 准则重要性矩阵
criteria = np.array([[1, 7, 5, 7, 5],
[1 / 7, 1, 2, 3, 3],
[1 / 5, 1 / 2, 1, 2, 3],
[1 / 7, 1 / 3, 1 / 2, 1, 3],
[1 / 5, 1 / 3, 1 / 3, 1 / 3, 1]])
# 对每个准则,方案优劣排序
b1 = np.array([[1, 5], [1 / 5, 1]])
b2 = np.array([[1, 2, 5], [1 / 2, 1, 2], [1 / 5, 1 / 2, 1]])
b3 = np.array([[1, 5, 6, 8], [1 / 5, 1 ,2, 7], [1 / 6, 1 / 2, 1 ,4],[1 / 8, 1 / 7, 1 / 4, 1]])
b4 = np.array([[1, 3, 4], [1 / 3, 1, 1], [1 / 4, 1, 1]])
b5 = np.array([[1, 4, 5, 5], [1 / 4, 1, 2, 4], [1 /5 , 1 / 2, 1, 2], [1 / 5,1 /4,1 / 2, 1]])
#模糊综合评价法(FCE),输入准则权重、因素权重
def fuzzy_eval(criteria, eigen):
#量化评语(优秀、 良好、 一般、 较差、 非常差)
score = [1,0.8,0.6,0.4,0.2]
df = pd.read_excel('FCE.xlsx')
print('单因素模糊综合评价:{}\n'.format(df))
#把单因素评价数据,拆解到5个准则中
v1 = df.iloc[0:2,:].values
v2 = df.iloc[2:5,:].values
v3 = df.iloc[5:9,:].values
v4 = df.iloc[9:12,:].values
v5 = df.iloc[12:16,:].values
vv = [v1,v2,v3,v4,v5]
val = []
num = len(eigen)
for i in range(num):
v = np.dot(np.array(eigen[i]),vv[i])
print('准则{} , 矩阵积为:{}'.format(i+1,v))
val.append(v)
# 目标层
obj = np.dot(criteria, np.array(val))
print('目标层模糊综合评价:{}\n'.format(obj))
#综合评分
eval = np.dot(np.array(obj),np.array(score).T)
print('综合评价:{}'.format(eval*100))
criteria, eigen=weight()
fuzzy_eval(criteria, eigen)
- 导入库:导入numpy和pandas库,用于数学运算和数据操作。
- 准则重要性矩阵:定义了一个5x5的矩阵,表示准则之间的相对重要性。
- 方案优劣排序:定义了五个准则下的方案优劣排序矩阵。
- 定义模糊综合评价函数:
- 输入准则重要性矩阵和因素权重。
- 定义量化评语,对应不同的评价等级。
- 读取Excel文件中的单因素评价数据。
- 将单因素评价数据拆解到5个准则中。
- 对每个准则,计算因素权重和单因素评价数据的矩阵积。
- 计算目标层模糊综合评价,即准则重要性矩阵与因素权重矩阵积的乘积。
- 计算综合评分,将目标层模糊综合评价与量化评语的矩阵积乘以100,得到最终评分。
- 调用模糊综合评价函数:调用
fuzzy_eval
函数,传入准则重要性矩阵和因素权重。
其中,
②
个人理解
对于模糊综合评价法,其核心是隶属度函数、模糊关系矩阵以及合成算法,隶属度函数表现了评价对象在各个准则下的属于程度,而模糊关系矩阵整体展示了评价对象在各评价准则下的表现,最后,通过合成算法进行加权处理,得到最终的目标结果。
Part 6 秩和比分析法
秩和比(RSR)是指分析方法可用于评价多个指标的综合水平情况,其实质原理是利用了RSR值信息进行各项数学计算,RSR值介于0~1之间且连续,通常情况下,该值越大说明评价越‘优’。
RSR法本质
秩和比综合评价法基本原理是在一个n行m列,通过秩的转换,获得无量纲统计量RSR;然后运用参数统计分析的概念与方法、研究RSR的分布;以RSR值对评价对象的优劣进行分档排序,从而对评价对象做出综合评价。
优点:是非参数统计分析,对指标的选择无特殊要求,适于各种评价对象;由于计算用的数值是秩次, 可以消除异常值的干扰,它融合了参数分析的方法,结果比单纯采用非参数法更为精确,既可以直接排 序,又可以分档排序,使用范围广泛。
缺点:是排序的主要依据是利用原始数据的秩次,最终算得的RSR值反映的是综合秩次的差距,而与原 始数据的顺位间的差距程度大小无关,这样在指标转化为秩次是会失去一些原始数据的信息,如原始数 据的大小差别等。
当RSR值实际说不满足正态分布时,分档归类的结果与实际情况会有偏差,且只能回答分级程度是否有差别,不能进一步回答具体的差别情况。
6.1 基本原理
整次秩和比法
将 n 个评价对象的 m 个评价指标排列成 n 行 m 列的原始数据表。编出每个指标各评价对象的秩,其中效益型指标从小到大编秩,成本型指标从大到小编秩,同一指标数据相同者编平均秩。得到秩矩阵,记为
非整次秩和比法
此方法用类似于线性插值的方式对指标值进行编秩,以改进 RSR 法编秩方法的不足,所编秩次与原指标值之间存在定量的线性对应关系,从而克服了 RSR 法秩次化时易损失原指标值定量信息的缺点。
6.2 确认RSR的分布(转化为概率单位)
6.3 基本步骤
6.4 计算RSR秩的方法
6.5 案例分析
①
②
import pandas as pd
import numpy as np
import statsmodels.api as sm
from scipy.stats import norm
def rsr(data, weight=None, threshold=None, full_rank=True):
Result = pd.DataFrame()
n, m = data.shape
# 对原始数据编秩
if full_rank:
for i, X in enumerate(data.columns):
Result[f'X{str(i + 1)}:{X}'] = data.iloc[:, i]
Result[f'R{str(i + 1)}:{X}'] = data.iloc[:, i].rank(method="dense")
else:
for i, X in enumerate(data.columns):
Result[f'X{str(i + 1)}:{X}'] = data.iloc[:, i]
Result[f'R{str(i + 1)}:{X}'] = 1 + (n - 1) * (data.iloc[:, i].max() - data.iloc[:, i]) / (data.iloc[:, i].max() - data.iloc[:, i].min())
# 计算秩和比
weight = 1 / m if weight is None else np.array(weight) / sum(weight)
Result['RSR'] = (Result.iloc[:, 1::2] * weight).sum(axis=1) / n
Result['RSR_Rank'] = Result['RSR'].rank(ascending=False)
# 绘制 RSR 分布表
RSR = Result['RSR']
RSR_RANK_DICT = dict(zip(RSR.values, RSR.rank().values))
Distribution = pd.DataFrame(index=sorted(RSR.unique()))
Distribution['f'] = RSR.value_counts().sort_index()
Distribution['Σ f'] = Distribution['f'].cumsum()
Distribution[r'\bar{R} f'] = [RSR_RANK_DICT[i] for i in Distribution.index]
Distribution[r'\bar{R}/n*100%'] = Distribution[r'\bar{R} f'] / n
Distribution.iat[-1, -1] = 1 - 1 / (4 * n)
Distribution['Probit'] = 5 - norm.isf(Distribution.iloc[:, -1])
# 计算回归方差并进行回归分析
r0 = np.polyfit(Distribution['Probit'], Distribution.index, deg=1)
print(sm.OLS(Distribution.index, sm.add_constant(Distribution['Probit'])).fit().summary())
if r0[1] > 0:
print(f"\n回归直线方程为:y = {r0[0]} Probit + {r0[1]}")
else:
print(f"\n回归直线方程为:y = {r0[0]} Probit - {abs(r0[1])}")
# 代入回归方程并分档排序
Result['Probit'] = Result['RSR'].apply(lambda item: Distribution.at[item, 'Probit'])
Result['RSR Regression'] = np.polyval(r0, Result['Probit'])
threshold = np.polyval(r0, [2, 4, 6, 8]) if threshold is None else np.polyval(r0, threshold)
Result['Level'] = pd.cut(Result['RSR Regression'], threshold, labels=range(len(threshold) - 1, 0, -1))
return Result, Distribution
def rsrAnalysis(data, file_name=None, **kwargs):
Result, Distribution = rsr(data, **kwargs)
file_name = 'RSR 分析结果报告.xlsx' if file_name is None else file_name + '.xlsx'
Excel_Writer = pd.ExcelWriter(file_name)
Result.to_excel(Excel_Writer, '综合评价结果')
Result.sort_values(by='Level', ascending=False).to_excel(Excel_Writer, '分档排序结果')
Distribution.to_excel(Excel_Writer, 'RSR分布表')
Excel_Writer.save()
return Result, Distribution
总结
TOPSIS 在实现上是所有评价方法中最简单的,它完全依赖于现有数据的分布情况,能对现有数据进行充分利用,但不适合处理模糊性指标,而 RSR 法恰好弥补了TOPSIS 法的不足。此外,基于非参数的评价方法具有更好的抗异常值性。
Part 7 主成分分析法
主成分分析法是运用“降维”思想,把多个指标变换成少数综合指标的多元统计方法,这里的综合指标就是主成分。每个主成分都是原始变量的线性组合,彼此相互独立,并保留了原始变量绝大部分信息。其本质是通过原始变量的相关性,寻求相关变量的综合替代对象,并且保证了转化过程中的信息损失最小 。
主成分与原始变量之间的关系:
- 主成分是原始变量的线性组合
- 主成分的数量相对于原始数量更少
- 主成分保留了原始变量的大部分信息
- 主成分之间相互独立
7.1 基本步骤
其中,
7.2 主成分个数选择
主成分分析的一个关键问题是:主成分的个数选多少个比较合适?
有3个主要的衡量标准:
- 保留的主成分使得方差贡献率达到85%以上
- 保留的主成分的方差(特征值)大于1
- 碎石图绘制了关于各主成分及其特征值的图形,我们只需要保留图形中变化最大之处以上的主成分即可
7.3 应用场景
主成分分析作为一个非监督学习的降维方法,它只需要特征值分解,就可以对数据进行压缩,去噪。因此在实际场景应用很广泛。通过对原始变量进行综合与简化,可以客观地确定各个指标的权重,避免主观判断的随意性。并且不要求数据呈正态分布,其就是按数据离散程度最大的方向对基组进行旋转,这特性扩展了其应用范围,比如,用于人脸识别。但同时,其适用于变量间有较强相关性的数据,若原始数据相关性弱,则起不到很好的降维作用(必须通过KMO和Bartlett的检验),并且降维后,存在少量信息丢失,不可能包含100%原始数据,原始数据经过标准化处理之后,含义会发生变化,且主成分的解释含义较原始数据比较模糊。
Part 8 因子分析法
8.1 基本概念
因子分析法是指研究从变量群中提取共性因子的统计技术,这里的共性因子指的是不同变量之间内在的隐藏因子。例如,一个学生的英语、数据、语文成绩都很好,那么潜在的共性因子可能是智力水平高。因此,因子分析的过程其实是寻找共性因子和个性因子并得到最优解释的过程。
其基本思想是: 根据相关性大小把变量分组,使得同组内的变量之间相关性较高,但不同组的变量不相关或相关性较低,每组变量代表一个基本结构一即公共因子。
因子分析有两个核心问题: 一是如何构造因子变量,二是如何对因子变量进行命名解释。
8.2 基本步骤
1.选择分析的变量
用定性分析和定量分析的方法选择变量,因子分析的前提条件是观测变量间有较强的相关性,因为如果变量之间无相关性或相关性较小的话,他们不会有共享因子,所以 原始变量间应该有较强的相关性。
2.计算所选原始变量的相关系数矩阵
相关系数矩阵描述了原始变量之间的相关关系。可以帮助判断原始变量之间是否存在相关关系,这对因子分析是非常重要的,因为如果所选变量之间无关系,做因子分析是不恰当的。并且相关系数矩阵是估计因子结构的基础。
3.提出公共因子
这一步要确定因子求解的方法和因子的个数。需要根据研究者的设计方案或有关的经验或知识事先确定。因子个数的确定可以根据因子方差的大小。只取方差大于1(或特征值大于1)的那些因子,因为方差小于1的因子其贡献可能很小;按照因子的累计方差贡献率来确定,一般认为要达到60%才能符合要求。
4.因子旋转
通过坐标变换使每个原始变量在尽可能少的因子之间有密切的关系,这样因子解的实际意义更容易解释,并为每个潜在因子赋予有实际意义的名字。
5.计算因子得分
求出各样本的因子得分,有了因子得分值,则可以在许多分析中使用这些因子,例 如以因子的得分做聚类分析的变量,做回归分析中的回归因子。
8.3 因子分析和主成分分析不同
主成分分析本身是以线性加权的方式去抽象出新变量,难以对变量背后的东西进行解释。而为了 从表象的数据中发现更深层的原因则需要用到因子分析。
因子分析和主成分分析虽然都是用于评价模型的方法,但二者有很大的不同:
- 原理不同:主成分分析是利用降维(线性变换)的思想,每个主成分都是原始变量的线性组合,使得 主成分比原始变量具有某些更优越的性能,从而达到简化系统结构,抓住问题实质的目的。而因子分析更倾向于从数据出发,描述原始变量的相关关系,将原始变量进行分解(主成分分析把方差划分为不同的正交成分,而因子分析则把方差划归为不同的起因因子)。
- 线性表示方向不同:主成分分析中是把主成分表示成各变量的线性组合,而因子分析是把变量表示成各公因子的线性组合。说白了,一个是组合,一个是分解。
- 假设条件不同:因子分析需要一些假设。因子分析的假设包括:各个共同因子之间不相关,特殊因子之间也不相关,共同因子和特殊因子之间也不相关。 主成分分析的主成分的数量是一定的,一般有几个变量就有几个主成分(只是主成分所解释的信息量不等),实际应用时会根据帕累托图提取前几个主要的主成分。而因子分析的因子个数需要分析者指定,指定的因子数量不同而结果也不同。
- 应用范围不同:在实际的应用过程中,主成分分析常被用作达到目的的中间手段,而非完全的一种分析方法,提取出来的主成分无法清晰的解释其代表的含义。而因子分析就是一种完全的分析方法,可确切的得出公共因子。
Part 9 数据包络法
数据包络分析(DEA, data envelopment analysis) 是 A.Charnes, W.W.Copper 和 E.Rhodes 在 1978 年提出的评价多指标输入输出,衡量系统有效性的方法。将属性划分为投入项、产出项(成本型、效益型指标),不预先设定权重,只关心总产出与总投入,以其比率作为相对效率。
9.1 CCR数据包络模型
9.2 BBC数据包络模型
Part 10 评价模型总结
10.1 指标体系的构建
评价类模型指使用比较系统的、规范的方法对于多个指标、多个因素、多个维度、多个个体同时进行评价的方法。不仅仅是一种方法,是一系列方法的总称,即: 对多指标进行一系列有效方法的总称。综合评价是针对研究的对象,建立一个进行测评的指标体系,利用一定的方法或模型,对搜集的资料进行分析,对被评价的事物作出定量化的总体判断。
从前面这些评价类模型的性质来看,评价类模型的核心就是三个:指标体系,权重计算,评分规则。一个好的指标体系是计算权重和评分的基础。如果没有一个好的指标体系,我们就无法对问题做出客观全面准确的评价,也无法使用前面讲述的评价类模型。
构建好的指标体系需要遵循以下几个步骤:
明确目标与目的:首先需要明确指标体系的目标和目的,以确保所选择的指标与所需评估的目标紧密相关。这涉及到确定要评估哪些方面的表现、期望达到的水平以及衡量这些评分的标准。
收集数据和信息:为了准确地度量和评估,需要收集相关数据和信息。这些数据可以来自问题本身,也可以查找文献。在数据收集过程中,需要注意数据的可靠性和完整性,以确保指标的可信度和有效性。
选择合适的指标:选择合适的关键指标对于构建有效的指标体系至关重要。指标应该具有可操作性、关联性和可靠性。可操作性是指指标应该易于测量和计算;关联性是指指标之间应该有密切的相关性或因果关系;可靠性是指指标应该是稳定和可重复的。
建立权重和优先级:为了更好地反映实际情况,需要为每个指标分配一定的权重和优先级。权重可以根据不同因素的重要性而定,比如财务指标可能比非财务指标更重要。而优先级的设定则需要根据组织的战略目标和重点关注领域来确定。
反馈和沟通:评价模型只是第一步,更重要的是要将结果进行阐述与分析,把它好理论结合起来。同时,在实际应用中不断优化指标体系,使其更加贴近实际需求。
10.2 权重生成和得分评价
权重和评分是评价类模型计算中最重要的两个部分。前面的一些方法已经给大家展示了权重的计算方法例如基于熵值、相关系数与方差、成对比较矩阵等,也有计算方法例如加权求和、计算距离、模糊隶属度等。
针对具体问题选择合适的评价类模型,需要考虑以下几个因素:
问题类型和数据类型:不同的评价类模型适用于不同的问题类型和数据类型。例如,层次分析法适用于定性与定量相结合的问题,模糊综合评价法适用于模糊性较强的问题,主成分分析法和因子分析法适用于高维度的数据降维问题。因此,需要根据问题的性质和数据类型选择合适的评价类模型。
数据量和分析需求:不同评价类模型对数据量和数据分析需求也不同。例如,熵权法需要大量的数据才能准确地计算出各个指标的权重,而因子分析法则需要较少的样本量来分析数据。因此,需要根据具体的数据量和数据分析需求选择合适的评价类模型。
算法复杂度和可操作性:不同的评价类模型算法复杂度不同,所需的计算资源和操作难度也不同。例如,主成分分析法需要较为复杂的数学推导和计算,而熵权法则相对简单易懂。因此,需要根据具体的应用场景和计算资源选择合适的评价类模型。
指标数量和权重分配:在选择评价类模型时,需要考虑指标数量和权重分配的问题。如果指标数量较多或者权重分配比较复杂,需要选择能够处理这些问题的评价类模型。例如,熵权法则可以通过熵值来判断各个指标的离散程度,从而确定各个指标的权重。
主观与客观因素:不同的评价类模型在处理主观与客观因素时有所不同。例如,层次分析法和模糊综合评价法可以较好地处理主观因素,而熵权法和CRITIC法则更加注重客观因素的考虑。因此,在选择评价类模型时,需要根据具体的问题和实际情况选择能够处理主观与客观因素的评价类模型。
参考资料:
①
②
层次分析法 | 过程解读 案例实践:https://blog.csdn.net/weixin_43095238/article/details/108055579
③
基于熵权法评估某高校各班级整体情况(公式详解+简单工具介绍)
基于熵权法评估某高校各班级整体情况(公式详解+简单工具介绍)-文章-SPSSPRO社区
④
TOPSIS方法(优劣解距离法)
https://www.cnblogs.com/jingsupo/p/12391947.html
⑤
CRITIC 法
⑥
模糊综合评价法
数学建模常用算法—模糊综合评价法(FCE)_fce隶属度最大原则-CSDN博客
⑦
RSR(秩和比综合评价法)介绍及python3实现
https://zhuanlan.zhihu.com/p/38209882
⑧
主成分分析法
数据降维大法--主成分分析法经典案例讲解(入门必看)-文章-SPSSPRO社区
⑨
因子分析法
https://blog.csdn.net/iceberg7012/article/details/109054471
https://blog.csdn.net/qq_29831163/article/details/88918422
⑩
数据包络分析法