简介这份资源面向多属性决策分析的学习者与科研人员提供在Matlab环境下实现CRITIC赋权法的完整代码用于解决指标权重客观确定与对象综合评分问题适合具备Matlab基础、需要处理评价类课题的初中级用户。压缩包共1个文件为单个m脚本体积约586B代码结构涵盖数据预处理、属性归一化、一致性指标、相关性指标、强度指标计算及权重求解与对象打分等环节并配有数据生成与属性分析子函数便于替换实际数据后直接运行。目前已有1658人学习下载说明该方法在评价建模场景中具有较高关注度。读者可据此理解CRITIC准则的完整计算流程掌握从决策矩阵到权重输出的实现思路并在此基础上扩展可视化或与其他赋权方法组合使用。1. CRITIC赋权法为什么“指标越独立权重反而越高”做综合评价时很多人第一反应是“哪个指标重要就给哪个指标大权重”于是拍脑袋定系数或者干脆平均分配。但真实数据里藏着一个反直觉的结论一个指标如果和其他指标高度相关它提供的新信息其实很少权重理应被压低反过来某个指标波动大、又和其他指标不搭界它才是真正能区分样本的那一个。CRITIC赋权法就是把这个直觉数学化的方法——它同时看两件事对比强度用标准差衡量和冲突性用相关系数衡量两者相乘再归一化得到客观权重。搞懂它你就明白为什么“相关性”在赋权里是个减分项也能避开“指标越多权重越平均”这类血泪经验式的翻车。Matlab 在这里的角色很直接矩阵运算、相关系数、归一化一条龙几行代码就能把整套机制跑通。2. 对比强度与冲突性CRITIC 到底在算什么CRITIC 的核心公式只有一行但每个符号背后都有明确的设计动机。先把结论摆出来第 j 个指标的权重正比于“它的标准差”乘以“1 减去它与其他指标相关系数之和的某种聚合”。标准差大说明这个指标能把样本拉开差距相关系数低说明它没被别的指标重复表达。两者缺一不可——只看标准差会偏爱噪声大的指标只看相关性会偏爱完全孤立的指标。2.1 从标准差出发对比强度为什么用标准差而不是极差对比强度衡量的是“同一指标下不同样本之间的差异有多大”。常见的实现思路是用标准差而不是极差。原因在于极差只由两个极端样本决定一个离群点就能把极差撑得很大权重被单个异常值绑架标准差用到了全部样本的离差平方和对整体分布更敏感也更稳定。Matlab 里std默认按 n-1 归一化做赋权时通常保持默认即可因为各指标样本数相同归一化方式不影响相对大小。这里有个容易忽略的点标准差是有量纲的。如果指标 A 是“万元”为单位、指标 B 是“百分比”直接比标准差没有意义。所以 CRITIC 的标准流程里标准差是在正向化并标准化之后的数据上算的。标准化把每个指标拉到同一尺度标准差才可比。这一步的顺序不能乱先正向化把成本型、区间型指标转成越大越好再标准化最后才算标准差和相关系数。2.2 冲突性的数学表达相关系数为什么是“减分项”冲突性描述的是“这个指标和其他指标的信息重叠程度”。如果指标 j 和指标 k 的相关系数接近 1说明它们几乎在讲同一件事指标 j 的独立信息量就少。CRITIC 用1 - r_jk来度量这种“不重叠”把所有 k 加起来得到指标 j 的总冲突性。用公式写出来指标 j 的信息量 C_j 为C_j σ_j * Σ_k (1 - r_jk)其中 σ_j 是标准化后指标 j 的标准差r_jk 是指标 j 与 k 的相关系数k 遍历所有指标包括 j 自身此时 r_jj 1贡献为 0不影响求和。权重就是 C_j 归一化w_j C_j / Σ_j C_j这个结构解释了一个常见困惑为什么两个标准差相同的指标权重可能差很多因为它们的相关性结构不同。某个指标如果和另外五个指标都高度相关它的冲突性求和会很小乘上标准差后信息量被大幅压缩另一个指标如果和大家都不相关冲突性接近指标个数权重自然高。这就是“独立即有价值”的数学落地。2.3 相关系数的选择Pearson 还是 SpearmanMatlab 里corrcoef算的是 Pearson 相关系数度量线性相关corr可以指定Type,Spearman算秩相关度量单调关系。CRITIC 原始定义用的是 Pearson因为它的推导基于线性信息重叠的假设。但如果你的指标里有明显非线性单调关系或者存在离群点Pearson 会被拉偏这时用 Spearman 更稳。我的建议是数据经过标准化、离群点已处理的情况下用 Pearson和公式定义保持一致如果指标分布偏态严重、样本量不大换成 Spearman 并对比权重变化如果排序稳定就说明结论稳健。这不是玄学是敏感性检查的一部分。3. Matlab 实现从原始矩阵到权重向量的完整链路把公式翻译成 Matlab 代码不难难的是每一步的边界条件。下面这段实现覆盖了正向化、标准化、信息量计算和归一化关键位置都加了注释。function w critic_weight(X, types) % X: m x n 原始数据矩阵m 个样本n 个指标 % types: 1 x n 向量1 表示效益型越大越好-1 表示成本型 % w: 1 x n 权重向量 [m, n] size(X); % 第一步正向化成本型指标取倒数或负向平移 Xn X; for j 1:n if types(j) -1 % 用 max - x 做正向化避免倒数在 0 附近爆炸 Xn(:, j) max(X(:, j)) - X(:, j); end end % 第二步极差标准化到 [0,1]消除量纲 Xs (Xn - min(Xn)) ./ (max(Xn) - min(Xn)); % 第三步对比强度按列求标准差 sigma std(Xs, 0, 1); % 0 表示按 n-1 归一化 % 第四步冲突性相关系数矩阵 R corrcoef(Xs); % 处理 NaN某指标方差为 0 时相关系数为 NaN置 0 避免污染 R(isnan(R)) 0; % 第五步信息量与权重 conflict sum(1 - R, 1); % 每个指标的总冲突性 C sigma .* conflict; % 信息量 w C / sum(C); % 归一化权重 end逐段说明。正向化那一步成本型指标我用max - x而不是1/x原因是倒数在原始值接近 0 时会产生极大值把标准化后的分布压扁权重被单个小值主导。max - x是线性变换不改变样本间的相对距离结构更稳。标准化用极差而不是 z-score是因为 CRITIC 后续要算标准差极差标准化后每个指标范围固定在 [0,1]标准差的可比性更直观z-score 也可以但要注意它会让标准差恒为 1如果按总体标准差算对比强度就失效了——这是个隐蔽的坑。std(Xs, 0, 1)的第二个参数 0 表示按 n-1 归一化第三个参数 1 表示沿列方向每个指标计算。corrcoef返回 n×n 对称矩阵对角线为 1。sum(1 - R, 1)沿列求和得到每个指标与所有指标含自身贡献 0的冲突性总和。最后sigma .* conflict是逐元素相乘再除以总和归一化。参数怎么改如果指标里有区间型落在某个区间最好正向化要单独写映射函数常见做法是1 - |x - 最优值| / 区间半宽超出区间截断到 0。如果样本量很小比如少于 10相关系数估计不稳定可以考虑用 Spearman 替代corrcoef或者对权重做 bootstrap 看波动范围。失败时看什么权重出现NaN八成是某个指标标准化后所有值相同方差为 0此时std为 0、相关系数为 NaN需要提前剔除或合并该指标权重出现极端值某个指标接近 1检查是不是该指标和所有其他指标都负相关冲突性求和超过指标数这是正常的数学结果但要回头确认负相关是否有实际意义别让符号问题误导结论。4. 避坑与排查CRITIC 落地时最容易翻车的几处4.1 现象权重和“主观重要性”完全相反原因CRITIC 是纯客观赋权它只认数据的统计结构不认业务语义。某个指标业务上很关键但如果它在样本里波动小、又和其他指标高度相关权重就会被压低。这不是 bug是方法的假设。解决把 CRITIC 权重和业务判断做对照如果差异大先检查样本是否具有代表性——波动小可能是因为样本选得太窄。必要时用组合赋权客观权重和主观权重加权平均但要在报告里说明理由别偷偷改数。4.2 现象相关系数矩阵出现大量负值冲突性求和异常大原因负相关意味着两个指标反向变动1 - r会大于 1冲突性被放大。如果指标方向没统一比如一个效益型、一个成本型却没正向化负相关是假象。解决先确认正向化是否覆盖了所有成本型指标正向化之后仍有负相关那是真实的反向关系可以保留但要意识到它会让相关指标的权重偏高必要时在文档里注明。4.3 现象标准化后标准差全是 1权重退化成平均原因用了 z-score 标准化且按总体标准差归一化每个指标标准差恒为 1对比强度项失去区分度权重只由冲突性决定看起来像“平均分配”的变体。解决改用极差标准化或者用 z-score 但保留原始标准差参与计算即标准化只用于算相关系数标准差用正向化后的原始尺度算。两种做法结果不同选哪种取决于你是否希望量纲影响权重。4.4 现象某个指标权重为 0 或接近 0原因该指标标准化后方差为 0所有样本同值或者它和其他指标完全共线。前者是数据问题后者是信息冗余。解决方差为 0 的指标直接剔除它不提供任何区分信息完全共线的指标保留一个即可保留哪个看业务解释力。别为了“指标齐全”硬留权重为 0 的指标放进综合评价只会增加噪声。4.5 现象换一批样本权重排序大变原因CRITIC 权重依赖样本的统计结构样本变了标准差和相关系数都变权重自然变。样本量小的时候尤其明显。解决做敏感性分析用 bootstrap 重采样多次算权重看排序是否稳定如果某两个指标权重经常互换说明它们的信息量接近排序差异不必过度解读。报告里给出权重区间比给单点值更诚实。5. 设计取舍客观赋权的边界与验证思路CRITIC 的价值在于它把“独立性”变成了可计算的权重来源但它也有明确的适用边界。它假设指标间的信息重叠可以用线性相关系数刻画假设样本能代表总体分布假设标准化方式不改变指标间的相对结构。这三个假设任何一个不成立权重都会偏。常见的实现思路是在 CRITIC 之外并行跑一遍熵权法或主成分分析对比权重排序如果三种方法给出的前几名一致结论就比较可信如果分歧大说明数据结构本身有争议该回去检查指标体系和样本而不是纠结用哪个公式。验证方法上我一般会做两件事。一是权重敏感性表把每个指标的标准差和冲突性拆开列出来看权重是被哪一项主导的如果某个指标权重高完全是因为冲突性大和其他指标都负相关就要警惕符号问题。二是留一法每次去掉一个指标重算权重看剩余指标的权重变化幅度变化大的说明指标间耦合强综合评价的稳定性存疑。检查项看什么异常信号正向化成本型指标是否全部转换相关系数出现大面积负值标准化标准差是否有区分度所有权重接近 1/n相关系数是否有 NaN 或极端值权重出现 NaN 或 0敏感性换样本权重排序是否稳定前几名频繁互换有个教训我印象很深早期做一套评价体系直接拿原始数据算 CRITIC结果一个量纲是“万元”、一个是“百分比”的指标前者权重被标准差撑到 0.6后者几乎为 0当时还以为是数据本身的问题排查了半天才发现是漏了标准化。从那以后我每次跑 CRITIC 都强制走一遍“正向化 → 标准化 → 查方差 → 算相关”的检查链任何一步有异常先停下来不急着看权重。这套流程写进函数里比事后拍脑袋靠谱。希望帮到你。本文还有配套的精品资源点击获取