Para responder a mi propia pregunta, escribí un pequeño paquete en R para RBM: https://github.com/zachmayer/rbm
Este paquete aún está en desarrollo, y sé muy poco acerca de los RBM, por lo que agradecería cualquier comentario (y solicitudes de extracción) que tenga. Puede instalar el paquete usando devtools :
devtools:::install_github('zachmayer/rbm')
library(rbm)
?rbm
?rbm_gpu
?stacked_rbm
El código es similar a la implementación de Andrew Landgraf en R y la implementación de Edwin Chen en python , pero escribí que la función es similar a la función pca en la base R e incluye funcionalidad para el apilamiento. Creo que es un poco más fácil de usar que el paquete Darch , que nunca pude descubrir cómo usar (incluso antes de que fuera eliminado de CRAN).
Si tiene instalado el paquete gputools , puede usar su GPU para operaciones matriciales con la función rbm_gpu. ¡Esto acelera mucho las cosas! Además, la mayor parte del trabajo en un RBM se realiza con operaciones matriciales, por lo que solo instalar un buen BLAS, como openBLAS , también acelerará mucho las cosas.
Esto es lo que sucede cuando ejecuta el código en el conjunto de datos de ejemplo de Edwin:
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