层次分析法AHP城市竞争力评价:四层结构、权重计算与一致性检验
简介面向经济学、统计学、城市规划与系统工程等专业学习者的一份课程学习报告围绕层次分析法AHP在城市竞争力评价中的建模与应用展开适合用作课程作业、方法入门或综合评价案例参考。文档系统梳理AHP的基本思想与操作流程包括目标层、准则层、要素层和指标层四层结构模型的搭建1—9标度判断矩阵的构造层次单排序中特征值与特征向量的计算以及一致性指标与CR0.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, axis1) ** (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 nCI 0偏离越远CI 越大。但 CI 本身没有绝对标尺3 阶矩阵和 8 阶矩阵的“正常偏差”不是一个量级所以要除以一个随机一致性指标 RI——它是随机填 1-9 及其倒数时算出的 CI 平均值只和阶数有关n12345678910RI0.000.000.580.901.121.241.321.411.451.49最终判据是一致性比率 CR CI / RI。CR 0.1 视为满意的一致性权重可用CR ≥ 0.1 必须回头调整判断矩阵。上例 CI 0.0193n 3 时 RI 0.58CR 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] # n2 时 RI 为 0CR 无定义约定视为完全一致 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 0CR 在数学上无定义。代码里显式返回 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 最坑的地方。复习时不要平铺着看抓三次校验就够覆盖大部分失分点。第一次校验在分层之后同一父节点下的子元素是否互斥、是否可采集指标有没有被挂到两个父节点下面。第二次校验在单排序之后每组权重之和是否为 1CR 是否全部小于 0.12×2 矩阵的特殊分支有没有处理。第三次校验在合成之前无量纲化做了没有负向指标取反了没有全局权重加起来是不是 1。环节必查项合格标准常见异常分层子元素互斥且可采集无重叠、无重复挂载同一指标挂在两个父节点下构阵互反性与对角线a_ij · a_ji 1a_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 0CR 无定义。标准答案通常是“视为完全一致”代码里要显式处理这个分支别让除零异常把整批检验打断。从那以后我每搭一套评价体系第一件事不是打开编辑器算特征值而是在纸上把每一层的权重和写成 1.000再开始填矩阵。这个习惯救过我好几次——有一次要素层少挂了一个指标加法当场就露馅了要是等到指数算完再回头查那才叫没有后悔药。希望帮到你。本文还有配套的精品资源点击获取