我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

解释结构模型ISM:用矩阵运算构建复杂系统层次结构

解释结构模型ISM:用矩阵运算构建复杂系统层次结构 第一次用解释结构模型建模时我花了大半个晚上核对计算结果却发现自己把矩阵的方向搞反了。这件事听起来很小但在 ISM 的语境里方向一旦错了整棵层次树都会上下颠倒后面给出的管理建议也就全跑偏了。后来我把这套方法陆续用在企业数字化转型因素分析、供应链风险传导、软件项目失败原因梳理这些真实场景里才慢慢意识到解释结构模型ISM真正考验你的不是矩阵运算而是对系统要素和影响关系的理解是否足够清醒。ISM 要解决的问题一句话就能讲清楚给你一堆彼此有直接关系的系统要素通过布尔矩阵运算把它们的间接关系也找出来再按“谁影响谁”的路径把要素拆成层级输出一张多级递阶结构模型图。当你面对的从来不是一个变量而是一堆互相咬合的变量时最该做的就是先看清层次再谈怎么干预。这篇文章围绕“解释结构模型ISM构建复杂系统层次结构”展开。我会从方法论本身的思路讲起再用一个完整的企业数字化转型影响因素案例把从邻接矩阵、可达矩阵到层级划分的全流程手算一遍最后分享我在实操中踩过的坑和可以直接套用的Python代码。无论你是在做学术研究、写咨询报告还是单纯想把自己脑子里的复杂问题理清楚这套方法都值得你花一个下午掌握。1. 解释结构模型究竟在解决什么问题1.1 把“关系网”理顺成“层次链”一提到复杂系统很多人的第一反应就是“变量太多关系太乱”。比如影响企业数字化转型的因素随便一列就能写上二三十个领导重视、IT基础、人才储备、资金投入、流程再造、数据治理、员工接受度……而且这些因素之间不是简单的并列关系它们互相影响高管重视会带来资金投入资金投入能推动平台建设平台建设又会倒逼流程变革流程变革又影响员工接受度。如果把这些关系全部画在一张纸上你得到的就是一团乱线。ISM 的逻辑是承认系统很乱但要通过一套可复现的矩阵运算把这团乱线整理成一棵有层次的树。它不需要历史数据不需要统计检验只需要领域专家给出要素之间的二元关系判断A 是否对 B 有直接影响有就记 1没有就记 0。接下来所有推演都建立在这张邻接矩阵之上最终输出的是把要素分到不同层级的多级递阶结构模型。我第一次接触这个方法的时候觉得“这不就是算矩阵吗”直到真正用它分析问题才意识到ISM 最大的价值不在于矩阵本身而在于建模过程迫使你把要素和关系逐一理清。很多专家在填写关系表的环节就发现原来的要素清单有问题要么表述有歧义要么两个要素根本不是同一个层次的东西。这种把隐性经验显性化的过程很多时候比计算结果本身更有价值。1.2 它的边界在哪里和 DEMATEL、AHP 怎么区分ISM 经常和 DEMATEL、AHP、ANP 这几个词一起出现新手很容易搞混所以我把它们的关键区别整理一下。AHP 的强项是排序打分面对“这几个候选方案选哪个”的时候最好用ANP 把 AHP 的严格层级放宽了允许网络狀的互相影响但问卷设计和计算负担都很重DEMATEL 能算出每个要素的影响度、被影响度和中心度把要素分成原因型和结果型但它输出的是一张数值化因果图不是递阶层次。相比之下ISM 的定位非常明确它只负责回答“系统是怎么样组织起来的、底层根因在哪里”。所以我的经验是如果你的问题是“先抓哪个、抓多大力”选 DEMATEL 或 AHP 更合适如果你的问题是“要素之间的链条到底怎么串起来的、底层病因在哪里”ISM 更对口。当然这两类方法不冲突不少研究会先用 ISM 搭出结构骨架再用 DEMATEL 补权重和程度判断形成“ISM DEMATEL”的组合拳。这一步想清楚能帮你省掉后面不少返工。2. 建模前必须想清楚的三件事2.1 要素清单数量别贪多定义要互斥ISM 建模的第一步不是写矩阵而是建立要素清单。这一步看起来最基础但恰恰是翻车率最高的地方。我见过一个团队一开始列了 21 个要素结果关系判断阶段每个人对“这两个要素到底谁影响谁”都有不同看法最后全靠主持人生硬拍板才做下去。要素太多专家判断的负担会指数级上升要素太少模型又会失去分析价值。我做下来觉得 7 到 10 个要素是最舒服的规模最多不超过 15 个。要素清单的另一个要求是“同一个层次、互不嵌套”。以数字化转型因素为例“数字化人才储备”和“企业整体管理水平”就不适合放在同一个模型里因为后者明显包含前者和一大堆别的东西。如果一个要素已经能拆成两三个要素说明它应该被拆分或者提升维度。判断标准很简单两个要素放在一起能不能准确回答“A 对 B 有没有直接影响”如果答案永远是“看情况”那多半是定义写得不清。2.2 有向关系和邻接矩阵的口径必须先定死ISM 里用的是有向关系也就是“A 对 B 有影响”和“B 对 A 有影响”是完全不同的两回事。邻接矩阵 A 的构建规则我习惯这样约定行要素对列要素存在直接影响则矩阵中对应位置记 1否则记 0。例如 a_ij 1 表示要素 S_i 对要素 S_j 有直接影响。这个“行对列”的方向约定看似简单实操中犯错的概率却极高。我一开始就吃过亏明明设计的是“S1 高层支持对 S5 资金投入有影响”填矩阵的时候却写成了列对行。后面所有可达矩阵、层级划分全部基于错误的矩阵跑了一遍直到解读结果时发现“资金投入居然成了最底层根因”才意识到方向出了大问题。建议每次填完矩阵先抽两对有明确逻辑关系的要素手动验算再往下走。2.3 专家判断与一致性校验的实际做法ISM 的本质是抽取专家对系统结构的认知所以“专家怎么打分”直接影响模型质量。我在实践中发现最有效的判断方式不是让专家对每一对要素都做 0/1 判断而是先让每位专家写出“我认为最重要的前 5 个直接影响关系”再汇总成一张候选关系清单最后由群体讨论确定哪些关系可以进入邻接矩阵。这样比让专家面对 7×749 对组合逐一打勾要高效得多而且能避免敷衍式作答。打完判断之后还要做一轮简单的一致性校验仔细检查有没有“A 影响 B、B 影响 C、但 A 和 C 之间完全没有路径”的明显矛盾以及有没有背离基本常识的孤岛要素。如果某个要素既不影响别人也不被别人影响它在这个模型里基本没有意义得回到要素设定阶段重新考虑。3. 完整实操企业数字化转型关键因素的建模全过程3.1 情境与要素集的设定为了把流程讲透我构造一个非常典型的场景某制造企业想做数字化转型管理层希望弄清楚“这么多影响因素里面哪些是根源性的、哪些只是表层表现”。经过前期访谈和专家小组讨论我们把要素收敛成 7 个编号要素名称说明S1高层管理支持与投入高管对数字化战略的态度、资源和决策支持S2企业信息化基础水平已有IT系统、网络和数据底子S3数字化人才储备有经验的技术与数据人才数量和质量S4业务流程变革能力组织对流程再造的适应和推进能力S5资金与资源投入数字化转型的项目预算和资源保障S6数据治理与平台建设数据标准、中台、底层技术平台状态S7员工数字化素养与接受度一线员工的技能水平和使用意愿这 7 个要素就是我后面所有矩阵计算的主角建议你对照这个案例自己动手算一遍算法和手工计算都不难关键是体会每一步的意义。3.2 从邻接矩阵到可达矩阵的完整推演根据专家判断7 个要素之间的直接影响关系整理如下高层支持直接影响资金投入、流程变革能力和员工培训信息化基础影响流程变革和数据平台建设人才储备影响流程变革、平台建设以及员工素养流程变革直接影响员工接受度资金投入影响平台建设和员工素养平台建设影响员工素养。把上述关系写成 7 阶邻接矩阵 A行对列记为 1S1 S2 S3 S4 S5 S6 S7 S1 0 0 0 1 1 0 1 S2 0 0 0 1 0 1 0 S3 0 0 0 1 0 1 1 S4 0 0 0 0 0 0 1 S5 0 0 0 0 0 1 1 S6 0 0 0 0 0 0 1 S7 0 0 0 0 0 0 0这里 S1 对 S4、S5、S7 是 1意思就是高层支持会直接影响流程变革、资金和员工培训。这个方向必须和你的业务理解保持一致后面所有推导都基于它。接下来求可达矩阵 M。可达矩阵要同时包含“直接可达”和“间接可达”标准做法是先给 A 加上单位矩阵 I也就是承认每个要素自身可达自身再进行布尔矩阵的幂乘直到结果不再变化。为什么加单位矩阵因为只有保留了自反环布尔乘法的传递性才完整。例如 S1 通过 S5 可以间接到达 S6但 S1 直接指向 S5S5 直接指向 S6两步就得到了 S1 到 S6 的路径没有单位矩阵参与的话这个传递链算起来会很别扭。用布尔运算法则(AI)² 表示最多两步可达的关系(AI)³ 表示最多三步可达的关系。当 (AI)ᵏ 与 (AI)ᵏ⁻¹ 完全相等时说明所有间接路径已经全部被覆盖这个矩阵就是可达矩阵 M。我的计算结果如下S1 S2 S3 S4 S5 S6 S7 S1 1 0 0 1 1 1 1 S2 0 1 0 1 0 1 1 S3 0 0 1 1 0 1 1 S4 0 0 0 1 0 0 1 S5 0 0 0 0 1 1 1 S6 0 0 0 0 0 1 1 S7 0 0 0 0 0 0 1对比 A 会发现M 里新增了一些间接可达关系。最典型的就是 S1 到 S6高层支持推动了资金投入资金投入又支撑了数据平台建设所以即使高层没有直接去建平台在可达意义上它也对平台建设有影响。这才是 ISM 有意思的地方它帮你看清的是“间接传导”而不只是直接连线。3.3 可达集、先行集与交集的迭代分层有了可达矩阵 M就可以开始层级划分。对每个要素 S_i 定义三个集合可达集 R(S_i)从 S_i 出发能到达的所有要素集合也就是 M 中第 i 行里值为 1 的列对应的要素。先行集 A(S_i)能到达 S_i 的所有要素集合也就是 M 中第 i 列里值为 1 的行对应的要素。交集 C(S_i) R(S_i) ∩ A(S_i)。层级划分的关键判据是如果 C(S_i) R(S_i)说明 S_i 能到达的每个要素都能反过来找到路径回到它这个要素没有继续向下传导的能力属于当前层级的“最顶层”要素。把这个要素从模型中抽掉再对剩余要素重复上述判断就能逐层抽出全部层级。第一轮对所有 7 个要素计算要素可达集 R先行集 A交集 R∩A判定S1{S1,S4,S5,S6,S7}{S1}{S1}非顶层S2{S2,S4,S6,S7}{S2}{S2}非顶层S3{S3,S4,S6,S7}{S3}{S3}非顶层S4{S4,S7}{S1,S2,S3,S4}{S4}非顶层S5{S5,S6,S7}{S1,S5}{S5}非顶层S6{S6,S7}{S1,S2,S3,S5,S6}{S6}非顶层S7{S7}{S1,S2,S3,S4,S5,S6,S7}{S7}顶层可以看到 S7 的 R 和 C 都是 {S7}它的所有可达对象都保留在先行集里说明没有更下游的要素了所以 S7 是第一层。抽掉 S7 后对剩余 6 个要素做第二轮计算要素可达集 R先行集 A交集 R∩A判定S1{S1,S4,S5,S6}{S1}{S1}非顶层S2{S2,S4,S6}{S2}{S2}非顶层S3{S3,S4,S6}{S3}{S3}非顶层S4{S4}{S1,S2,S3,S4}{S4}顶层S5{S5,S6}{S1,S5}{S5}非顶层S6{S6}{S1,S2,S3,S5,S6}{S6}顶层S4 和 S6 的第二层判定为“顶层”意思是去掉全局顶层 S7 后它们就是新的最上层。继续抽掉 S4、S6第三轮对 S1、S2、S3、S5 计算S2、S3、S5 符合顶层条件。再抽掉这三个后S1 成为第四层也就是最底层。至此得到完整的层级结构层级要素定位第1层S7表层现象第2层S4、S6中间层第3层S2、S3、S5中下层第4层S1深层根因3.4 这个层级结构告诉了我们什么把这棵层次树画出来自上而下看从根到梢的逻辑会是高层管理支持S1决定了资金投入S5、信息化基础建设S2和人才储备S3这些资源和基础条件又共同推动了业务流程变革S4和数据平台建设S6流程和平台的改善最终落地为员工数字化素养与接受度S7的提升。这个模型给管理者的启发非常直接如果你只盯着员工积极性不高表层 S7去做培训和动员效果往往有限因为它的上游是流程和平台平台建设又依赖资金和人才而这一切的源头是高层支持。数字化转型如果一开始就没有一把手工程式的支持后面资金、人才、基础建设全都带不动。这不是鸡汤而是矩阵运算推出来的结论。当然ISM 的层次结构只是结构判断不是权重排序。底层要素在结构上确实更根本但“更根本”不等于“马上投入最多资源”。有时候表层要素提升快、见效快作为突破点也合理。ISM 的价值是告诉你系统内部的主干传导路径至于怎么干预还得结合成本、风险和时机来定。4. 实操中最容易踩的坑与排查经验4.1 邻接矩阵的方向不一致邻接矩阵最隐蔽的坑就是方向。很多人填矩阵时脑子想的是“S5 资金受 S1 高层支持影响”但写进去时随手把 1 填到了 S5 行 S1 列整个模型的因果关系就全颠倒了。我常用的自查技巧是每填完一行就停下来口头念一遍比如第三行有个 1 在第四列我就念“S3 人才储备对 S4 流程变革有直接影响”。如果念出来和业务理解对不上说明矩阵写错了或行列约定搞混了。另外要和团队成员统一“行对列”还是“列对行”的口径。这个没有统一标准网上不同教程也有可能用相反约定最关键的是你自己全程保持一致并在报告里明确写清楚。4.2 把两步可达直接当成了最终结果很多时候第一次算出 (AI)² 后矩阵看起来已经很完整了于是有人直接把它当作可达矩阵。这是我在审阅相关分析报告时经常看到的问题。判断是不是最终可达矩阵不是看矩阵长得像不像而是要做幂运算直到矩阵不再变化。像我们的案例里(AI)² 确实已经是终态但很多更复杂的系统需要三步、四步甚至更多才能稳定。如果在迭代中矩阵始终停不下来先检查邻接矩阵是不是有大量环路。强连通子图会让矩阵长距离传导变得更加复杂但只要是有限要素幂运算就一定会收敛布尔矩阵的每一步都只会让 1 变多不会让 1 变少所以迭代次数是有限且可预期的。4.3 遇到强连通回路时的处理方式ISM 有一个经常被忽略的分支情况几个要素互相影响形成闭环。例如 S1 影响 S2、S2 影响 S1而且没有其他要素能把它们分开这时它们在可达矩阵里就会表现出完全相同的行和列层级划分也无法将它们拆到不同层。这时候应该把它们作为一个“强连通子系统”处理在模型中合并成一个节点并注明子系统内部的互动关系。我在分析供应链风险传导时遇到过这种情况信息系统能力和数据协同能力互相强化形成闭环。直接把这两个要素当独立节点去分层结果所有层级划分表里它们永远同时出现。合并以后模型思路反而清晰了对外把它们看作一个整体对内再说明这是双向增强关系。4.4 把布尔运算做成了普通矩阵乘法另一个容易出错的地方是布尔运算。ISMATLAB 中如果直接用普通矩阵乘法中间过程的数值会变成大于 1 的整数而布尔运算只关心“有没有路径”不关心几条路径。正确做法是把每一步的结果都用逻辑或、逻辑与处理只有路径存在就是 1路径不存在就是 0。Python 里做这个计算有个小技巧先把邻接矩阵加单位矩阵后转换成布尔数组然后用 做矩阵乘再做一次 .astype(bool)这样每一步都自动变成布尔语义。后面的实操代码我会给出一个可以直接抄的版本避免手工计算时踩到数值溢出的问题。4.5 层级划分时把充分条件当必要条件层级划分的判据是 C(S_i) R(S_i)但我在初学时总把它理解成“交集不为空就是顶层”结果分出来的层级乱七八糟。C(S_i) 是可达集与先行集的交集不是单纯的“有没有共同要素”。一个要素如果既有可达对象又有先行要素交集也可能只是它自己但它不一定就在顶层关键是要看它能不能向下传导到别人。回到表格里看S4 在第二轮中 R{S4}、C{S4}条件成立是因为所有它能到达的要素只剩它自己而第一轮 S1 的 R{S1,S4,S5,S6,S7}C 只有 {S1}C≠R所以它不在顶层。只要 R 里有任何不被 C 包含的要素就说明 S_i 还能传导到别的要素不能进入当前顶层。4.6 把“底层根因”直接等同于“最需要优先干预”这是解读层面最常犯的错。ISM 分出底层根因说的是结构传导起点不是行动优先级的唯一依据。底层要素改变之后影响范围确实大但通常投入周期长、见效慢而且有些根因恰恰是最难干预的比如“高管认知”。反之表层要素虽然看似只是结果但在特定阶段作为试点切入反而能打开局面。我在项目汇报时总会加一句结构性的说明层次图是系统传导逻辑不是资源分配的最终结论。这样能防止决策者把一张结构模型当成算法推荐列表避免在实践中机械执行。5. 从手算到批量自动化一套可以直接用的 Python 实现5.1 用 Python 求可达矩阵手工计算 7 个要素还算轻松但要素一旦到 10 个以上建议直接用代码跑。下面的片段实现了从邻接矩阵到可达矩阵的完整布尔幂迭代。import numpy as np A np.array([ [0, 0, 0, 1, 1, 0, 1], [0, 0, 0, 1, 0, 1, 0], [0, 0, 0, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0] ], dtypeint) # 加上单位矩阵转成布尔类型 M (A np.eye(A.shape[0])).astype(bool) # 反复做布尔矩阵乘法直到矩阵不再变化 while True: new_M (M M).astype(bool) if np.array_equal(new_M, M): break M new_M print(M.astype(int))这段代码会输出我们在前面手算得到的可达矩阵。跑出来的结果如果和你手算不一致优先检查邻接矩阵里是否漏了 1 或多写了 1不要先怀疑代码。5.2 用 Python 自动划分层级有了可达矩阵层级划分也可以写成一个小函数。我还是用集合操作来保持最直接的语义对当前节点集合逐个算可达集、先行集和交集筛出满足条件 C R 的节点然后把这些节点从集合里去掉继续下一轮。def level_partition(M): n M.shape[0] nodes set(range(n)) levels [] while nodes: layer [] for i in nodes: R {j for j in nodes if M[i, j]} A {j for j in nodes if M[j, i]} if R A R: layer.append(i) levels.append(layer) # 从顶层到底层 nodes - set(layer) return levels levels level_partition(M) for idx, layer in enumerate(levels, 1): print(f第{idx}层: {[fS{i1} for i in layer]})运行结果就是我们在 3.3 节推导出的结果第一层是 S7第二层是 S4、S6第三层是 S2、S3、S5最后一层是 S1。这里要特别提醒代码返回的顺序是从最顶层开始往底层排你在报告里如果习惯从根因画起记得把 levels 反转一下再画。5.3 直接在代码里做一致性校验前面第二部分说到的方向一致性校验也可以用代码自动做一部分检查可达矩阵是否满足对称性、传递性和自反性。传递性其实就是代码里幂运算收敛的必然结果自反性由单位矩阵保证而对称性可以帮你快速判断模型里是否存在意外的强连通要素。def check_symmetry(M): diff M ^ M.T return not diff.any() print(矩阵是否对称:, check_symmetry(M))如果返回 True那说明所有行和列都一样系统基本是一个完全互通的整体ISM 分层会很困难。真遇到这种情况先回要素定义阶段看看是不是把耦合过深的要素强行拆开了。写在最后我对 ISM 的一点体会虽然说了这么多代码和矩阵但我个人最大的体会是ISM 更像是一种思考习惯而不是单纯的算法。每次我用它分析问题真正收获最大的环节都是“关系判断”本身强迫自己把模糊的认知写成明确的有向图把“感觉有关系”变成“谁对谁、往哪个方向、传导多远”。如果你后面要把它用在更复杂的系统分析里我的建议是先用本篇这套流程把一个 7 要素的小模型完整走一遍再考虑扩展到 10 个以上要素。运算量是次要的真正难的是保持关系判断的一致性和清晰度。工具只是帮你把判断变成结构判断质量永远决定模型质量。
返回列表