正在加载中...

展开本页目录
算法教程WPM-加权乘积法

WPM-加权乘积法

No.101 · 在线教程

WPM(Weighted Product Model)是一类通过“指标乘积”而非“指标求和”进行综合评价的方法。与加权和模型相比,WPM 对低值指标更敏感,某一关键指标过低时不容易被其他高分指标完全补偿。

WPM-加权乘积法

1. 方法概述

WPM(Weighted Product Model)是一类通过“指标乘积”而非“指标求和”进行综合评价的方法。与加权和模型相比,WPM 对低值指标更敏感,某一关键指标过低时不容易被其他高分指标完全补偿。

就本项目 具体的算法3/多指标评价/WPM-加权乘积法 的实际实现而言,当前有效核心位于 calculator.py,完整流程为:

  1. 读取对象列与指标列;
  2. 对负向指标和适度指标进行方向处理;
  3. 进行 min-maxz-score + min-max 标准化;
  4. 通过标准差赋权或自定义权重得到权重向量;
  5. 在对数域中计算加权乘积得分;
  6. 将原始乘积得分归一化为综合得分;
  7. 按综合得分降序排序;
  8. 可选执行权重敏感性分析;
  9. 导出 Excel、图表,并可在结果页额外导出复现脚本模板。

设共有 \(m\) 个对象、\(n\) 个指标,原始决策矩阵记为

$$ X=(x_{ij})_{m\times n}, \quad i=1,2,\ldots,m, \quad j=1,2,\ldots,n \tag{1} $$

设最终权重向量为

$$ w=(w_1,w_2,\ldots,w_n)^\top, \quad w_j\ge 0, \quad \sum_{j=1}^{n}w_j=1 \tag{2} $$

项目最终结果表中的核心列为:

  • 对象
  • 综合得分
  • 排名

其中 综合得分 越大表示对象越优,排名=1 表示最优对象

1.1 符号说明

符号 含义
\(x_{ij}\) 第 \(i\) 个对象在第 \(j\) 个指标上的原始值
\(u_{ij}\) 指标方向处理后的中间值
\(r_{ij}\) 最终标准化矩阵中的元素
\(w_j\) 第 \(j\) 个指标的权重
\(P_i\) 第 \(i\) 个对象的原始乘积得分
\(S_i\) 第 \(i\) 个对象的归一化综合得分
\(\varepsilon\) 防止 \(\log 0\) 的极小正数
\(\Delta\) 敏感性分析中的权重扰动比例

2. 输入结构与界面流程

2.1 输入数据要求

结合 upload_widget.pydata_validator.py,当前标准 UI 路径要求:

  • 第 1 列为对象名称列;
  • 第 2 列及以后为指标列;
  • 指标列必须全部可转为数值;
  • 指标列不允许空值;
  • 对象名称不允许重复;
  • 常数列不允许存在。

进入核心 Calculator.run_analysis() 的数据结构可写为

$$ \mathcal{D}=\{A_i,\ x_{i1},x_{i2},\ldots,x_{in}\}_{i=1}^{m} \tag{3} $$

其中 \(A_i\) 表示第 \(i\) 个对象名称。

当前核心还要求:

  • 指标数量不少于 2;
  • 所选指标必须全部存在于数据表中;
  • 若存在适度指标,则必须提供其标准值。

2.2 界面参数与代码变量对应

当前主界面 main_window.py 的标准流程为:

  1. 上传数据;
  2. 选择指标并设置指标类型;
  3. 在参数页设置标准化方式、权重方式、标准差口径与敏感性分析;
  4. 结果页异步执行 WPM 计算;
  5. 结果页展示权重表与得分表,并可导出复现脚本模板。

主要界面参数如下。

