ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

层次分析法AHP城市竞争力评价:四层结构、权重计算与一致性检验

层次分析法AHP城市竞争力评价:四层结构、权重计算与一致性检验

简介:面向经济学、统计学、城市规划与系统工程等专业学习者的一份课程学习报告,围绕层次分析法(AHP)在城市竞争力评价中的建模与应用展开,适合用作课程作业、方法入门或综合评价案例参考。文档系统梳理AHP的基本思想与操作流程,包括目标层、准则层、要素层和指标层四层结构模型的搭建,1—9标度判断矩阵的构造,层次单排序中特征值与特征向量的计算,以及一致性指标与CR<0.1的检验标准;并结合中国城市竞争力评价实例,展示71项指标的筛选归层、权重赋值和结果分析思路。资源包为1个doc文件,约832KB,内容集中、便于检索,已有139人学习。读者可从中获得较完整的AHP评价框架、指标分层示例和判断矩阵演算过程,用于理解城市竞争力综合评价的量化路径,也可为相关课程报告和论文写作提供结构参照。

1. 先看地图:AHP 做城市竞争力评价,重心其实不在算特征向量

多数人第一次接触层次分析法(AHP),注意力都放在最大特征值和特征向量怎么算上,觉得那才是硬骨头。真把一套四层指标体系铺开、把 71 项指标逐个塞进叶子节点、再请专家把两两比较填完,就会发现矩阵求特征值反而是全流程里最省事的一步,几行代码就出结果。真正决定这套城市竞争力评价能不能站住的是另外三件事:指标怎么分层、两两比较怎么打分、一致性怎么兜底。下面按这条主线走:先给四层结构的分工地图,再拆判断矩阵与 1-9 标度,然后攻权重计算与一致性检验,最后落到易错点和复习清单。

2. 四层结构怎么搭:目标、准则、要素、指标各管一段

城市竞争力是个典型的“多因子、缺硬数据、还要排名”的问题。指标从统计年鉴里能扒出几十上百项,但哪项更重要、怎么合成一个指数,年鉴不会告诉你。这也是为什么在综合评价这一族方法里,AHP 常被拿来干“赋权 + 排序”这最后一公里。

先把可选方法的边界摆清楚,选型时不容易跑偏:

方法擅长的事明显的短板
主成分分析 / 因子分析降维、消除指标间相关性权重由数据方差决定,解释性弱,说清“为什么这项重要”很难
聚类分析把相似城市归堆只分组不给权重,排不出名次
数据包络分析投入产出效率测算要求明确界定投入与产出,城市竞争力边界模糊
AHP分层拆解、权重可解释、无数据也能先搭框架主观性强,指标一多判断矩阵数量爆炸

选 AHP 的真正理由,不是它更“科学”,而是它把“专家怎么想”这件事显式写进了模型里。城市竞争力评价里,“经济实力比消费水平重要”这种判断本来就存在,藏起来不如摊开。关键是把摊开的过程做规范,这就是四层结构要解决的问题。

2.1 四层的分工:上层定方向,下层定数据

四层分别回答四个不同的问题,混在一起就会搭出一棵逻辑打架的树。

目标层只有一个元素,通常是“城市综合竞争力”。它回答的是“最后要产出一个什么东西”——一个可比较的指数,或者一份排名。目标层不出数据,只出方向。

准则层是分解总目标所遵循的准则,回答“从哪几个大维度看这件事”。这套体系里准则层只有三项:动力、阻力、相互影响。数量少是刻意的,准则层元素一多,专家两两比较的次数就压不住。

要素层是把每个准则再往下切一层,回答“这个维度由哪几种子能力构成”。比如动力下面切成经济实力、政府作用、消费水平、人力资源、科技实力五块。要素层是整棵树里最容易被搭歪的一层——切得太细会和指标层重复,切得太粗又失去解释力。

指标层是可直接采集数据的最基层指标,回答“具体拿哪个数字去算”。这一层不再有判断,只有数值。

