数学建模算法总结(快速了解使用)
前言
本系列文章目的在于帮助新人迅速了解数模比赛常用算法(概念+使用场景)不会对底层的数学原理有过多解释。
第一章 数模评价类算法
目录
一、层次分析法(AHP)
概述:层次分析法是一种将复杂问题分解成多个层次进行分析的多准则决策方法,通过构建判断矩阵和计算特征向量来确定各准则的权重。
使用场景:决策分析、资源分配、优先级排序等,如项目评估、风险评估、供应链管理。(比如:小明希望去电影院找到自己潜在最喜欢的电影,他可能需要对已有的多个电影的多个特征进行评估。每个人对灯光,画质,音质,剧情和特效的重视程度并不相同,层次分析法便可以用于对多个对象的多个特征进行分析选出最优解)
<1>使用步骤
1. 构造判断矩阵
前面提到,不同人对电影不同特征的重视程度并不相同,我们需要一种方式将不同特征的重视值量化到矩阵中用于层次分析法处理。所以,为了简化思维过程,我们首先进行评价指标的两两比较,再将比较结果汇总成最终的权重。为了量化两两比较的结果,我们要祭出一个评价体系表格说白了,就是在A和B两者比较中划分了一个1到9的重要等级。
直接看可能无法清晰的理解,让我们带入实际中运用这个表格。
巴乔(化名)是位资深二次元,对于一个动漫电影,他更加关心的是他厨的老婆特效做的好不好看而不是故事的剧情,这时候特效对于剧情就有更大的权重,下面是以剧情,特效,音效三个元素构建的判断矩阵。
剧情 | 特效 | 音效 | |
---|---|---|---|
剧情 | 1 | 1/5 | 2 |
特效 | 5 | 1 | 6 |
音效 | 1/2 | 1/6 | 1 |
上述的表格就是一个判断矩阵,我们可以看到这个判断矩阵有三个特点,对角线都为1,而且对角线对称的元素相乘都为1,这样的矩阵也被称为正互反矩阵。
但是,判断矩阵同样也会出现问题(特别是在特征值较多的情况下)上面的表格中我们可以清晰的看出巴乔对于动漫电影的的重要性排序中 【特效>剧情>音效】,但如果出现【特效>剧情,剧情>音效,音效>特效】的情况,表格就会出现矛盾(我们无法量化出准确的数值用于重要性排序),也就是评价不一致,对于该问题,我们引出了下一步骤,一致性检验。
2.一致性检验
这里我们简单引用下线性代数中的定理
- 若A为一致性矩阵,则A的最大特征值λ_max = n,其中n为矩阵A的阶,A的其余特征值均为0
- n阶正互反矩阵为一致性矩阵,当且仅当其最大特征值λ_max = n,并且当正互反矩阵非一致时,必有λ_max > n。
通过以上概念我们得以定义出一致性指标CI,CI = (λ_max – n) / (n -1)。也就是说一致性指标CI越大,整个矩阵就越不一致,当CI是0的时候是完全理想的一直矩阵。
为了得到计算出来的一致性指标到底是大还是小,我们又构建了平均随机一致性指标RI,该指标的构建方法是随机构建1000个正互反矩阵,并计算一致性指标的平均值。这里的RI也就是说当矩阵的阶数为n的时候随机的平均一致性。这相当于一把尺子,告诉大家如果完全随机(瞎蒙)的填写这个判断矩阵的结果的话,那么你的一致性指标的期望就大概是这个RI的值。RI的值通过查表即可得出:Alt
当CI和RI的比值小于0.1的时候,我们认为这个矩阵是一致的,也就是说你矩阵的一致性指标,要比平均的瞎蒙的一致性指标小一个数量级的时候,我们认为你就不是乱猜的了。这样我们就构建了我们的一致性比例CR = CI/ RI。如果说一个正互反矩阵的一致性比例没有小于0.1,那么就需要调整矩阵以满足要求。
当表格通过一致性检验后,我们就有理由认为,我们对于特征的评价是合理的,但是现有的表格过于粗略和随意,我们需要对他进行进一步的处理使计算机得以合理的计算出权重综合后的结果。
3.一致性检验通过的判断矩阵求权重
得到了合理的判断矩阵我们这里就要计算每个影响因素所占的权重,这里主要有三种方法,算数平均法,几何平均法,和特征值法求权重。
以下是不同方法的优缺点(实际比赛中可以使用多种方法比较预测效果,这在数模比赛中也是加分点)。
算术平均法
优点:简单易懂,计算方便。
缺点:对判断矩阵的次序不敏感,可能导致权重的精确性不高。
几何平均法
优点:对判断矩阵的对称性有较好的处理能,能够较好地反映相对重要性的比例关系。
缺点:计算相对复杂。(对于计算机就不是缺点,反正不是你算的)
特征值法
优点:能够处理复杂的判断矩阵,理论基础扎实,能够反映判断矩阵的内在一致性。
缺点:同几何平均法。
<2>总结
层次分析法多用于处理多个特征对结果产生影响的场景(评选,决策),但是需要注意层次分析法考虑的因素不能过多,不论是候选的种类,还是评价的指标都不能太多否则结果的好坏会大打折扣。该方法一般出现在竞赛中的第一小问,在后续问题中不建议使用此方法(太垃圾了,一般都解决不了问题)
需要注意的是,层次分析法一般用于所有对象的评价标准一致的情况。例如:上文中巴乔对动漫电影的特征重视程度为特效>剧情>音效,但是对于歌剧类电影,人们往往会更加注重音效。(不会有人注重哥斯拉的剧情,或者生活向电影的特效,当这些电影同时出现在备选栏中简单的判断矩阵就不能满足复杂的判断情况了)对于这类复杂的情况,简单的层次分析并无法适用。
二、TOPSIS(优劣解距离法)
概述:TOPSIS法通过计算各方案与理想解和负理想解的距离来进行评价排序,以选择最优方案。
使用场景:用于多准则决策分析,如供应商选择、投资决策、技术评估等。
上文提到,我们可以通过层次分析法(AHP)解决一些较主观的决策问题,但是当面对方案层较多的情况时(通过多个指标评价多条河流水质情况的问题),模型很难通过一致性检验,预测效果也会大大折扣。生活中,河流中不同元素的指标类型往往并不相同(含氧量往往越大越好,有害菌数量越少越好,ph值越趋近于中性越好…)这些指标往往客观存在且数量较多,而topsis便是解决这类问题的一种综合评价方法,它既可以充分利用原始数据,又能反应不同流域的水质差距,且计算过程简单,模型无需检验(省了一步还不容易出问题,数模比赛写就完了,不可能判错的),数据真实可靠。
<1>使用步骤
1. 原始矩阵正向化(即统一转化为极大指标)
上文提到,关于河流质量的评判指标大概有四种,分别是极小型指标,极大型指标,区间型指标,中间型指标。我们需要将这些指标统一转换为极大指标(为后续模型综合指标做出评价做准备)。
1)极小型指标:转换方式为max-x或者1/x。
2)中间型指标:中间型指标指其数值在某个中间值时为其最佳值,例如PH值,PH=7即为其中间值(最佳值)。其转换方法如下。
3)区间型指标: 区间型指标指其数值落在某一个区间内时均为最佳值,例如人的体温区间为[36,37.2]。假设其最佳区间为[a,b],则其转换方法如下。
2. 正向化矩阵标准化
在完成了矩阵正向化后,在评价之前我们需要指定评价方法并统一评分,规则否则可能造成尺度混乱(有些指标数值过大有些指标数值过小,导致数值小的指标特征不明显)。在这里,我们引入标准化处理的概念。
标准化处理:为了消去不同指标量纲的影响,需要对已经正向化的矩阵进行标准化处理
3. 计算得分并归一化
经过以上两步对评价指标的处理后,我们便可以开始对对象开始评价。
多个指标:z与最小值的矩阵/z与最大值的距离+z与最小值的距离。
这部分公式较抽象,想直接拿来用不用深究其原理,计算过程可以参考下面b站的这个视频。
B站topsis教学视频
<2>topsis总结
topsis在处理非主观,评价指标和对象较多的情况时效果更好。相较于层次分析法,其更着重对原始数据的使用和发掘,也省略了一致性检测的过程,受主观因素的影响程度小。在处理一些类似水质检测,质量检测,产品质量的问题时更加简便有效。需要注意的是,topsis处理的问题往往是评价指标已经给出的(比如最佳ph值为7)。topsis还能与熵权法结合,改变不同评价指标的权重(比如,政府部门认为河流的清澈程度重要性大于大肠杆菌数量限制的重要性,清澈度这一评价指标的权重就可能更高,这里不做过多介绍)。
三、熵权法
上文中提到,topsis可以与熵权法结合,客观的去强调那些差值与起伏更大的数据。与其说熵权法是一种新的评价方法,倒不如说熵权法是一种模型中的插件。上文中提到的AHP与TOPSIS算法从本质意义上来讲,都不是完全非主观的算法(毕竟topsis用到的各种指标也是各种专家认为制定的)。熵权法的出现,使模型从真正意义上来说,实现了客观的权重调整。比如,当几个河流的有害菌数目差不多,有益菌的数量差值更大时,我们有理由将有益菌数量这一指标看的更加重要。熵权法的出现,就客观的实现了这一过程。
使用步骤
熵权法可分为两步(本质上其实是一步),分别是熵与权重的计算。高中物理上提到,熵是用来衡量一个系统稳定程度的指标。一个系统的熵值越大,证明该系统越不稳定。在题目环境中也就说明了,该指标可能是更有决定性更重要的指标。我们理所应当为其赋予更大的权重。
1. 熵的计算
2. 权重计算
通过熵权法计算出来的权重乘以指标便可以客观的调整各指标权重。
四、Topsis与熵权法结合代码示例
import numpy as np
# 1. 导入数据,假设为电影评价模型,导入三部电影数据差评,特效,剧情,人数(50为最优)
data = np.array([
[58,110,120,80],
[12,58,110,12],
[23,42,119,58]
])
# 2.规定指标正负向性,或者目标值
positive_direction = [False, True, True, None]
target_value = [None, None, None, 50]
# 3.数据正向化(包括目标值优化)
def positive_transform(data, positive_direction, target_value):
for i in range(data.shape[1]):
# 取差值绝对值,目标优化
if positive_direction[i] is None:
data[:, i] = np.max(np.abs(data[:, i] - target_value[i])) - np.abs(data[:, i] - target_value[i])
# 负向指标,最大减最小
elif not positive_direction[i]:
data[:, i] = np.max(data[:, i]) - data[:, i]
return data
# 4.数据标准化与归一化
def normalize_data(data):
# 第一步进行标准化
norm_data = data / np.sqrt(np.sum(data**2, axis=0))
# 第二步:进一步除以每列的和,使得矩阵变为概率矩阵
norm_data = norm_data / np.sum(norm_data, axis=0)
return norm_data
# 步骤2:数据标准化 (归一化)
# def normalize_data(data):
# min_vals = np.min(data, axis=0)
# max_vals = np.max(data, axis=0)
# norm_data = (data - min_vals) / (max_vals - min_vals)
# return norm_data
print('经过处理后的矩阵数据')
positive_transform(data, positive_direction, target_value)
print(data)
data = normalize_data(data)
print(data)
# 5. 计算熵值
def calculate_entropy(data):
p = data / np.sum(data, axis=0)
p = np.where(p == 0, 1e-10, p) # 避免log(0)
entropy = -np.sum(p * np.log(p), axis=0) / np.log(len(data))
return entropy
# 6. 计算权重
def calculate_weights(entropy):
weights = (1 - entropy) / (1 - np.sum(entropy))
return weights
# 7. topsis计算
def topsis(data, weights):
weighted_data = data * weights
ideal_best = np.max(weighted_data, axis=0) # 理想最优解
ideal_worst = np.min(weighted_data, axis=0) # 理想最劣解
dist_best = np.sqrt(np.sum((weighted_data - ideal_best) ** 2, axis=1)) # 与最优解的距离
dist_worst = np.sqrt(np.sum((weighted_data - ideal_worst) ** 2, axis=1)) # 与最劣解的距离
score = dist_worst / (dist_best + dist_worst) # 计算得分
return score
# 主函数调用
transformed_data = positive_transform(data, positive_direction, target_value)
norm_data = normalize_data(transformed_data) # 归一化数据
entropy = calculate_entropy(norm_data)
weights = calculate_weights(entropy)
scores = topsis(norm_data, weights)
print("各方案的得分:", scores)
print("最优方案的索引:", np.argmax(scores))
五、模糊综合评价法(FCE)
当我们评价一条河流的各项指标时,我们很容易得出各项指标的具体数值,类似的还有人的身高,体重。以上这些我们将其称为确定性概念。但是当我们被问到一个人的身高算高还是不高,一个老师好不好时,不同的人很有可能给出不同的答案(同样没有学习的学生一个被老师捞上来了他当然觉得这个老师好,至于挂科的就不好说了)这些往往称为模糊性概念,当涉及到这些问题时,就可能要用到模糊综合评价法。
引子
在详细介绍算法时,我们先引入经典集合,模糊集合与隶属函数这三个概念。
-
经典集合
集合只具有相同属性的事物集体(就是你高中,高数和离散讲的那个集合)
比如:自然数集,实数集,性别种类 -
模糊集合与隶属函数
模糊集合是用来描述模糊性概念的集合(年老,年轻,漂亮,丑陋) ,与经典集合相比模糊集合承认亦此彼此。一个人可能又丑又漂亮(卧槽这样讲好抽象)。
举个例子,一个模糊集合可能包含{漂亮,丑陋}两个概念,当是个人中有九个人觉得漂亮时,漂亮这一选项的可能性即为0.9,与此相对丑陋就是0.1。(对应模糊统计法)
<1> 使用步骤
1. 判断模糊集合分类
2. 隶属函数的选择
隶属函数的确定方法分为三类,在这里只介绍最常用的指派法。(主观的确定方法,根据类型直接套用函数)
3. 引入计算集合
在模糊综合评价的计算过程中,我们需要引入三个集合。分别为(因素集,评语集,指标集)
4. 模糊矩阵计算
hu
在通过上文引出的概念确认模糊判断后,通过模糊判断矩阵与权重值矩阵相乘的操作即可得到最终的模糊集合。