UI 字段 代码字段 数学含义 当前实现说明
指标选择 selected_indicators 进入矩阵 \(X\) 的指标集合 至少 2 个
指标类型 indicator_types 正向/负向/适度 影响式(4)至式(8)
适度标准值 standard_values 目标值 \(t_j\) UI 中适度标准值禁止为 0
标准化方法 normalization min-maxz-score z-score 实际为 z-score + min-max
权重方法 weight_method stdcustom 默认 std
标准差口径 std_ddof \(0\) 或 \(1\) 仅标准差赋权时生效
敏感性分析 sensitivity 是否执行权重扰动分析 默认关闭
扰动比例 sensitivity_delta \(\Delta\) 默认 0.10

3. 指标处理与标准化

3.1 方向处理矩阵

设方向处理后的中间矩阵为

$$ U=(u_{ij})_{m\times n} \tag{4} $$

3.2 正向指标

若第 \(j\) 个指标为正向指标,则

$$ u_{ij}=x_{ij} \tag{5} $$

3.3 负向指标

若第 \(j\) 个指标为负向指标,项目先做线性镜像变换:

$$ u_{ij}=x_j^{\max}+x_j^{\min}-x_{ij} \tag{6} $$

其中

$$ x_j^{\max}=\max_{1\le i\le m}x_{ij}, \quad x_j^{\min}=\min_{1\le i\le m}x_{ij} \tag{7} $$

3.4 适度指标

若第 \(j\) 个指标为适度指标,项目先把“接近目标值越好”映射为接近度得分:

$$ u_{ij}=1-\frac{|x_{ij}-t_j|}{\max\left(|x_j^{\max}-t_j|,\ |x_j^{\min}-t_j|\right)} \tag{8} $$

若式(8)分母为 0,则代码直接令

$$ u_{ij}=1 \tag{9} $$

这里 \(t_j\) 必须由研究者提供。与 VIKOR、WASPAS 不同,当前 WPM 核心 不会 在缺失时回退到均值或中位数,而是直接报错。

3.5 Z-score 预处理

若选择 normalization="z-score",项目先对 \(U\) 执行标准分数变换:

$$ z_{ij}=\frac{u_{ij}-\mu_j}{\sigma_j} \tag{10} $$

其中

$$ \mu_j=\frac{1}{m}\sum_{i=1}^{m}u_{ij} \tag{11} $$

$$ \sigma_j=\sqrt{\frac{1}{m}\sum_{i=1}^{m}(u_{ij}-\mu_j)^2} \tag{12} $$

这里固定使用 std(ddof=0)。若 \(\sigma_j=0\),代码直接令该列

$$ z_{ij}=0 \tag{13} $$

3.6 Min-Max 标准化

无论用户最初选择的是 min-max 还是 z-score,项目最终都会执行一次线性归一化。记进入该阶段的列值为 \(v_{ij}\),则

$$ r_{ij}=\frac{v_{ij}-v_j^{\min}}{v_j^{\max}-v_j^{\min}} \tag{14} $$

其中:

  • normalization="min-max" 时,\(v_{ij}=u_{ij}\);
  • normalization="z-score" 时,\(v_{ij}=z_{ij}\)。

若某列满足 \(v_j^{\max}=v_j^{\min}\),代码直接令

$$ r_{ij}=0 \tag{15} $$

最终进入 WPM 计算的标准化矩阵为

$$ R=(r_{ij})_{m\times n}, \quad 0\le r_{ij}\le 1 \tag{16} $$

4. 权重确定

4.1 标准差赋权

weight_method="std" 时,项目在标准化矩阵 \(R\) 上计算各列标准差。设第 \(j\) 个指标列均值为

$$ \bar{r}_j=\frac{1}{m}\sum_{i=1}^{m}r_{ij} \tag{17} $$

则标准差为

$$ s_j=\sqrt{\frac{1}{m-\text{ddof}}\sum_{i=1}^{m}(r_{ij}-\bar{r}_j)^2} \tag{18} $$

其中

$$ \text{ddof}\in\{0,1\} \tag{19} $$

并由参数页中的 std_ddof 控制。

最终权重为

$$ w_j=\frac{s_j}{\sum_{k=1}^{n}s_k} \tag{20} $$

若 \(\sum_{k=1}^{n}s_k\le 0\),当前核心会直接报错“标准差为 0,无法计算权重”,而不是退化为等权重。