一句话记住分工:目标层是终点,准则层是岔路口,要素层是路标,指标层是脚下的砖。递进规则只有一条硬的——同一父节点下的子元素,合起来要能完整解释父节点,彼此之间尽量不重叠。比如“经济实力”下面同时挂“GDP 总量”和“人均 GDP”,这两项高度相关,属于典型的半重叠,权重会被重复计入两次。

2.2 准则层三大板块:动力、阻力与相互影响

这套体系最值得琢磨的设计,是准则层没有一股脑全用正向指标,而是切成了动力、阻力、相互影响三块,权重分别是 0.4883、0.0893、0.2328。

动力板块权重最高,接近一半,是城市竞争力的主引擎。它下面五个要素的权重分布很说明问题:经济实力 0.4162、政府作用 0.2618、消费水平 0.0624、人力资源 0.0986、科技实力 0.1611,五项加起来约等于 1。经济实力排第一不意外,真正的信息量在第二位——政府作用被单独拎出来给了 0.2618,说明在这套专家判断里,城市治理能力不是附属项,而是和 GDP 同一量级的影响因素。反过来,消费水平只有 0.0624,是五项里最低的,这个结果应该在讨论环节被解释,而不是算完就接受。

阻力板块权重 0.0893,下面只挂了贫富分化。权重低不代表不重要,它承担的是“负向指标”的角色——别的指标越大越好,它越大越差。这一块的存在提醒了一件事:AHP 本身不区分正向负向,方向问题要在无量纲化阶段单独处理,漏掉就会把“贫富差距大”算成“竞争力强”。

相互影响板块权重 0.2328,排在第二,下面是对外开放(含依存度 0.3333)、基础设施、环境水平。这一块的名字就透露了设计意图:城市不是孤岛,它和外部的人才、资本、货物存在交换关系,这种耦合强度本身构成竞争力的一部分。对外开放下面再分出一层“依存度”,就是把“开放程度”和“对外部市场的依赖程度”拆开看。

2.3 指标层落地与权重表读法

指标层在这套体系里初步统计了 71 项,来源是各类统计年鉴。落到这一层,判断标准从“重不重要”切换成“能不能采到、能不能比”。三个实操门槛:数据是否每年公布、口径是否跨城市一致、缺失年份怎么补。任何一项过不了,指标再重要也只能降级或替换。

把各层权重拼成一张表之后,第一件事不是拿去算指数,而是做逐层校验:

层级元素权重所属父节点
准则层动力0.4883总目标
准则层阻力0.0893总目标
准则层相互影响0.2328总目标
要素层经济实力0.4162动力
要素层政府作用0.2618动力
要素层消费水平0.0624动力
要素层人力资源0.0986动力
要素层科技实力0.1611动力

动力下面五项相加是 1.0001,正常。但准则层三项相加只有 0.8104,缺了 0.1896。梳理下来会发现,这个缺口恰好等于表里“基础设施”后面跟着的那个数字,大概率是排版时把要素层的某一格挤到了准则层的位置。这种错位在手工整理的四层大表里非常常见,肉眼扫一遍很难发现,必须靠“同一父节点下子权重之和为 1”这条硬规则去卡。

提示:拿到任何一张 AHP 权重表,先做加法再做别的。加法过不去,后面所有指数都是错的。

3. 判断矩阵怎么造:1-9 标度、互反性与专家打分的边界

四层结构定完,接下来要把“经济实力比消费水平重要多少”这种模糊判断变成数字。这一步是 AHP 的精华,也是主观性最集中的地方,做得好不好直接决定结果可信度。

3.1 1-9 标度在量化什么

判断矩阵的元素取 1 到 9 以及它们的倒数,含义是固定的:

标度含义
1两个因素相比,同等重要
3前者比后者稍重要
5前者比后者明显重要
7前者比后者强烈重要
9前者比后者极端重要
2、4、6、8上述相邻判断的中间值
倒数若 i 对 j 的标度为 a,则 j 对 i 为 1/a

