2016-08-03 13 views
1

Mit dem IntNMF Paket möchte ich Cluster in einem Dataset finden. Meine Daten sind eine dünn besetzte Matrix (80-90% Nullen) mit Fächern in den Zeilen und Features in den Spalten. Aus irgendeinem Grund bekomme ich einen Fehler, und ich kann nicht herausfinden, warum oder was ich dagegen tun soll.Clustering mit nicht-negative Matrix-Faktorisierung (IntNMF): Was tun mit "eine Dimension ist Null" Fehler

library(IntNMF) 

set.seed(4) 
n <- 10 
p <- 30 
m <- matrix(sample(0:3, rep=T, size = n*p, 
        prob = c(5,1,1,1)), ncol=p) 
any(rowSums(m) == 0) # no zero rows 
any(colSums(m) == 0) # no zero columns 
rankMatrix(m) == n # full row rank 

# finding the optimal number of clusters 
opt.k <- nmf.opt.k(dat=m, n.runs=5, n.fold=2, k.range=2:4, 
        result=TRUE, make.plot=TRUE, 
        progress=TRUE) 

Der Fehler, den ich bekommen ist:

error in svd(X) : a dimension is zero 

ich davon aus, dass sparsity kein Problem, vielleicht ist es. Ich bin mit NMF oder dem IntNMF Paket noch nicht sehr vertraut, also werden irgendwelche Hinweise geschätzt.

Antwort

1

Nicht sicher, was das Problem mit IntNMF ist, aber es schlägt auch für andere Seeds fehl, sowie bei Verwendung der Standardargumente für nmf.opt.k.

Ich würde stattdessen empfehlen, in der Zwischenzeit die NMF Bibliothek auschecken.

Getestet habe ich es mit dem Testmatrix aus und es funktionierte gut:

> nmf(m, rank=2) 
<Object of class: NMFfit> 
# Model: 
    <Object of class:NMFstd> 
    features: 10 
    basis/rank: 2 
    samples: 30 
# Details: 
    algorithm: brunet 
    seed: random 
    RNG: 403L, 20L, ..., 961813654L [05ac8381a0361b9c9d54208dfe6a12cb] 
    distance metric: 'KL' 
    residuals: 162.3778 
    Iterations: 480 
    Timing: 
    user system elapsed 
    0.047 0.000 0.046 

Es gibt auch einen Abschnitt von den Rang der Faktorisierung Schätzen (Auswahl eines k) in der Vignette für NMF (Abschnitt 2.6).

+0

Mit der NMF-Bibliothek erhalten wir einen NMF der Daten ohne einen Fehler. Allerdings hilft mir das nicht weiter, da ich Clustering und Vergleiche (BIC etc.) für unterschiedliche Clusterzahlen nicht bekomme. Irgendwelche Ideen? –

+0

Auch wenn ich jede Person z. B. hart gruppieren könnte, indem ich das Maximum in jeder Spalte der Gewichtungsmatrix "W" verwende, gehe ich davon aus, dass ich den in IntNMF implementierten modellbasierten Clusteransatz verlieren werde. Vielleicht gibt es bessere Möglichkeiten, die mir nicht bewusst sind? :) –

+1

Ja, um ein einzelnes Clustering von Spalten zu erhalten, kannst du 'nmf_clusters <- apply (coef (result), 2, which.max)' where 'result' ist die Ausgabe von einem einzelnen Aufruf von' nmf() ' - Wenn Sie die Zeilen von 'V' gruppieren, würden Sie in der Tat stattdessen mit' W' arbeiten. 'NMF' hat einige Funktionen, die helfen, einen Wert von' k' zu zeichnen und auszuwählen, aber nichts sehr ausgeklügelt, soweit ich weiß. Es gibt eine Übersichtsarbeit von [Devarajan] (http://journals.plos.org/ploscubbiol/article?id=10.1371/journal.pcbi.1000029), die einige Diskussionen über Ansätze zur Modellauswahl/Robustheitsanalyse enthält, die hilfreich sein könnten . –