nmf-forge · 手写非负矩阵分解

NMF / Non-negative Matrix Factorization — Lee & Seung, Nature 1999
乘法更新(Frobenius / KL 双散度)· ALS 交替非负最小二乘 · 零依赖单文件 · 无头不变量自检

控制台 合成「光谱混合」数据:X = W₀H₀,行=特征,列=样本

就绪。

指标

收敛 目标函数逐次迭代值;乘法更新保证单调不增(辅助函数 / majorize-minimize)

W 基向量 m×K,每个分量的「光谱」形状

纵轴为分量索引,横轴为特征维度。NMF 的「parts-based」表示:每个基向量通常只在局部有质量。

H 系数矩阵 K×n,每个样本的成分占比

低高白 = 0
H 的稀疏性正是 NMF 相对 PCA/SVD 的核心差异:SVD 的分量有正有负、难以解释为「纯加性组成」。

原矩阵 X 与重构 X̂ = WH 上:X(含噪声)· 下:X̂(秩 K 非负重构)

实时不变量自检 与无头 _smoke.js 同源,全部为数学性质(与数据难度无关)

核心递推 乘法更新 = 对步长做「自适应对角缩放」的梯度下降

目标(Frobenius)F(W,H) = ‖X − WH‖²_F    s.t. W ≥ 0, H ≥ 0
H 更新H ← H ∘ (WᵀX) ⊘ (WᵀWH)
W 更新W ← W ∘ (XHᵀ) ⊘ (WHHᵀ)
目标(KL)D(X‖WH) = Σ X∘log(X⊘WH) − X + WH
H 更新(KL)H ← H ∘ (Wᵀ(X⊘WH)) ⊘ (Wᵀ1)
W 更新(KL)W ← W ∘ ((X⊘WH)Hᵀ) ⊘ (1Hᵀ)
KKT(非负约束)W ≥ 0, ∇_W F ≥ 0, W ∘ ∇_W F = 0(互补松弛)
为什么单调? Lee-Seung 的更新来自 majorize-minimize:F 的辅助函数 G(W,Wᵗ) ≥ F(W) 且 G(Wᵗ,Wᵗ)=F(Wᵗ), 对其最小化得闭式解即上式,于是 F 严格不增。因此「目标函数单调不增」是被证明的性质,可直接当断言用。

为什么乘法更新保值零元? 更新形如 W ← W∘(…),W_ik=0 则永远为 0 —— 这既是优点(保持结构 / 稀疏),也是陷阱(若某行基向量被初始化成全零,该分量永久死亡,故初始化必须保证严格正)。