为什么上限是 9 而不是 100?常见的解释是人的同时分辨能力大约在 7 级上下,再细分下去,专家自己也分不清 8 和 9 的差别,填出来的数字只是噪声。这个上限还有个副作用限制:同一层元素最好不要超过 9 个,否则比较次数和判断噪声都会失控。

标度是“相对”的,不是“绝对”的。给“经济实力 vs 消费水平”打 5,不代表经济实力值 5 分,只代表在这一层里它比对方明显重要。这一点在给专家发问卷时必须写清楚,否则很容易收到一堆“给每项指标打绝对分”的表格。

3.2 判断矩阵的三个性质

n 个元素两两比较,形成一个 n×n 的矩阵 A,元素 a_ij 表示第 i 项相对第 j 项的重要程度。这个矩阵必须满足三条:

对角线全为 1,因为自己和自己同等重要;互反性 a_ij = 1/a_ji,正向填了 5,反向就必须是 1/5;传递性 a_ij · a_jk = a_ik,满足这条的矩阵叫完全一致性矩阵。第三条现实中几乎不可能完全满足,AHP 只要求“满意的一致性”,这是后面一致性检验存在的全部理由。

用前两章提到的三个准则搭一个最小例子:

import numpy as np # 准则层判断矩阵,行列顺序固定为 [动力, 阻力, 相互影响] # A[i][j] 的语义:第 i 项相对第 j 项的重要程度,取值 1-9 或其倒数 A = np.array([ [1.0, 5.0, 3.0], [1/5, 1.0, 1/3], [1/3, 3.0, 1.0], ]) # 互反性校验:a_ij * a_ji 必须约等于 1 assert np.allclose(A * A.T, np.ones_like(A)), "判断矩阵不满足互反性" # 对角线校验:自己和自己比必须为 1 assert np.allclose(np.diag(A), 1.0), "对角线元素必须为 1" # 比较次数:n 个元素需要 n(n-1)/2 次两两比较 n = A.shape[0] print(f"{n} 个元素,共需 {n * (n - 1) // 2} 次比较")

这段代码不计算结果,只做两件事:把语义写死在注释里,以及在算权重之前先挡住手工填表的低级错误。参数说明:A 的行列顺序必须和后续权重输出的顺序严格一致,中途调换顺序等于把权重张冠李戴;两个 assert 是廉价保险,跑一次不到一毫秒,却能拦住“填了 5 又填了 4”这类前后矛盾的输入。

3.3 专家打分最容易出现的两种失败

第一种是方向反了。问卷上写“请比较 A 与 B 的重要性”,专家按自己的习惯理解成“B 比 A 重要就打高分”,收回来的矩阵整体转置。最后算出的权重完全颠倒,而且因为一致性检验照样能过,这个错误极难在结果层被发现。防的办法只有一个:在矩阵上方用注释固定语义,并在汇总时抽查一对已知关系的元素,看方向对不对。

第二种是所有人打中庸分。为了避免担责,专家倾向全填 1、2、3,矩阵趋近于全 1 矩阵,算出来的权重全都接近 1/n,评价失去区分度。这时候 CR 会非常漂亮,可惜是“假合格”。识别方法很简单:看权重向量是不是一条水平线,最大权重和最小权重之比小于 1.5 就要警惕。

第三种偏操作层面:一次让专家比较十几个元素,收到一堆自己都记不住填了什么的问卷。n 个元素需要 n(n-1)/2 次比较,5 个元素 10 次,9 个元素 36 次,10 个元素直接跳到 45 次。这就是为什么要控制每层元素个数,也是为什么四层结构要把 71 项指标拆散挂到不同要素下面——每个小矩阵只管三五个元素,专家还能保持判断质量。

4. 权重计算与一致性检验:从特征向量到 CR

矩阵造好,进入计算环节。这块是考试和实操都最爱考的地方,公式不难,难在每个中间量的含义和判定阈值的用法。

4.1 层次单排序:三种算法与手算对照

层次单排序的任务是:由判断矩阵算出同一层元素相对于上一层某个元素的权重。数学上归结为求矩阵的最大特征值 λmax 和对应的特征向量,特征向量归一化后就是权重。

