好的,今天继续研究评价类模型的相关算法。实不相瞒,虽然我才写到第二个算法,但是已经听了几十节课了,清风老师的课程确实蛮不错的,实用性比较强。相关的模型、算法基本上越往后越难,所以珍惜现在比较容易理解的评价类模型吧hhh。
在这里要说明一下,小白本白只是一个即将大三的本科生,目前比较容易理解的模型我还能写得完整一些。之后很多模型会涉及较为复杂的数学推导,我可能很难完整地从原理去描述了,只能着重于实际应用方面。请各位谅解啦。
ok,我们继续学习评价类模型算法。
(注:以下案例均来自我所听的网课)
回顾
上一篇文章我们介绍了一个简单又实用的评价打分方法——层次分析法。同时我们也提到了,层次分析法有一些缺陷之处。首先就是主观性较强,层次分析法往往是专家用来打分的方法,但建模比赛中没有专家,判断矩阵只能我们自己填;其次,当指标或者方案层数量较多时,我们两两比较得出的判断矩阵和一致矩阵可能会出现较大的差异(想一想你的心理预期,有多符合那个乘法关系),判断矩阵的填写也会比较麻烦(例如要问 C 20 2 C_{20}^2 C202次问题);再者,层次分析法往往用于没有相关数据的问题,我们的打分也是按照判断矩阵给出的,如果已经有了数据,再主观打分就不太合适了。
看看这个题目
给出 A — T A—T A—T二十条河流的水质指标及具体数据,请建立合适的模型,给这些河流的水质从高到低排排序。嗯,现在再用层次分析法,是不是就不太合适了……
TOPSIS算法
TOPSIS算法是解决上述问题的一个比较合适的算法,其全称是 T e c h n i q u e f o r O r d e r P r e f e r e n c e b y S i m i l a r i t y t o a n I d e a l S o l u t i o n Technique\ for\ Order\ Preference\ by\ Similarity\ to\ an\ Ideal\ Solution Technique for Order Preference by Similarity to an Ideal Solution,通俗的翻译则是“优劣解距离法”。这个翻译可以说是指向了此算法的本质,我们接下来慢慢谈。
我们依然从一个简单的问题入手。小明同学考上南大之后,不知不觉就迎来了第一次高数考试,他及其舍友的分数如下。
现在我们要根据他们的成绩,给他们进行打分,要求分数可以合理地表达其成绩的高低。hhh可能会有人觉得这个问题比较奇怪,成绩本身就可以作为所谓的分数了,实在不行我们还有GPA,怎么还要打分?因为这只是一个例子,事实上在许多实际问题中,我们只有数据,例如上面水质问题的含氧量,PH值,并没有这样一个分数。再者,实际问题中有很多的指标,其量纲经常不同,但我们需要通过这些数据得出一个综合的分数。因此我们很有必要对数据进行一定的处理,同时找到一个综合打分的方法。
所以我们有一个很直接的想法,就是对分数进行归一化处理,例如清风的最后得分就是 99 89 + 60 + 74 + 99 = 0.307 \frac {99}{89+60+74+99} = 0.307 89+60+74+9999=0.307。嗯,这个想法很合理。即一个人的成绩占总成绩的比重,就可以作为这个人在总体中的得分。但是注意了,这里只有一个指标,所以我们可以直接用这个得分作为排序标准。如果还有一些指标,同样进行类似的操作,实际上就相当于我们对数据进行了处理,消去了量纲的影响罢了。结果就是,一番操作过后,留给我们的仍然是一个得分表格,只不过里面是已经被处理过的数据,但还是没能给出排名。
这里提出一个小问题,我们把PH值作为衡量水质的一个标准,其范围是0~14,PH=7时最好,所以PH=7时相关指标得分应该最高。这时候就不能像成绩那样,直接求和算比重了吧,那应该怎么处理呢?
ok,我们继续。上述的操作只是对数据进行了处理,我们还是需要一个打分的标准。有同学就会想到,赋权,然后打分。这就回到了我们层次分析法的内容。还是那些问题,主观性比较强,指标太多时操作起来不准确且麻烦,对数据的利用不充分等等。
这里就可以引入TOPSIS的想法了。事实上我们的目的是对方案给出一个排序,只要数据有了,我们就可以根据这些数据,构造出一个所有方案组成的系统中的理想最优解和最劣解(我感觉最劣解和理想不搭,就直接用最劣解称呼吧)。而TOPSIS的想法就是,我们通过一定的计算,评价系统中任何一个方案距离理想最优解和最劣解的综合距离。如果一个方案距离理想最优解越近,距离最劣解越远,我们就有理由认为这个方案更好。那理想最优解和最劣解又是什么呢?很简单,理想最优解就是该理想最优方案的各指标值都取到系统中评价指标的最优值,最劣解就是该理想最劣方案的各指标值都取到系统中评价指标的最劣值。这么说可能不是很清楚,举个例子。
如果我们只有一个指标,例如上图中的成绩,那么理想最优解就是99分,注意,不是满分100分,理想最优解中的数据都是各方案中的数据,而不要选择方案中没有的数据。不然如果是GDP这种上不封顶的指标,理想最优取值岂不是正无穷了……同理,该系统中的最劣解是60。
那如果有两个指标呢?例如我们引入一个“与他人争吵的次数”,用来衡量情商,给出相应的数据表格。
按照我们的一般想法,与他人争吵的次数应该是越小越好,所以我们可以用向量表达这个系统中的理想最优解,也就是 [ 99 , 0 ] [99,0] [99,0],取清风的成绩和小王的争吵次数,最劣解就是 [ 60 , 3 ] [60,3] [60,3],取小王的成绩和清风的争吵次数。
现在我们知道了如何取得理想最优解和最劣解,那如何衡量某一个方案与理想最优解和最劣解的综合距离呢?TOPSIS用下面一个表达式进行衡量: 某 一 方 案 − 最 劣 解 理 想 最 优 解 − 最 劣 解 \frac {某一方案 - 最劣解}{理想最优解 - 最劣解} 理想最优解−最劣解某一方案−最劣解。可以发现,如果方案取到了理想最优解,其表达式取值为1;如果方案取到了理想最劣解,其表达式取值为0。我们便可以用这个表达式来衡量系统中某一个方案距离理想最优解和最劣解的综合距离,也直接用它给方案进行打分。
相信到这里大家对于TOPSIS的基本思想已经差不多理解了,之后就是实际操作的问题了。我们都知道,“方案 - 最劣解”这种东西只是方便理解,确实也是我编出来的,实际中方案根本不能做差。所以我们只能用数据来求出这么一个距离。对于某一个指标的数据,我们可以用 x − m i n m a x − m i n \frac {x-min}{max-min} max−minx−min来衡量综合距离。如果只有成绩这一个指标,其计算很简单,例如清风的得分就是 99 − 60 99 − 60 = 1 \frac {99-60}{99-60}=1 99−6099−60=1,其余人的成绩可以依次给出。对于“争吵次数”这个指标,清风的得分可以是 3 − 3 0 − 3 = 0 \frac {3-3}{0-3}=0 0−33−3=0,虽然也能计算,但其分母是个负值,还是不太习惯。那如果对于PH值,7是最优解,0和14哪一个看成最劣解用于计算呢?亦或者如果某个指标处在10~20之间最佳,那最优解最劣解又如何衡量呢?这便是我们遇到的问题。除此之外,由于数据的量纲不同,在实际的计算过程中也会出现这样或者那样的问题,因此我们也有必要对于原数据进行相关的处理。
首先,我们解决第一个问题,有些指标的数据越大越好,有些则是越小越好,有些又是中间某个值或者某段区间最好。我们可以对其进行“正向化处理”,使指标都可以像考试分数那样,越大越好。
我们可以把指标分为四类,如下表所示。
所谓的正向化处理,就是将上述的四种指标数据进行处理,将其全部转化为极大型指标数据,这样我们计算时问题就少一点,码代码时也更加统一。
对于极小型指标,例如费用,争吵次数,我们可以用 x ^ i = m a x − x i \hat x_i=max-x_i x^i=max−xi将其转化为极大型,如果所有元素都为正数,也可以使用 x ^ i = 1 x i \hat x_i= \frac {1}{x_i} x^i=xi1。示例如下。
对于中间型指标,如果其最佳数值是