4.2 自定义权重

weight_method="custom" 时,项目要求研究者提供一组非负权重 \(\alpha_j\),并按

$$ w_j=\frac{\alpha_j}{\sum_{k=1}^{n}\alpha_k} \tag{21} $$

进行归一化。

当前核心对自定义权重有三项严格约束:

  • 权重数量必须与指标数量一致;
  • 任一权重不能为负;
  • 权重和必须大于 0。

5. WPM 核心模型

5.1 理论乘积形式

WPM 的理论形式为

$$ P_i=\prod_{j=1}^{n}r_{ij}^{\,w_j} \tag{22} $$

5.2 对数域稳定计算

项目实际没有直接裸乘式(22),而是采用对数域稳定计算。设

$$ \varepsilon=10^{-12} \tag{23} $$

则代码先计算

$$ \ln P_i=\sum_{j=1}^{n} w_j \ln(r_{ij}+\varepsilon) \tag{24} $$

再通过指数还原

$$ P_i=\exp(\ln P_i) \tag{25} $$

这一步是当前 WPM 模块最需要与教材“通用公式”区分的实现特征:项目是按“加权对数和”实现乘积得分,而不是直接逐项幂乘。

5.3 最终归一化得分

项目结果页展示的不是原始乘积 \(P_i\),而是按最大值归一化后的综合得分:

$$ S_i= \begin{cases} \dfrac{P_i}{\max_{1\le k\le m}P_k}, & \max_k P_k>0\\ 0, & \max_k P_k=0 \end{cases} \tag{26} $$

最终按 \(S_i\) 降序生成排名:

$$ \text{Rank}_i=\operatorname{rank}_{\downarrow}(S_i) \tag{27} $$

因此,论文中若引用软件输出结果,应明确说明“综合得分为原始乘积得分按最大值归一化后的结果”。

6. 敏感性分析

若参数页启用 sensitivity=True,项目会对每个指标依次做正向和负向扰动。对第 \(j\) 个指标,先构造扰动权重

$$ \tilde{w}_j^{(+)}=w_j(1+\Delta), \quad \tilde{w}_j^{(-)}=w_j\max(0,1-\Delta) \tag{28} $$

其余权重保持不变,然后重新归一化:

$$ \hat{w}_k=\frac{\tilde{w}_k}{\sum_{l=1}^{n}\tilde{w}_l} \tag{29} $$

项目并不直接输出“名次变化”,而是输出两类分数变化指标:

$$ \text{MaxChange}=\max_i |S_i^{(\text{new})}-S_i^{(\text{base})}| \tag{30} $$

$$ \text{MeanChange}=\frac{1}{m}\sum_{i=1}^{m}|S_i^{(\text{new})}-S_i^{(\text{base})}| \tag{31} $$

这意味着当前敏感性分析更偏向“得分稳定性”,而不是“排序稳定性”。

7. 输出结果与论文应用

7.1 Excel 工作表与文件结构

当前 run_analysis() 成功后导出的 Excel 工作簿包含以下工作表:

Sheet 名称 主要内容 论文中的建议用途
Parameters 参数字典展开表 参数表或附录参数清单
RawData 原始输入数据 数据附录
Normalized 标准化矩阵 附录计算明细
Weights 指标与权重 权重结果表
ProductScore 原始乘积得分 \(P_i\) 方法补充表
Scores 对象、综合得分、排名 正文核心结果表
Sensitivity 敏感性分析结果 稳健性分析表
Charts 图表名称与路径 图表索引

其中 Sensitivity 仅在开启敏感性分析时生成。

7.2 图表输出

项目默认输出 2 张图:

  1. weights.png:WPM 指标权重图;
  2. scores.png:WPM 综合得分图。

需要注意:WPM 模块当前没有像 WASPAS 那样输出多图对比,也没有像 VIKOR 那样输出折衷判据图。

7.3 结果目录与文件名

若未显式指定 output_file,项目会在结果目录下创建时间戳子目录