常用三种算法。幂法是原始材料里给出的思路:任取一个正初始向量,反复用 A 去乘并归一化,直到相邻两次结果之差小于给定精度,收敛后的向量即特征向量,λmax 由 Aw/w 的分量平均求得。方根法先按行求几何平均再归一化,手算最友好。算术平均法先把每列归一化,再按行求平均,写代码最短。

用 3.2 那个矩阵跑一遍后两种:

import numpy as np def ahp_weights(A): n = A.shape[0] # 方根法:先按行求几何平均 gm = np.prod(A, axis=1) ** (1 / n) w = gm / gm.sum() # 最大特征值:用 (Aw)_i / w_i 的均值估计 lam = float(np.mean((A @ w) / w)) # 一致性指标 CI = (λmax - n) / (n - 1) ci = (lam - n) / (n - 1) if n > 1 else 0.0 return w, lam, ci A = np.array([[1.0, 5.0, 3.0], [1/5, 1.0, 1/3], [1/3, 3.0, 1.0]]) w, lam, ci = ahp_weights(A) print("权重:", np.round(w, 4)) # [0.6370 0.1047 0.2583] print("λmax:", round(lam, 4)) # 3.0385 print("CI :", round(ci, 4)) # 0.0193

函数返回三个量,含义分别是:w 是归一化权重向量,三个分量对应动力、阻力、相互影响;lam 是最大特征值,用来判断矩阵偏离一致性的程度;ci 是一致性指标,下一步换算出 CR 要用。方根法和算术平均法算出来的结果几乎一样,本例算术平均法得到 0.6334、0.1061、0.2605,差异在小数点后第二位,选哪种都不影响排序,写论文时说明用了哪种即可。

4.2 一致性检验:CI、RI、CR 三个数字的关系

判断矩阵是人填的,前后矛盾几乎是必然。一致性检验就是给这种矛盾设一个容忍上限。

CI 由 λmax 和阶数算出:CI = (λmax − n) / (n − 1)。完全一致时 λmax = n,CI = 0;偏离越远,CI 越大。但 CI 本身没有绝对标尺,3 阶矩阵和 8 阶矩阵的“正常偏差”不是一个量级,所以要除以一个随机一致性指标 RI——它是随机填 1-9 及其倒数时算出的 CI 平均值,只和阶数有关:

n12345678910
RI0.000.000.580.901.121.241.321.411.451.49

最终判据是一致性比率 CR = CI / RI。CR < 0.1 视为满意的一致性,权重可用;CR ≥ 0.1 必须回头调整判断矩阵。上例 CI = 0.0193,n = 3 时 RI = 0.58,CR = 0.0332,远小于 0.1,合格。

RI_TABLE = {1: 0.00, 2: 0.00, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49} def consistency(A): n = A.shape[0] _, lam, ci = ahp_weights(A) ri = RI_TABLE[n] # n<=2 时 RI 为 0,CR 无定义,约定视为完全一致 cr = 0.0 if ri == 0 else ci / ri return {"n": n, "lambda": round(lam, 4), "CI": round(ci, 4), "RI": ri, "CR": round(cr, 4), "pass": cr < 0.1} print(consistency(A)) # {'n': 3, 'lambda': 3.0385, 'CI': 0.0193, 'RI': 0.58, 'CR': 0.0332, 'pass': True}

这里有个容易漏的分支:n = 2 时 RI = 0,CR 在数学上无定义。代码里显式返回 0.0 并标记通过,是为了避免除零报错,也避免把“无定义”误读成“不合格”。三层结构里 2×2 的小矩阵会很多,这个分支一定会被踩到。

CR 不过关时的调整策略,比“随便改改再算”要有章法:先定位对 CI 贡献最大的那个元素,通常是某一行里偏离整体比例最远的一格;再回到专家那里确认这一对比较是不是填错了;确认无误就小步调整,一次只动一格,改完重算。直接凑数把 CR 压到 0.1 以下,指标是过了,信息也丢了。

