| 对比维度 | 自定义手写 PMF 代码 | 调用 nimfa 库 PMF 代码 |
| 算法核心实现 | 基于 numpy 手写加权最小二乘迭代分解,自行实现矩阵 G、F 乘法更新规则 | 直接调用nimfa.Pmf封装接口,底层为通用非负矩阵分解,不自定义迭代规则 |
| 不确定度计算 | 内置calculate_uncertainty:计算 MDL 检出限、逐样本不确定度矩阵 | 无不确定度、检出限整套计算流程,直接原始数据输入分解 |
| 物种 SN 分类 | 内置categorize_species:计算 S/N 比值,划分 Strong/Weak/Bad 物种等级 | 无信噪比计算、物种分级逻辑 |
| 迭代寻优机制 | 多轮随机初始化n_runs,遍历多次运行,按 Q_robust 筛选全局最优解 | |
| 收敛判定逻辑 | 自定义迭代收敛阈值,监测 Q 值相对变化,满足条件提前终止迭代 | 依赖 nimfa 内部默认迭代停止规则,外部无收敛控制代码 |
| 输出 Q 真值、Q_robust、Q 期望、Q/Q 期望全套专业诊断量 | 计算残差平方和比例、因子间平均相关系数,无标准 PMF 诊断指标 |
| 自动识别含 PM2.5/PM25 字段,识别失败自动用最后一列,适配性强 | 硬编码固定列名PM2.5 |
| 数据预处理 | 做非负约束、零值兜底、不确定度放大、异常值容错保护 | 仅做最大最小归一化,无额外数据质控、无零值和异常保护 |
| 调用同套 OLS 函数,因子贡献为自变量、PM2.5 为因变量,全套评价指标 | 和上段回归逻辑、评价指标完全一致,仅输入的因子矩阵来源不同 |
| 逐年可视化 | 绘制逐年因子占比堆积柱状图 | 绘制逐年因子占比饼图,替换了柱状图 |
| 时间序列绘图 | 包含:日变化曲线、月度堆叠图、逐日因子 + PM2.5 双轴图 | 保留日变化、月度堆叠图,删除逐日双轴关联图 |
| 配图文件适配 | 可兼容name.xlsx,无文件则用默认因子名 | 部分图读取name1.xlsx,负载图主动去掉图例展示 |
| 结果 Excel 输出 | 因子谱、因子贡献、重建、残差 + 新增诊断指标 Sheet + 逐年逐月占比表 | 因子谱、因子贡献、重建、残差 + 逐年逐月占比表,无诊断指标 Sheet |
| 异常容错处理 | 迭代运行加 try 捕获,单轮报错不终止整体流程;数值做极小值防除零 | 无异常捕获、无防除零兜底代码,格式 / 数据异常直接中断运行 |
| 第三方库依赖 | 仅 pandas/numpy/matplotlib 等常规库,无专用 PMF 依赖 | 强依赖nimfa库,环境需额外安装,无法脱离该库运行 |
| 可调参数 | 因子数、运行轮次、随机种子、不确定度系数均可外部传参配置 | 模型参数写死在函数内部,外部无自定义配置入口 |
| 归一化位置 | 分解后对因子谱、因子贡献做 min-max 归一化 | 同样在分解后做 min-max 归一化,归一化逻辑一致 |