Para responder à minha própria pergunta, escrevi um pequeno pacote no R para RBMs: https://github.com/zachmayer/rbm
Este pacote ainda está em desenvolvimento pesado, e eu sei muito pouco sobre RBMs, então gostaria de receber qualquer feedback (e solicitações de recebimento!) Que você tiver. Você pode instalar o pacote usando o devtools :
devtools:::install_github('zachmayer/rbm')
library(rbm)
?rbm
?rbm_gpu
?stacked_rbm
O código é semelhante à implementação de Andrew Landgraf na implementação de R e Edwin Chen em python , mas eu escrevi a função para ser semelhante à função pca na base R e incluir a funcionalidade de empilhamento. Eu acho que é um pouco mais amigável do que o pacote darch , que eu nunca consegui descobrir como usar (mesmo antes de ser removido do CRAN).
Se você tiver o pacote gputools instalado, poderá usar sua GPU para operações de matriz com a função rbm_gpu. Isso acelera bastante as coisas! Além disso, a maior parte do trabalho em um RBM é feita com operações de matriz, portanto, apenas a instalação de um bom BLAS, como o openBLAS , também acelerará bastante as coisas.
Aqui está o que acontece quando você executa o código no conjunto de dados de exemplo 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