StandardDeviation-标准差赋权法
标准差赋权法(Standard Deviation Weighting)是一类典型的客观赋权方法,其核心思想是:某指标在样本中的离散程度越大,说明其区分不同对象的能力越强,因此应赋予更高权重。
StandardDeviation-标准差赋权法
1. 方法概述
标准差赋权法(Standard Deviation Weighting)是一类典型的客观赋权方法,其核心思想是:某指标在样本中的离散程度越大,说明其区分不同对象的能力越强,因此应赋予更高权重。
但就本项目 具体的算法3/多指标评价/StandardDeviation-标准差赋权法 的实际实现而言,该模块并不是“只计算一组客观权重”,而是一个完整的“赋权 + 综合评分 + 排名 + 导出”的一体化评价流程。结合 core/calculator.py、ui/main_window.py 与 ui/results_widget.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=\big(w_1,w_2,\ldots,w_n\big)^\top, \quad w_j\ge 0, \quad \sum_{j=1}^{n}w_j=1 \tag{2} $$
项目最终结果表中的核心列为:
对象得分排名
其中 得分越大表示对象越优,排名=1 表示最优对象。
2. 输入结构与项目流程
2.1 输入数据结构
上传页 ui/upload_widget.py 支持 .xlsx、.xls 与 .csv 文件,也支持直接加载示例数据。结合 utils/data_validator.py 与 core/calculator.py 的实际实现,当前项目对输入数据的要求可概括为:
- 第 1 列为对象名称列;
- 第 2 列及以后为指标列;
- 上传校验阶段要求至少包含 1 个指标列;
- 核心计算阶段要求最终选中的指标数不少于 2 个;
- 指标列必须全部能转为数值;
- 指标列不允许空值;
- 对象名称允许重复,但会给出告警;
- 常数列允许存在,但会给出告警,且其最终权重将为 0。
因此,进入 Calculator.run_analysis() 的标准数据结构可写为
$$ \mathcal{D}=\{A_i,\ x_{i1},x_{i2},\ldots,x_{in}\}_{i=1}^{m} \tag{3} $$
其中 \(A_i\) 表示第 \(i\) 个对象名称。
需要特别说明两点工程实现细节:
- 上传校验函数
validate_excel_data()只在上传页被调用,重复对象和常数列都只是“提示但不阻断”; utils/data_validator.py中虽然仍保留validate_method_settings(),但当前 StandardDeviation 主流程并未调用它,且其字段要求与本模块现行参数页并不一致,因此本文以ui/main_window.py -> core/calculator.py的真实调用链为准。
2.2 界面参数流程
主窗口 ui/main_window.py 的当前流程为:
- 上传数据;
- 进入指标设置页;
- 选择参与计算的指标并设置指标类型;
- 进入参数设置页,配置标准化方式、标准差口径与敏感性分析;
- 结果页自动启动计算并导出结果。
指标页 ui/indicators_widget.py 会收集以下参数:
selected_indicators:参与计算的指标集合;indicator_types:每个指标的类型;standard_values:适度指标的目标值。
参数页 ui/methods_widget.py 当前提供的关键参数为:
normalization:min-max或z-score;std_ddof:0或1;sensitivity:是否开启敏感性分析;sensitivity_delta:权重扰动比例 \(\Delta\)。
其中:
std_ddof=0表示总体标准差;std_ddof=1表示样本标准差。
结果页 ui/results_widget.py 通过后台线程 StatsWorker 调用 Calculator.run_analysis(),成功后展示权重表、得分表,并开放以下按钮:
- 打开结果目录;
- 打开结果文件;
- 导出复现代码;
- 重置并回到主页面。
3. 指标类型处理与标准化口径
3.1 指标类型
当前项目支持三类指标:
- 正向指标:值越大越优;
- 负向指标:值越小越优;
- 适度指标:值越接近目标值越优。
设经过方向处理但尚未进入最终标准化流程的中间矩阵记为
$$ U=(u_{ij})_{m\times n} \tag{4} $$
3.2 正向指标
若第 \(j\) 个指标为正向指标,则程序不做额外变换,直接令
$$ u_{ij}=x_{ij} \tag{5} $$
3.3 负向指标
若第 \(j\) 个指标为负向指标,core/calculator.py 的实现并不是直接写成常见的
\(\frac{\max-x}{\max-\min}\)
形式,而是先做一次线性镜像变换:
$$ 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} $$
并将结果裁剪到 \([0,1]\) 区间。这里 \(t_j\) 表示第 \(j\) 个适度指标的目标值。
当前项目的目标值来源分两层:
- 正常 UI 流程下,用户在指标页输入目标值;
- 若直接调用核心类且未提供该值,核心会回退为该列均值,并写入告警。
因此,项目中的目标值口径为
$$ t_j= \begin{cases} \text{用户提供值}, & \text{若已提供}\\ \dfrac{1}{m}\sum_{i=1}^{m}x_{ij}, & \text{若未提供} \end{cases} \tag{9} $$
若式(8)的分母为 0,说明该列所有值都与目标值重合,程序会直接令
$$ u_{ij}=1 \tag{10} $$
需要特别说明:ui/indicators_widget.py 在用户把某列切换为“适度指标”时,会尝试把该列均值自动填入输入框;而 core/calculator.py 也保留了“缺失时回退均值”的兜底逻辑。因此,适度指标的“默认取均值”是 UI 和核心双重存在的实现策略。
3.5 Z-score 阶段
若参数页选择 normalization="z-score",程序会先在矩阵 \(U\) 上做标准分数变换:
$$ z_{ij}=\frac{u_{ij}-\mu_j}{\sigma_j} \tag{11} $$
其中
$$ \mu_j=\frac{1}{m}\sum_{i=1}^{m}u_{ij} \tag{12} $$
$$ \sigma_j=\sqrt{\frac{1}{m}\sum_{i=1}^{m}(u_{ij}-\mu_j)^2} \tag{13} $$
这里必须强调一个和很多论文写法容易混淆的点:Z-score 阶段固定使用 ddof=0,这一口径不受参数 std_ddof 影响。
若 \(\sigma_j=0\),程序直接把该列置为 0,并追加告警,即
$$ z_{ij}=0 \tag{14} $$
3.6 Min-Max 阶段
无论用户起初选择的是 min-max 还是 z-score,程序最终都会执行一次 Max-Min 归一化。记进入该阶段的列值为 \(v_{ij}\),则
$$ n_{ij}=\frac{v_{ij}-v_j^{\min}}{v_j^{\max}-v_j^{\min}} \tag{15} $$
其中:
- 当
normalization="min-max"时,\(v_{ij}=u_{ij}\); - 当
normalization="z-score"时,\(v_{ij}=z_{ij}\)。
若某列在进入该阶段时满足 \(v_j^{\max}=v_j^{\min}\),程序会直接令
$$ n_{ij}=0 \tag{16} $$
并写入“常数列”告警。
最终实际用于后续权重计算与综合评分的标准化矩阵记为
$$ N=(n_{ij})_{m\times n} \tag{17} $$
这意味着:即便适度指标在式(8)中已经被压到 \([0,1]\),项目仍会继续对其执行式(15)这一统一标准化步骤,而不是在式(8)后直接停止。
4. 标准差权重计算
4.1 标准差定义
在得到标准化矩阵 \(N\) 后,程序对每个指标列计算标准差。设第 \(j\) 个指标的均值为
$$ \bar{n}_j=\frac{1}{m}\sum_{i=1}^{m}n_{ij} \tag{18} $$
则其标准差定义为
$$ s_j=\sqrt{\frac{1}{m-\text{ddof}}\sum_{i=1}^{m}(n_{ij}-\bar{n}_j)^2} \tag{19} $$
其中
$$ \text{ddof}\in\{0,1\} \tag{20} $$
并由参数页中的 std_ddof 决定。
因此:
std_ddof=0时,对应总体标准差;std_ddof=1时,对应样本标准差。
4.2 权重归一化
标准差赋权法在本项目中的权重定义为
$$ w_j=\frac{s_j}{\sum_{k=1}^{n}s_k} \tag{21} $$
若
$$ \sum_{k=1}^{n}s_k\le 0 \tag{22} $$
则程序直接报错“标准差为 0,无法计算权重”,不会继续生成结果。
这说明:当前实现不提供“全列无差异时自动回退等权”的兜底分支,而是明确认为此时不存在可区分的客观赋权基础。
5. 综合得分与排序
5.1 加权求和得分
当前 StandardDeviation 模块在得到权重后,直接采用加权求和得到对象综合得分。对第 \(i\) 个对象,其得分定义为
$$ S_i=\sum_{j=1}^{n}n_{ij}w_j \tag{23} $$
矩阵形式可写为
$$ S=Nw \tag{24} $$
这里 \(S=(S_1,S_2,\ldots,S_m)^\top\)。
5.2 排名规则
程序按得分降序排序,排名函数为
$$ R_i=\operatorname{rank}_{\downarrow}(S_i) \tag{25} $$
但实际代码采用的是 pandas.rank(ascending=False, method="min"),因此若有并列得分,则并列对象会取得相同的最小名次。例如两个对象并列第 2,则下一名次会跳到第 4。
此外,结果表会再按
排名升序;对象升序
进行二次排序。因此,若得分或名次相同,最终展示顺序还会受对象名称字符串顺序影响。
6. 敏感性分析
6.1 开启条件
当参数页勾选 开启敏感性分析 时,程序会对每一个指标分别构造“权重上调”和“权重下调”两个扰动场景。
设原始权重向量为 \(w\),扰动比例为 \(\Delta\),若对第 \(j\) 个指标做正向扰动,则先令
$$ \tilde{w}_j^{(+)}=w_j(1+\Delta) \tag{26} $$
其余权重先保持原值不变,再整体归一化为
$$ w_k^{(+)}=\frac{\tilde{w}_k^{(+)}}{\sum_{r=1}^{n}\tilde{w}_r^{(+)}} \tag{27} $$
若做负向扰动,则程序先令
$$ \tilde{w}_j^{(-)}=w_j\max(0,1-\Delta) \tag{28} $$
再做相同的归一化。
6.2 输出指标
对每个扰动场景,程序重新计算得分,并与基准得分比较。设扰动后第 \(i\) 个对象的新得分为 \(S_i^{(\pm,j)}\),则分值变化量为
$$ \Delta S_i^{(\pm,j)}=S_i^{(\pm,j)}-S_i \tag{29} $$
结果表中输出两项统计量:
$$ \operatorname{MaxChange}_j^{(\pm)}= \max_{1\le i\le m}\left|\Delta S_i^{(\pm,j)}\right| \tag{30} $$
$$ \operatorname{MeanChange}_j^{(\pm)}= \frac{1}{m}\sum_{i=1}^{m}\left|\Delta S_i^{(\pm,j)}\right| \tag{31} $$
Excel Sensitivity 工作表与结果字典中的 step_results["sensitivity"] 都基于上述统计结果生成。
若用户输入的 sensitivity_delta 不在 \((0,1)\) 内,核心会自动把它重置为 0.1 并记录告警。
7. 结果结构、导出内容与工程约束
7.1 结果字典结构
Calculator.get_results() 返回的统一结果字典包含以下主键:
raw_dataprocessed_datastep_resultsfinal_resultschartsparameters
其中:
raw_data存储原始数据预览、字段名、形状和source_file;processed_data存储对象列、指标集合、指标类型、标准值、标准化方式、std_ddof以及标准化矩阵预览;step_results存储标准差、权重、敏感性分析预览和告警列表;final_results存储最终权重、得分排名和权重统计量。
需要特别指出的是:processed_data["normalized"] 不是完整 DataFrame,而是包含
shapecolumnshead
的预览字典。这是当前版本为控制结果体量而采取的工程化结构。
7.2 权重统计量
当前项目除输出权重向量外,还会附带三类集中度统计。设 \(w=(w_1,\ldots,w_n)\),则:
赫芬达尔指数(HHI)为
$$ HHI=\sum_{j=1}^{n}w_j^2 \tag{32} $$
有效指标数为
$$ N_{\text{eff}}=\frac{1}{\sum_{j=1}^{n}w_j^2} \tag{33} $$
权重熵为
$$ H(w)=-\sum_{j=1}^{n}w_j\ln w_j \tag{34} $$
但在实际代码中,式(34)仅对 \(w_j>0\) 的项求和。
这些统计量被写入 final_results["weights_stats"],并导出到 Excel 的 Weights_Stats 工作表。
7.3 Excel 导出结构
core/calculator.py 当前会输出以下工作表:
ParametersRawDataNormalizedStdDeviationsWeightsScoresWeights_StatsSensitivityWarningsCharts
需要注意:这些工作表名称全部采用英文命名,而不是中文命名,这一点与部分其他算法模块不同。
其中 Weights 表除 指标 与 权重 外,还额外输出:
权重(%)累计权重
7.4 图表输出
当前版本可输出的图表包括:
weights.pngweights_pie.pngscores.pngscores_sorted.pngstd_values.pngsensitivity.png
其中 sensitivity.png 仅在开启敏感性分析时生成。
7.5 输出路径与复现脚本
若未传入 output_file,程序会在模块 results 目录下自动创建时间戳子目录,并生成
标准差赋权结果_时间戳.xlsx
若传入 output_file,程序也不会直接覆盖该路径,而是以目标文件名 stem 为基础再创建一个时间戳目录。
结果页 ui/results_widget.py 还支持导出复现脚本 repro_standard_deviation_template_时间戳.py。该脚本会:
- 自动尝试定位算法目录;
- 优先读取原始数据文件;
- 若原始数据路径缺失,则尝试从结果 Excel 的
RawData工作表回读数据; - 复用当前分析参数再次调用
Calculator.run_analysis()。
因此,当前模块已经形成“结果文件 + 图表 + 复现脚本”的完整复现实验输出链。
8. 与代码实现的对应关系
与很多教材或论文中的“纯标准差赋权”描述相比,本项目当前实现有以下几个必须单独说明的差异:
8.1 不是只输出权重,而是直接输出排序
很多标准差赋权法文献只把该方法作为“客观确定权重”的步骤,再与 TOPSIS、VIKOR 或其他评价模型结合使用。而本项目当前实现直接采用式(23)的加权求和作为最终评价模型,因此它在工程上是一个完整的综合评价模块,而不是单独的赋权子模块。
8.2 负向指标和适度指标先处理,再统一标准化
本项目并不是在权重公式里单独区分成本项和效益项,而是在 core/calculator.py 中先把负向指标线性翻转、把适度指标转成接近度,再对所有列统一执行 z-score 或 min-max。因此,最终标准差权重是建立在“已完成同向化”的矩阵 \(N\) 上,而不是原始矩阵 \(X\) 上。
8.3 std_ddof 只影响权重阶段,不影响 Z-score 阶段
这是当前实现中最容易被写错的一点:
- Z-score 阶段固定使用
ddof=0; std_ddof只作用于式(19)的标准差权重计算。
如果论文说明里把两者写成同一个自由参数,就与当前代码不一致。
8.4 上传页“提示但不阻断”,核心层再做兜底
重复对象名称、常数列在上传时不会直接中断,只会弹出提示。进入核心层后:
- 重复对象仍允许继续计算,但会在
warnings中写入提示; - 常数列在标准化后会变成 0 列,对应标准差为 0,最终权重为 0。
因此,当前实现属于“前端宽松校验 + 核心数值兜底”的风格,而不是严格前端阻断式校验。
9. 项目回归测试口径
当前模块已配套如下测试:
Z冒烟测试/test_standard_deviation_smoke.pyZ冒烟测试/test_standard_deviation_baseline.pyZ冒烟测试/test_standard_deviation_ui_flow.py
其中基线回归 test_standard_deviation_baseline.py 使用:
- 指标集合:
C1, C2, C3, C4 - 指标类型:
正向, 负向, 正向, 适度 - 适度指标目标值:
C4 = 58 - 标准化方式:
min-max - 标准差口径:
std_ddof = 0 - 敏感性分析:开启,
\Delta = 0.1
在这一代码基线下,期望权重向量为
$$ w= \big( 0.2542656898,\ 0.2685571889,\ 0.2389167877,\ 0.2382603336 \big)^\top \tag{35} $$
对应的对象排序为
$$ A3 \succ A5 \succ A4 \succ A1 \succ A2 \succ A6 \tag{36} $$
对应得分为
$$ \big( 0.6128494944,\ 0.6069681257,\ 0.5608183124,\ 0.4764491629,\ 0.3977570101,\ 0.3696460865 \big) \tag{37} $$
同时,测试还要求 processed_data["normalized"]["shape"]=(6,4),并验证:
- 权重和为 1;
- 敏感性分析结果非空;
- UI 流程可从上传页进入结果页并成功重置回首页。
因此,上述数值可以直接作为当前项目版本撰写论文说明、方法附录或复现实验描述时的代码口径依据。
10. 论文写作模板
10.1 方法描述模板
“本文采用标准差赋权法对评价对象进行综合评价。首先根据指标属性对原始决策矩阵进行同向化处理,其中负向指标按式(6)转换,适度指标按式(8)映射为目标接近度;随后依据研究设定采用 Min-Max 标准化或 Z-score 与 Min-Max 组合标准化,得到标准化矩阵 \(N\)(式(11)–式(17))。在此基础上,根据各指标标准差计算客观权重(式(18)–式(22)),并采用加权求和模型计算各对象综合得分 \(S_i\)(式(23)–式(24)),最终按得分降序形成排序结果(式(25))。”
10.2 结果解释模板
结果部分可写为:标准差赋权结果表明,指标离散程度越大,其客观权重越高,因此该方法能够突出区分度较强的指标。在综合结果解释中,应同时关注权重结果与对象得分结果:一方面,权重较大的指标往往是影响排序的主要驱动因素;另一方面,综合得分 \(S_i\) 越大表示对象整体表现越优。若敏感性分析结果中的最大变化量与平均变化量均较小,则说明当前排序对权重扰动具有较好的稳健性。
10.3 表格标题模板
- 表 1 指标类型、标准值与标准化方法设置表
- 表 2 标准差赋权结果表
- 表 3 各对象综合得分与排名结果表
- 表 4 权重集中度统计结果表
- 表 5 权重敏感性分析结果表
10.4 图表题注模板
- 图 1 标准差赋权指标权重条形图。
- 图 2 标准差赋权指标权重饼图。
- 图 3 各对象综合得分分布图。
- 图 4 各对象综合得分排序图。
- 图 5 指标标准差对比图。
- 图 6 权重敏感性分析图。
10.5 表格示例
表 1 标准差赋权综合评价结果
| 对象 | 综合得分 \(S_i\) | 排名 |
|---|---|---|
| A1 | ||
| A2 |
表注:综合得分 \(S_i\) 按式(23)计算,取值越大表示对象越优。
表 2 指标权重与统计量结果
| 指标 | 权重 | 权重(%) | 累计权重 |
|---|---|---|---|
| \(C_1\) | |||
| \(C_2\) |
表注:各指标权重由标准差归一化得到,见式(21);权重统计量可结合式(32)–式(34)分析权重集中程度。
11. 单篇终审补充
11.1 图题与表题对齐建议
Parameters表可写为:表X 标准差赋权参数设置表。RawData表可写为:表X 标准差赋权原始数据表。Normalized表可写为:表X 标准差赋权标准化矩阵表。StdDeviations表可写为:表X 指标标准差结果表。Weights表可写为:表X 标准差赋权权重表。Scores表可写为:表X 标准差赋权综合得分表。Weights_Stats表可写为:表X 权重统计量结果表。Sensitivity表可写为:表X 标准差赋权敏感性分析表。Charts表可写为:表X 标准差赋权图表索引表。weights.png建议写为:图X 标准差赋权权重条形图。weights_pie.png建议写为:图X 标准差赋权权重饼图。std_values.png建议写为:图X 指标标准差对比图。scores.png建议写为:图X 综合得分图。scores_sorted.png建议写为:图X 综合得分排序图。sensitivity.png建议写为:图X 权重敏感性分析图。
11.2 终审说明
- 当前代表性结果目录可采用
results/manual_check_20260321_01/std_manual_20260321_050829。其中主工作簿为std_manual_20260321_050829.xlsx,复现输出为标准差赋权复现结果_20260321_050830.xlsx。 - 当前真实工作表为
Parameters/RawData/Normalized/StdDeviations/Weights/Scores/Weights_Stats/Sensitivity/Charts。论文表题应按这组英文 sheet 名落地。 - 当前稳定实体图文件为
charts/weights.png、charts/weights_pie.png、charts/std_values.png、charts/scores.png、charts/scores_sorted.png、charts/sensitivity.png。若正文解释“标准差越大权重越高”,应直接对应StdDeviations工作表和std_values.png。 - 真实 repro 脚本为
repro_standard_deviation_template_20260321_050830.py。它默认优先通过SRC_FILE = 'uploads/standard_deviation_sample.xlsx'回读算法目录下的示例输入;若SRC_FILE为空,才会回退读取结果簿RawData。这属于“优先示例输入、次级结果簿回读”的复现口径。 - 当前脚本命名虽然带
template,但调用的是真实core.calculator。论文附录可以明确写它是可执行复现脚本,而不是文档模板。
11.3 全量强化补充
- 当前 StandardDeviation 文档应绑定真实算法目录
具体的算法3/多指标评价/StandardDeviation-标准差赋权法,代表性主目录为具体的算法3/多指标评价/StandardDeviation-标准差赋权法/results/manual_check_20260321_01/std_manual_20260321_050829。 - 该目录首层主工作簿为
std_manual_20260321_050829.xlsx,真实工作表为Parameters、RawData、Normalized、StdDeviations、Weights、Scores、Weights_Stats、Sensitivity、Charts。 - 主图位于
charts/子目录,真实文件为weights.png、weights_pie.png、std_values.png、scores.png、scores_sorted.png、sensitivity.png。 - 当前目录同时保留了一套完整再生产物目录
标准差赋权复现结果_20260321_050830/,其内部也有一份结构一致的 xlsx 和同名charts/图。这说明这里不是只放一轮主结果,而是“首层主结果 + 子目录复现结果”的两层证据。 - 复现脚本
repro_standard_deviation_template_20260321_050830.py的关键输入写法是SRC_FILE = 'uploads/standard_deviation_sample.xlsx',并且输出文件路径写为OUTPUT_FILE = RESULT_DIR / f'标准差赋权复现结果_{TS}.xlsx'。因此其复现链属于“回指算法uploads示例输入,再在结果目录生成新子目录产物”的结构。 - 正文与附录若讨论可复现性,应明确把
std_manual_20260321_050829.xlsx作为主结果,把标准差赋权复现结果_20260321_050830/标准差赋权复现结果_20260321_050830.xlsx作为复现再生产物,不要混写成同一份工作簿。
12. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/多指标评价/StandardDeviation-标准差赋权法/results/manual_check_20260321_01/std_manual_20260321_050829。 - 正文应围绕
Parameters、RawData、Normalized、StdDeviations、Weights、Scores、Weights_Stats、Sensitivity、Charts来写。 - 图证应对应
weights.png、weights_pie.png、std_values.png、scores.png、scores_sorted.png、sensitivity.png。 - 复现脚本应按
repro_standard_deviation_template_20260321_050830.py + uploads/standard_deviation_sample.xlsx的口径说明;标准差赋权复现结果_20260321_050830/只作为复现再生产物。