$$ \texttt{WPM-加权乘积法分析结果\_<YYYYMMDD\_HHMMSS>} \tag{32} $$

并在其中写出

$$ \texttt{WPM结果\_<YYYYMMDD\_HHMMSS>.xlsx} \tag{33} $$

7.4 复现脚本

与 VIKOR、WASPAS 不同,WPM 核心 run_analysis() 本身 不会 自动生成复现脚本。当前复现脚本导出路径来自结果页 results_widget.py 的“导出复现代码”按钮,导出文件名为:

$$ \texttt{repro\_wpm\_template\_<YYYYMMDD\_HHMMSS>.py} \tag{34} $$

脚本执行后通常会输出:

$$ \texttt{WPM复现结果\_<YYYYMMDD\_HHMMSS>.xlsx} \tag{35} $$

8. 基线回归样例

项目基线测试 test_wpm_baseline.py 使用了如下设定:

  • 指标集合:效益1成本1效益2适度1
  • 指标类型:正向、负向、正向、适度
  • 适度标准值:适度1 = 55.0
  • 自定义权重:\((0.4, 0.3, 0.2, 0.1)\)
  • 标准化方式:min-max
  • 敏感性分析:关闭

在该基线下,最终排序为

$$ A \succ C \succ B \succ D \tag{36} $$

对应综合得分为

$$ S=(1.0000,\ 0.8266,\ 0.3720,\ 1.0414\times 10^{-12}) \tag{37} $$

这一结果说明,当前实现中方案 \(A\) 的原始乘积得分最大,因此归一化后得分为 1;方案 \(D\) 在乘积结构下被显著压低。

9. 论文写作模板

9.1 方法描述模板

“本文采用加权乘积法(WPM)对备选对象进行综合评价。首先对原始决策矩阵进行指标方向处理,其中负向指标按式(6)镜像转换,适度指标按式(8)映射为目标接近度;随后依据研究设定采用 Min-Max 标准化或 Z-score 与 Min-Max 组合标准化,得到标准化矩阵 \(R\)(式(10)–式(16))。在权重方面,本文采用标准差赋权/自定义权重确定权重向量(式(17)–式(21))。进一步地,模型在对数域中计算加权乘积得分 \(P_i\)(式(24)–式(25)),并将其按最大值归一化为综合得分 \(S_i\)(式(26)),最终依据 \(S_i\) 降序进行排序(式(27))。”

9.2 结果解释模板

结果部分可写为:WPM 结果表显示,综合得分越大表示对象整体表现越优。与加权和模型不同,WPM 采用乘积结构,因此对低值指标更敏感。当某一对象在某个高权重指标上得分较低时,其最终乘积得分会被显著拉低。为了提高数值稳定性,本文所采用的软件实现并非直接计算乘积,而是先在对数域内求加权和,再通过指数变换恢复原始乘积得分,最后按最大值得到归一化综合得分。

9.3 表格标题模板

  1. 表 1 指标类型与标准值设置表
  2. 表 2 WPM 指标权重结果表
  3. 表 3 WPM 原始乘积得分与归一化综合得分结果表
  4. 表 4 WPM 综合排名结果表
  5. 表 5 权重敏感性分析结果表

9.4 图表题注模板

  1. 图 1 WPM 指标权重图。
  2. 图 2 WPM 综合得分图。

9.5 表格示例

表 1 WPM 综合评价结果

对象 原始乘积得分 \(P_i\) 综合得分 \(S_i\) 排名
A
B

表注:综合得分 \(S_i\) 为原始乘积得分 \(P_i\) 按式(26)归一化后的结果,取值越大表示对象越优。

