本文主要介绍使用Python实现层次分析法的方法,并以一个实际案例加深理解和掌握。
一、什么是层次分析法
层次分析法(AHP)是一种定量分析复杂决策问题的方法,它通过将一个决策问题仿照人的思维过程层层分解为若干个层次,从而获得问题的结构层次体系模型。
层次分析法的基本思想是把问题的复杂结构分解成若干个层次,从上到下逐层递进,直至最底层具体问题。该方法采用成对比较法来确定各层次指标之间的权重,然后将各层次指标的权值汇总得到最终权重。通过该方法得到的决策结果具有客观性和准确性,因此在决策分析、战略规划和风险评估等领域有着广泛应用。
二、Python中的层次分析法
Python中非常流行的AHP库是pyanp,它提供了层次分析法的核心算法和数据结构。首先需要使用pip安装该库:
pip install pyanp
接下来我们可以通过以下代码来实现AHP:
from pyanp import *
from pyanp.priority import Priority
from pyanp.values import *
#定义我们的结构层次
profile = Hierarchy("冰淇淋品牌选择")
profile.add_level("标准") #顶层root是默认添加的
profile.add_level("选择")
profile.add_level("备选")
profile.add_level("可选")
#添加准则
stds = ["价格", "口感", "颜色", "品种"]
profile.add_children("标准", stds)
#添加选择备选集合
profiles = ["哈根达斯", "雪糕皇后", "Baskin Robbins", "Ben & Jerry’s", "米兰达"]
profile.add_children("备选", profiles)
#添加指标
c1 = ["高", "稍高", "一般", "略低", "低"]
c2 = ["好吃", "不错", "一般", "不好吃", "难以下咽"]
c3 = ["白", "黄", "红", "绿", "棕"]
c4 = ["巧克力", "芒果", "草莓", "抹茶", "香草"]
#对于每个标准,分配一组值
profile.add_values("价格", make_priority(numeric_values(c1)))
profile.add_values("口感", make_priority(numeric_values(c2)))
profile.add_values("颜色", make_priority(numeric_values(c3)))
profile.add_values("品种", make_priority(numeric_values(c4)))
#对每个备选品种也进行组内比较,比较每个备选品种在各个标准下的得分
b_values = {
"哈根达斯": [3, 5, 4, 3],
"雪糕皇后": [4, 4, 3, 5],
"Baskin Robbins": [5, 3, 5, 2],
"Ben & Jerry’s": [2, 5, 2, 4],
"米兰达": [1, 2, 1, 1]
}
for profile in profiles:
pr = Priority(profile + "选择")
for std, vals in b_values.items():
pr.set_value(std, vals[profiles.index(profile)])
profile.set_priority(pr)
#计算最终权重
final_weights = pairwise_compare(profile)
for p, w, wf in final_weights.top_n():
print(p, w, wf)
三、实例演示:如何选择最好的手机
为了更好地理解和掌握AHP的实现过程,我们可以使用一个实际的案例——如何选择最好的手机。
手机选择涉及到多个因素,如价格、外观、屏幕分辨率、电池续航能力等等。一般来说,选择手机的过程非常复杂,所以用AHP来解决这一问题非常合适。下面我们通过Python代码来演示选择最好的手机的过程:
from pyanp import *
from pyanp.priority import Priority
from pyanp.values import *
profile = Hierarchy("选择最好的手机")
profile.add_level("标准")
profile.add_level("选择")
profile.add_level("备选")
profile.add_level("可选")
#添加准则
stds = ["价格", "外观", "屏幕分辨率", "电池续航能力"]
profile.add_children("标准", stds)
#添加备选和可选手机
profiles = ["华为", "小米", "苹果", "三星"]
profile.add_children("备选", profiles)
left = ["VIVO", "OPPO", "联想", "红米", "realme"]
profile.add_children("可选", left)
#添加标准指标比较值
c1 = [1500, 2000, 2500, 3000, 3500, 4000]
c2 = ["尺寸小", "体积小巧", "平凡一般", "样式别致", "尺寸大", "庞大沉重"]
c3 = ["480p", "720p", "1080p", "2K", "4K"]
c4 = ["6h以下", "6h-10h", "10h-18h", "18h以上"]
hv_profile = {"华为": [1500, "平凡一般", "2K", "10h-18h"], "小米": [2500, "平凡一般", "1080p", "18h以上"],
"苹果": [4000, "平凡一般", "2K", "10h-18h"], "三星": [3000, "样式别致", "720p", "6h以下"]}
lv_profile = {"VIVO": [1500, "尺寸小", "480p", "18h以上"], "OPPO": [2000, "体积小巧", "720p", "6h以下"],
"联想": [2000, "平凡一般", "720p", "10h-18h"], "红米": [2500, "尺寸大", "1080p", "10h-18h"],
"realme": [3000, "庞大沉重", "2K", "6h-10h"]}
for profile in profiles:
pr = Priority(profile + "选择")
for std, idx in enumerate(stds):
pr.set_value(idx, hv_profile[profile][std])
profile.set_priority(pr)
for profile in left:
pr = Priority(profile + "选择")
for std, idx in enumerate(stds):
pr.set_value(idx, lv_profile[profile][std])
profile.set_priority(pr)
final_weights = pairwise_compare(profile)
for p, w, wf in final_weights.top_n():
print(p, w, wf)
四、总结
层次分析法是一种非常实用的、广泛使用的决策分析方法,它可以解决在某个特定层次上的决策问题。Python中pyanp库提供了层次分析法的核心算法和数据结构,可以方便地实现该算法。
通过本文,我们对层次分析法的基本使用以及实际案例进行了详细的阐述,相信读者可以更好地理解和掌握该算法。