Python 版的 CO-CNMF 實作
- Python 3.8(使用 Anaconda)
- PIL
- numpy
- scipy
python demo.py
備註:
如果要看 HyperCSI 初始化結果,要把 COCNMF.py 的 ConvOptiCNMF 函數中
Z_fused = Z_fused.T.A.reshape(r * rows_h, r * cols_h, M, order='F')
的 .A
刪除,如下
Z_fused = Z_fused.T.reshape(r * rows_h, r * cols_h, M, order='F')
還有中間不相干的程式碼也要註解掉。
如果要指定迭代次數,要把 COCNMF.py 的 ConvOptiCNMF 函數中,以下三行如此修改:
Max_iter = 30 # maximum iteration of Algorithm 1
iterS = 5 # maximum iteration of Algorithm 2
iterA = 5 # maximum iteration of Algorithm 3
如果要使用收斂條件,要把 COCNMF.py 的 ConvOptiCNMF 函數中,以下三行如此修改:
Max_iter = None # maximum iteration of Algorithm 1
iterS = None # maximum iteration of Algorithm 2
iterA = None # maximum iteration of Algorithm 3
- 凸優化問題可以保證局部最佳解必定是全域最佳解
- 但是要找到局部最佳解也是有一段路要走
- 一般可以使用次梯度法等等方法來解
- 如果問題是兩個凸函數相加的形式可以用 ADMM 解
- 如果是符合 KKT conditions,可以把問題轉化為解方程式
- 使用對偶問題、拉格朗日乘子法的技巧
- 簡介拉格朗日乘子法
- 在適當巧妙的函數設計下可以求出 closed-form(解析解 / 公式解)
- 等於是直接瞬移到凸優化問題的終點
- Lp Regularization
- 目標函數的 domain 被限制在 p-norm 球當中
- 在 Regularization 的討論中,拉格朗日乘子的身份是權重,可自訂
- 拉格朗日乘子越小,球越大
- 拉格朗日乘子訂得越小表示採納越多原函數的 domain
- 對於原本最佳解不落在 p-norm 球當中
- Craig's HU criterion
- S �要越稀疏越好
- 一個東西通常是由不多的純物質混合而成
- 使用 L0 Regularization 減少非零個數或 L1 Regularization 增加稀疏程度
- Surrogate Loss Function(代理損失函數)
- 可以有相近作用的 loss function,像是有差不多的上界等
- 因為原 loss function 難以計算
- CO-CNMF 用 1-norm 代理 S 的 0-norm, SSD regularizer 代理 A 的 simplex volume
- A 為何可以用 SSD(sum-of-squared distances)來代理 A 的 simplex volume?
- HW3:
AXB = C <=> kron(BT, A)vec(X) = vec(C)
證明
- 假設像素光譜是由混合物光譜組成,可以拆解成純物質的比例(線性組合)
- 使用 SSD(ridge regression)來規範 A 的純物質分離度
- 使用 LASSO 來規範 S 的稀疏度,也能更增加純物質分離度
- CO-CNMF 的主問題
- 非凸優化問題,但是如果固定 S 或 A 就可以轉化為凸優化問題
- 使用了
AXB = C <=> kron(BT, A)vec(X) = vec(C)
的方法將目標函數轉成兩個凸函數相加(對 S 與對 A 都有不同形式,看你是要更新誰) - 交替解同一個但不同形式的凸優化的問題
- 對 S 與對 A 的凸優化的問題可以用 ADMM 解
- 因為有了適當巧妙的函數選擇,所以 ADMM 中的子凸優化問題均可配合 KKT conditions 求出 closed-form
- 有 closed-form 不見得會計算很快,所以分別又再假設了一些條件減少時間複雜度
- S:每個 r^2 區域使用相同的 vectorized convolution kernel g
- A:假設 N ≤ M * Mm
- 這應該是 CO-CNMF 最有價值的地方
- 使用 HyperCSI 對 A 進行初始化
- 遇到的問題
- 看不懂開源的程式碼的一些符號或函數,所以去查了好幾篇論文還有教科書
- Python 程式碼的語意和 MATLAB 不一樣,雖然函數名字可能相同
- 例如特徵值和特徵向量
- reshape 的方向優先度
- MATLAB index 是從 1 算起,Python 是從 0 算起
- Sparse Matrix 的使用
- 常常有一些不知道為何的錯誤,藉由觀察兩邊的資料來 Debug
- 心得
- A 收斂的速度比 S 快很多(幾百倍有)
- 使用收斂條件時 S 第一次要迭代 10000 多次,最後一次 400 多次
- 使用收斂條件時 A 第一次要迭代 70 幾次,最後一次 20 幾次
- 加上論文的終止條件
- 原始資料
- 結果