WPM-加权乘积法
WPM(Weighted Product Model)是一类通过“指标乘积”而非“指标求和”进行综合评价的方法。与加权和模型相比,WPM 对低值指标更敏感,某一关键指标过低时不容易被其他高分指标完全补偿。
WPM-加权乘积法
1. 方法概述
WPM(Weighted Product Model)是一类通过“指标乘积”而非“指标求和”进行综合评价的方法。与加权和模型相比,WPM 对低值指标更敏感,某一关键指标过低时不容易被其他高分指标完全补偿。
就本项目 具体的算法3/多指标评价/WPM-加权乘积法 的实际实现而言,当前有效核心位于 calculator.py,完整流程为:
- 读取对象列与指标列;
- 对负向指标和适度指标进行方向处理;
- 进行
min-max或z-score + min-max标准化; - 通过标准差赋权或自定义权重得到权重向量;
- 在对数域中计算加权乘积得分;
- 将原始乘积得分归一化为综合得分;
- 按综合得分降序排序;
- 可选执行权重敏感性分析;
- 导出 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.py 与 data_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 的标准流程为:
- 上传数据;
- 选择指标并设置指标类型;
- 在参数页设置标准化方式、权重方式、标准差口径与敏感性分析;
- 结果页异步执行 WPM 计算;
- 结果页展示权重表与得分表,并可导出复现脚本模板。
主要界面参数如下。
| UI 字段 | 代码字段 | 数学含义 | 当前实现说明 |
|---|---|---|---|
| 指标选择 | selected_indicators |
进入矩阵 \(X\) 的指标集合 | 至少 2 个 |
| 指标类型 | indicator_types |
正向/负向/适度 | 影响式(4)至式(8) |
| 适度标准值 | standard_values |
目标值 \(t_j\) | UI 中适度标准值禁止为 0 |
| 标准化方法 | normalization |
min-max 或 z-score |
z-score 实际为 z-score + min-max |
| 权重方法 | weight_method |
std 或 custom |
默认 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 张图:
weights.png:WPM 指标权重图;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 指标类型与标准值设置表
- 表 2 WPM 指标权重结果表
- 表 3 WPM 原始乘积得分与归一化综合得分结果表
- 表 4 WPM 综合排名结果表
- 表 5 权重敏感性分析结果表
9.4 图表题注模板
- 图 1 WPM 指标权重图。
- 图 2 WPM 综合得分图。
9.5 表格示例
表 1 WPM 综合评价结果
| 对象 | 原始乘积得分 \(P_i\) | 综合得分 \(S_i\) | 排名 |
|---|---|---|---|
| A | |||
| B |
表注:综合得分 \(S_i\) 为原始乘积得分 \(P_i\) 按式(26)归一化后的结果,取值越大表示对象越优。
10. 实现说明与注意事项
- 当前有效核心文件是 calculator.py。
- WPM 模块当前支持的权重方式只有
std和custom,并不支持熵权法。 - 适度指标标准值在核心中是强制字段,缺失时会直接报错;这一点与 VIKOR、WASPAS 的默认回退逻辑不同。
- 当前敏感性分析只输出得分变化幅度,不直接输出排序变化,因此若论文需要讨论名次稳定性,应基于导出的
Sensitivity表或复现脚本自行扩展。 - 结果页当前不提供“分层计算”路径,WPM 的稳健性补充分析主要依赖敏感性分析,而不是指标子集分层结果。
Scores工作表是最适合直接进入论文正文的主表;ProductScore、Normalized、Sensitivity更适合放在附录或方法补充材料中。
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.png与charts/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。主工作簿真实工作表为Parameters、RawData、Normalized、Weights、ProductScore、Scores、Charts。 - 实体图片位于
charts/子目录,真实文件为weights.png与scores.png。因此旧文这部分口径基本正确,不需要再写成平铺图片结构。 - 当前目录还包含复现脚本
repro_wpm_template_20260321_052408.py,但没有repro_inputs/目录。脚本关键输入写法确实是SRC_FILE = 'uploads/wpm_sample.xlsx',说明它回指算法目录下的uploads示例输入,而不是结果目录内的输入快照。 - 因此 WPM 的复现说明必须保持“结果目录内有主结果、复现结果和脚本,但输入文件来自算法目录
uploads/wpm_sample.xlsx”这一口径,不能误归类到标准repro_inputs组。 - 从论文写作映射上,
ProductScore与Scores应成组解释,因为 WPM 的方法特色就在于“原始乘积得分与归一化得分的区分”;只引用Scores会削弱方法差异说明。
12. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/多指标评价/WPM-加权乘积法/results/manual_check_20260321_01。 - 正文应围绕
Parameters、RawData、Normalized、Weights、ProductScore、Scores、Charts来写。 - 图证应对应
weights.png与scores.png,并把乘积得分和归一化得分的区别写清。 - 复现脚本应按
repro_wpm_template_20260321_052408.py + uploads/wpm_sample.xlsx的口径说明;repro_outputs/不是当前模块的标准复现入口。