4.3 层次总排序:权重一路乘到底

单排序只给出“相对于上一层”的权重,最终要的是每个指标相对于总目标的全局权重。做法是逐层连乘:

全局权重 = 指标对要素层的权重 × 要素对准则层的权重 × 准则对总目标的权重。

举例:假设“人均 GDP”对“经济实力”的权重是 0.3,经济实力对动力的权重是 0.4162,动力对总目标的权重是 0.4883,那么这个指标的全局权重约为 0.3 × 0.4162 × 0.4883 ≈ 0.0610。71 项指标各自算出全局权重后,全部相加应该接近 1——这是总排序阶段唯一的校验点,不接近就说明某一层漏乘或错乘了。

# 全局权重 = 指标权重 × 要素权重 × 准则权重 w_global = { "人均GDP": 0.30 * 0.4162 * 0.4883, # ≈ 0.0610 "科研经费占比": 0.40 * 0.1611 * 0.4883, # ≈ 0.0315 "外贸依存度": 0.3333 * 0.6667 * 0.2328, # ≈ 0.0517 } print("全局权重合计:", round(sum(w_global.values()), 4)) # 仅示例,非全部指标 print("全局权重:", {k: round(v, 4) for k, v in w_global.items()})

参数说明:连乘的顺序可以换,结果不变,但三层缺一不可;字典的键是指标名,值是该指标的全局权重;这里只列三项做演示,实际项目要把 71 项全部列全再求和。求和结果偏离 1 超过 0.001,就要回头逐层核对权重表,而不是调某个指标去凑。

最后一步是合成综合指数。先对指标层的原始数据做无量纲化,最常用的是极差标准化,把每项指标压到 0-1 区间;负向指标(比如贫富分化)要用 1 减去标准化值,把方向掰正。然后与全局权重做加权求和,得到的数就是该城市的综合竞争力指数,指数越大排名越靠前。原始材料里因为 71 项指标的数据量太大、部分指标短期拿不到,最终没有算出具体城市的排名——这一步其实卡在数据采集,不是卡在方法。

5. 易错点:AHP 落地时最容易翻车的五处

公式和代码都不长,真正让人返工的是流程里几个不起眼的位置。下面五条,每一条都在实际项目里出现过,按“易漏点 → 为什么漏 → 怎么补”拆开写。

5.1 五个高频坑逐条拆

归一化没做全。易漏点:权重算完就往下走,不检查同一父节点下子权重之和。为什么漏:算法输出的特征向量本身是归一化的,容易让人以为“归一化这一步已经自动完成了”,可一旦中间做过手工删改、或者从几张不同的表里拼权重,和就不再是 1。前一章那张权重表就是活例子,准则层三项加起来只有 0.8104,缺口 0.1896。怎么补:写一个校验函数,按父节点分组求和并打印,任何一组偏离 1 超过 0.001 就中断。

一致性只查了顶层。易漏点:准则层那个 3×3 矩阵 CR 合格,就默认整棵树都合格。为什么漏:指标层有几十个 2×2、3×3 的小矩阵,批量生成之后没人逐个看,而且 2×2 矩阵 RI 为 0、CR 恒定为“通过”,很容易混在结果里造成“全部合格”的错觉。怎么补:把所有判断矩阵放进一个列表,循环跑一致性检验,输出一张包含矩阵名、阶数、λmax、CI、CR、是否通过的表,CR ≥ 0.1 的单独挑出来重做。

标度方向搞反。易漏点:矩阵建好了,但 a_ij 到底是“i 比 j 重要”还是“j 比 i 重要”,填表的人和算权重的人理解不一致,最后权重整体倒置。为什么漏:一致性检验对这个错误完全不敏感,转置矩阵的 λmax、CI、CR 和原矩阵一模一样,结果层看不出任何异常。怎么补:在矩阵定义处写死语义注释,加一条互反性断言,再挑一对关系确定的元素(比如经济实力必然重于消费水平)做方向抽查。

