Um meine eigene Frage zu beantworten, habe ich ein kleines Paket in R für RBMs geschrieben: https://github.com/zachmayer/rbm
Dieses Paket befindet sich noch in der Entwicklung und ich weiß sehr wenig über RBMs, daher würde ich mich über Feedback (und Pull-Anfragen!) Freuen. Sie können das Paket mit devtools installieren :
devtools:::install_github('zachmayer/rbm')
library(rbm)
?rbm
?rbm_gpu
?stacked_rbm
Der Code ähnelt Andrew Landgrafs Implementierung in R und Edwin Chens Implementierung in Python , aber ich habe die Funktion so geschrieben, dass sie der pca-Funktion in Base R ähnelt und Funktionen zum Stapeln enthält. Ich denke, es ist ein bisschen benutzerfreundlicher als das Darch-Paket , dessen Verwendung ich nie herausfinden konnte (noch bevor es aus CRAN entfernt wurde).
Wenn Sie das Paket gputools installiert haben, können Sie Ihre GPU für Matrixoperationen mit der Funktion rbm_gpu verwenden. Das beschleunigt die Dinge sehr! Darüber hinaus wird der Großteil der Arbeit in einem RBM mit Matrixoperationen erledigt, sodass die Installation eines guten BLAS wie openBLAS ebenfalls die Dinge erheblich beschleunigt.
Folgendes passiert, wenn Sie den Code in Edwins Beispiel-Dataset ausführen:
set.seed(10)
print('Data from: https://github.com/echen/restricted-boltzmann-machines')
Alice <- c('Harry_Potter' = 1, Avatar = 1, 'LOTR3' = 1, Gladiator = 0, Titanic = 0, Glitter = 0) #Big SF/fantasy fan.
Bob <- c('Harry_Potter' = 1, Avatar = 0, 'LOTR3' = 1, Gladiator = 0, Titanic = 0, Glitter = 0) #SF/fantasy fan, but doesn't like Avatar.
Carol <- c('Harry_Potter' = 1, Avatar = 1, 'LOTR3' = 1, Gladiator = 0, Titanic = 0, Glitter = 0) #Big SF/fantasy fan.
David <- c('Harry_Potter' = 0, Avatar = 0, 'LOTR3' = 1, Gladiator = 1, Titanic = 1, Glitter = 0) #Big Oscar winners fan.
Eric <- c('Harry_Potter' = 0, Avatar = 0, 'LOTR3' = 1, Gladiator = 1, Titanic = 0, Glitter = 0) #Oscar winners fan, except for Titanic.
Fred <- c('Harry_Potter' = 0, Avatar = 0, 'LOTR3' = 1, Gladiator = 1, Titanic = 1, Glitter = 0) #Big Oscar winners fan.
dat <- rbind(Alice, Bob, Carol, David, Eric, Fred)
#Fit a PCA model and an RBM model
PCA <- prcomp(dat, retx=TRUE)
RBM <- rbm_gpu(dat, retx=TRUE, num_hidden=2)
#Examine the 2 models
round(PCA$rotation, 2) #PCA weights
round(RBM$rotation, 2) #RBM weights