多属性量化决策模型,专治选择难题
缘起
人生就是一个不断选择的过程,而人的时间和精力有限,往往不能“既要、也要、还要”。影响的因素是多样且复杂的。弱弱的人脑,往往难以做出好的选择。取舍是痛苦的。这种情况,希望有一把“尚方宝剑”,能快刀斩乱麻地解决。不用求神、不用占卜,这里有一种方法,是靠谱的、自己可操作的,能解决所有难以取舍的问题,而且得到的答案几乎是最好的。
为了好理解,用例子来说明。比如我快要升学了,有几个学校我比较感兴趣,现在准备填“志愿表”,大家都知道“第一志愿”很重要,那么第一志愿填哪一个学校呢?选择哪个学校涉及到每个学校的属性。一个学校有很多属性,比如学校的名声(是不是985、211)、与家的距离、学校当地的消费水平、师资力量等等。只挑那些比较关注的属性。比如我,比较关注考上的可能性、与家的距离、消费水平。
数据从哪来
- 考上的可能性是一种概率,根据去年的录取分数线和自己的(模拟考试或真实考试)成绩可大致算出这个可能性。
- 距离可以直接从地图软件上获得。
- 消费水平可以根据学费大致反应出当地的消费水平。顺便说一句,宿舍费也是很好的一种体现。
去年的录取分数、学费和宿舍费都不难查到的,学校发了一本小册子,里面就有这些数据。于是确定下来,3个属性是录取分数、距离、年学费。
总体思路
接下来把属性横列,几个学校竖列,得到一张表:
录取分数 | 距离 | 年学费 | 得分 | |
A学校 | 600 | 850 | 3600 | |
B学校 | 590 | 1800 | 3200 | |
C学校 | 570 | 1600 | 4000 |
我们的思路是根据关注的属性,算出每个学校的得分,得分最高的就是最合适的,第一志愿就填它。所以,接下来要解决如何计算出得分。
分析属性
我们发现3个属性的单位不同,数值范围不同,方向也不同。
- 录取分数 没有单位(或者说是分)、范围是0到900,个人觉得略低于我的模拟考分数最好。
- 距离 单位是公里,范围是0到4000,对我而言是太近太远都不好,1000公里最好。
- 年学费 单位是元,范围是1000到1万,越便宜越好。(我是穷学生)
标准化
标准化的目标是去除单位,并转化为统一的数值范围,即数据区间。比如都转成0到100这个范围,无单位。我们需要找到每个属性对应的公式来把具体的原始数值转化为统一的区间。为了方便地得到这个公式,我们先制作下面这张表。
属性得分 | 录取分数 | 距离 | 年学费 |
100分 | 580 | 1000 | 2500 |
50分 | 630 | 2000 | 5000 |
- 本来年学费应该是免费最好,考虑到实际情况,我还是定为2500元得100分,5000元得50分。
- 已知我的模拟考试成绩是600分,于是我定了录取分数580分最好,得100分,而如果是录取分数是630分则只能得50分。
- 为了简单起见,这里我会写3个属性都是对称的,即与最佳数值距离相同的数据,得分也相同。比如最佳是580,630得50分,则530也得50分。
经过小学数学的运算,得到了公式:
标准_录取分数 = 100 - (|录取分数 - 580|) / 1 标准_距离 = 100 - (|距离 - 1000|) / 20 标准_年学费 = 100 - (|年这费 - 2500|) / 50 |
其中|x|表示x的绝对值。如果你不清楚那个20和50――即除数也叫倍率或者叫缩放系数――怎么算出来的,请看:
距离_倍率 = (2000 - 1000) * 2 / 100 = 20 年学费_倍率 = (5000 - 2500) * 2 / 100 = 50 |
表如下:
录取分数 | 距离 | 年学费 | 标准_录取分数 | 标准_距离 | 标准_年学费 | 得分 | |
A学校 | 600 | 850 | 3600 | 80 | 92.5 | 78 | |
B学校 | 590 | 1800 | 3200 | 90 | 60 | 86 | |
C学校 | 570 | 1600 | 4000 | 90 | 70 | 70 |
因为实际的数据有大有小,代入公式后可能会产生负数的情况,于是我们规定,每个属性的最小得分是0分。是否允许负分可根据实际情况决定。
计算得分
这样就把每个属性去掉了单位且数值都化成0到100之间,但每个属性的重要程度不同,所以为每个属性加上权重。通常,全部权重加起来是100%。比如录取分数40%,距离20%,年学费40%,所以
得分 = 标准_录取分数 * 0.4 + 标准_距离 * 0.2 + 标准_年学费 * 0.4 |
40% | 20% | 40% | |||||
录取分数 | 距离 | 年学费 | 标准_录取分数 | 标准_距离 | 标准_年学费 | 得分 | |
A学校 | 600 | 850 | 3600 | 80 | 92.5 | 78 | 81.7 |
B学校 | 590 | 1800 | 3200 | 90 | 60 | 86 | 82.4 |
C学校 | 570 | 1600 | 4000 | 90 | 70 | 70 | 78.0 |
这样就得到了每个学校的得分,此得分已经综合考虑了本人的具体需求,分数越高说明越适合我,如果我发现结果与直观感觉有较大的出入,可能是公式或参数设得不合理,可以调整公式和参数,最终得到满意的模型和答案。
总结
总结一下,遇到此类问题的处理过程:
- 找出候选的选项和关注的属性
- 将关注的属性转化为能获取到数值的属性。必要时可填入主观分(比如手机的发热程度)。
- 将每个属性去单位,并设计公式将实际区间转为标准区间。通常是0到100。标准区间内数字越大代表越符合意愿。
- 设置权重,计算出每个选项的得分。
- 观察结果,微调参数,直到得到满意的模型。
此方法适用于从多个选项中挑选最满意的前n项,如果你心里很明确哪个项是你最合适的,也就不必使用此方法了,当选项多、属性多令你为难的时候,正是此方法大展身手之时。在Excel中处理比较方便。小到购物,大到做投资、择偶,都可以参考使用。属性越多,选项越多,作用越突出。
我曾经在高考填写志愿表时使用此方法,在毕业后购买第一台笔记本电脑时再次使用此方法。用此方法得到的结果很令人满意。购买笔记本时考虑的有CPU性能、内存大小,硬盘大小,屏幕大小,价格,是否有无线网卡等多个因素。多年以来,购买的笔记本电脑没让我失望。虽然存在多处主观参数,可能算出现的最佳选项不是客观上的最佳,但也不会偏离最佳太远。
此方法的核心优势是在设计单个属性的转化公式时,不必考虑其它属性的影响。在设计权重时,不必考虑具体属性的单位和区间范围等差别。最终得分能兼顾各个属性的共同影响。操作过程简单,得到的结果实用。
出于简单说明模型原理的需要,例子中3个属性都采用了线性关系转化为标准区间。线性关系即可用y=kx+b来表示。实际问题和属性多种多样,当线性关系不能很好地适应实际问题时,可以考虑其它的映射关系,常用的有y=x的n次方,y=n的x次方,以及y=log(x)。其中对数函数是是减速增长(底数大于1),另外两种是加速增长(n大于1)。图片来自网络,供参考:
遇到更复杂的情况时,还可以采用分段的方式,不同的区间采用不同的公式。比如录取分数,小于580采用线性,大于580采用加速增长。需要在面对具体问题时灵活变化,组装出适合的公式。
在遇到几个问题后,通过总结和抽象,最终得到一套运算模型,是解决一大类问题的通用解法,虽然摸索的过程艰辛,但成果很不错。以后遇到此类问题,就可以套用这个模型,省得再去尝试各种办法。这就是对懒人精神很好的诠释。
这套方法是我在2001年采用模糊数学的思想设计的。至今不知道是否别人也设计过此方案。至今也没有个正式的名字,今为了写这篇文章才起了个标题。如果有人知道前人设计了它,请告诉我名字。如果它目前都没有名字,请帮取个合适的名字。希望这个方法能在你遇到类似问题时,帮你找到满意的答案。
感谢 @楷 对本文提出诸多宝贵的意见和建议。
博主简介:佘焕敏(shé),洋名 Billy Sir。
关注编程基础技术,并致力于研究软件的自动化生成。 对编程规范化、面向对象的极致使用也有着浓厚的兴趣。 同时非常希望能够写程序到65岁。
只有工匠精神,才能把常人觉得单调乏味的代码,当作作品雕刻成艺术品。
重点:这里几乎每一篇文章,都是我认真创作的,凝结了心血。写作从来都不是一件容易的事,对从小语文不好的我而言,是难上加难。而且,你发现没有,文中没有广告。这篇文章介绍了为什么要写这些文章。
放个赞赏码,省得找起麻烦,万一真有人要赞赏呢。赞赏伤钱,三思后行。真要赞赏,一两块意思一下就好。