没做无量纲化就直接加权。易漏点:权重一算完,直接拿原始数据乘权重求和。为什么漏:AHP 只负责赋权,合成是独立的一步,两件事在代码里常常分开写,中间就断了。GDP 以亿元计、比例以百分数计、人口以万人计,量纲差几个数量级,直接加权等于让数值大的指标单方面决定结果。怎么补:合成前先做极差标准化压到 0-1,并且对负向指标取反,把这两步封成一个函数,任何指标进来都必须过一遍。

把一次专家打分当成客观事实。易漏点:权重是一串小数,看起来很像客观计算结果,写完就不再质疑。为什么漏:数字的外形掩盖了它的来源——这些权重本质上是若干位专家的主观判断经过数学加工后的产物,换个专家组,权重会变,排名也可能变。怎么补:多专家分别构阵后聚合(常用几何平均,能保持互反性),再对关键权重做敏感性分析,把某一项权重上下调 20%,看排名是否翻转;翻转了就说明结论不稳,需要在报告里说明,而不是藏起来。

5.2 一张自查表

检查项快速判断方法不合格的信号
权重归一化按父节点分组求和某组和为 0.81 这类明显缺口
一致性覆盖统计参与检验的矩阵个数只检了准则层,指标层没跑
标度方向抽查一对已知关系的元素权重排序和常识相反
无量纲化检查指标值域输入值有上亿也有 0.35
负向指标查贫富分化这类指标的处理分支用的是同一个标准化函数
术语统一全文检索“层析分析法”和“层次分析法”混用

最后一行不是凑数。标题写“层析分析法”、正文写“层次分析法”、英文缩写写 AHP,三种写法同时出现在一份材料里,检索时会漏,答辩时会被追问,统一成“层次分析法(AHP)”最省事。

6. 复习清单:一条主线、三次校验、一张对照表

这套东西复起来其实不复杂,主线只有八步,按顺序走一遍就能把整条链路串起来:分层 → 定标度 → 构判断矩阵 → 层次单排序 → 一致性检验 → 层次总排序 → 无量纲化 → 加权合成排名。八步里任何一步跳过,后面的结果都不可信,而且错误会以“看起来正常的数字”形式藏起来,这是 AHP 最坑的地方。

复习时不要平铺着看,抓三次校验就够覆盖大部分失分点。第一次校验在分层之后:同一父节点下的子元素是否互斥、是否可采集,指标有没有被挂到两个父节点下面。第二次校验在单排序之后:每组权重之和是否为 1,CR 是否全部小于 0.1,2×2 矩阵的特殊分支有没有处理。第三次校验在合成之前:无量纲化做了没有,负向指标取反了没有,全局权重加起来是不是 1。

环节必查项合格标准常见异常
分层子元素互斥且可采集无重叠、无重复挂载同一指标挂在两个父节点下
构阵互反性与对角线a_ij · a_ji = 1,a_ii = 1手工填表前后矛盾
单排序权重和≈ 1.0000.81 这类缺口
一致性全部矩阵的 CR均 < 0.1只查了准则层
无量纲化值域与方向落在 [0,1],负向已取反用同一个函数处理正负指标
总排序全局权重和≈ 1.000三层连乘漏乘一层

两道最值得单独记的公式:CI = (λmax − n) / (n − 1),CR = CI / RI。这两行在考卷上出现的频率极高,而且经常配套问“CR = 0.08 说明什么”——答案是判断矩阵具有满意的一致性,权重可以采用,不是“完全一致”。完全一致的矩阵 CR 恒为 0,现实中几乎不会出现。

还有一道容易被忽略的判断题:n = 2 时 RI = 0,CR 无定义。标准答案通常是“视为完全一致”,代码里要显式处理这个分支,别让除零异常把整批检验打断。

从那以后我每搭一套评价体系,第一件事不是打开编辑器算特征值,而是在纸上把每一层的权重和写成 1.000,再开始填矩阵。这个习惯救过我好几次——有一次要素层少挂了一个指标,加法当场就露馅了,要是等到指数算完再回头查,那才叫没有后悔药。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表