2016-08-15 33 views
0

似乎NMF R package (v0.22)尚不允許開箱即用的加權非負矩陣分解(WNMF),但歡迎使用自定義算法(p.25 here)。我正在嘗試,但不知道我是否在正確的軌道上。有沒有人已經爲nmf()實現了自定義算法?任何可以讓我開始使用WNMF的草圖示例? 考慮:NMF中的加權NMF自定義目標函數R

set.seed(0) 
X=runif(10) %*% t(runif(5)) 
X[missing <- X<.05] = 0 
W = 1*(!missing) 

WNMF忽略的X零值(通過的W零映射),並通過逐元素兩側由權重矩陣WW.X ~ W.BL相乘,通過最小化弗羅貝紐斯即近似於X(或一些其他)規範|W.X - W.BL|

UPDATE1: 創建目標函數,但無法弄清楚如何將W傳遞給它。我猜測method現在需要採用自定義算法,但在線示例很少。想法是受歡迎的。

WNMF_ObjFn = function(model, target, W, ...) { 
    sum(W*(target - fitted(model))^2, na.rm=T) 
} 

library(nmf) 
res = nmf(X, rank=2, objective=WNMF_ObjFn, W=W) 

Error in fun(y, x, ...) : 
    unused argument (W = c(1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)) 
Timing stopped at: 0 0 0 

回答

0

我忽略了一個簡單的解決方案。算法基本上是一個加權的NMF,已經由nmf R包實現。

nmf(X, rank=2, method="ls-nmf", weight=W) 

不過,我會珍惜任何人的解決方案,以較早創建自定義的目標函數,(我認爲)需要一個自定義的算法來與它一起去鍛鍊。