10. 实现说明与注意事项

  1. 当前有效核心文件是 calculator.py
  2. WPM 模块当前支持的权重方式只有 stdcustom,并不支持熵权法。
  3. 适度指标标准值在核心中是强制字段,缺失时会直接报错;这一点与 VIKOR、WASPAS 的默认回退逻辑不同。
  4. 当前敏感性分析只输出得分变化幅度,不直接输出排序变化,因此若论文需要讨论名次稳定性,应基于导出的 Sensitivity 表或复现脚本自行扩展。
  5. 结果页当前不提供“分层计算”路径,WPM 的稳健性补充分析主要依赖敏感性分析,而不是指标子集分层结果。
  6. Scores 工作表是最适合直接进入论文正文的主表;ProductScoreNormalizedSensitivity 更适合放在附录或方法补充材料中。

11. 单篇终审补充

11.1 图题与表题对齐建议

  • Parameters 表可写为:表X WPM 参数设置表。
  • RawData 表可写为:表X WPM 原始数据表。
  • Normalized 表可写为:表X WPM 标准化矩阵表。
  • Weights 表可写为:表X WPM 指标权重表。
  • ProductScore 表可写为:表X WPM 原始乘积得分表。
  • Scores 表可写为:表X WPM 综合得分与排名表。
  • Charts 表可写为:表X WPM 图表索引表。
  • weights.png 建议写为:图X WPM 指标权重图。
  • scores.png 建议写为:图X WPM 综合得分图。

11.2 终审说明

  • 当前代表性结果目录可采用 results/manual_check_20260321_01。其中主工作簿为 WPM_manual.xlsx,复现输出为 WPM复现结果_20260321_052408.xlsx
  • 当前真实工作表为 Parameters/RawData/Normalized/Weights/ProductScore/Scores/Charts。论文表题应按这组英文 sheet 名落地。
  • 当前稳定实体图文件为 charts/weights.pngcharts/scores.png。若正文解释乘积结构对低值指标的惩罚,应配合 ProductScore 工作表,而不是只引用归一化后的 Scores
  • 真实 repro 脚本为 repro_wpm_template_20260321_052408.py。它默认通过 SRC_FILE = 'uploads/wpm_sample.xlsx' 从算法目录示例输入读取数据,而不是读取结果包内 repro_inputs
  • 当前脚本名虽然带 template,但它调用的是真实 core.calculator。论文附录可把它写成可执行复现脚本,同时说明其输入依赖算法目录下 uploads/wpm_sample.xlsx

11.3 全量强化补充

  • 当前 WPM 文档应绑定真实算法目录 具体的算法3/多指标评价/WPM-加权乘积法,代表性目录为 具体的算法3/多指标评价/WPM-加权乘积法/results/manual_check_20260321_01
  • 该目录内当前保留两份工作簿:主结果 WPM_manual.xlsx 与复现结果 WPM复现结果_20260321_052408.xlsx。主工作簿真实工作表为 ParametersRawDataNormalizedWeightsProductScoreScoresCharts
  • 实体图片位于 charts/ 子目录,真实文件为 weights.pngscores.png。因此旧文这部分口径基本正确,不需要再写成平铺图片结构。
  • 当前目录还包含复现脚本 repro_wpm_template_20260321_052408.py,但没有 repro_inputs/ 目录。脚本关键输入写法确实是 SRC_FILE = 'uploads/wpm_sample.xlsx',说明它回指算法目录下的 uploads 示例输入,而不是结果目录内的输入快照。
  • 因此 WPM 的复现说明必须保持“结果目录内有主结果、复现结果和脚本,但输入文件来自算法目录 uploads/wpm_sample.xlsx”这一口径,不能误归类到标准 repro_inputs 组。
  • 从论文写作映射上,ProductScoreScores 应成组解释,因为 WPM 的方法特色就在于“原始乘积得分与归一化得分的区分”;只引用 Scores 会削弱方法差异说明。

12. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/多指标评价/WPM-加权乘积法/results/manual_check_20260321_01
  • 正文应围绕 ParametersRawDataNormalizedWeightsProductScoreScoresCharts 来写。
  • 图证应对应 weights.pngscores.png,并把乘积得分和归一化得分的区别写清。
  • 复现脚本应按 repro_wpm_template_20260321_052408.py + uploads/wpm_sample.xlsx 的口径说明;repro_outputs/ 不是当前模块的标准复现入口。