Per rispondere alla mia domanda, ho scritto un piccolo pacchetto in R per RBM: https://github.com/zachmayer/rbm
Questo pacchetto è ancora in fase di sviluppo, e so molto poco sugli RBM, quindi accetterei con favore qualsiasi feedback (e richieste pull!) Che hai. Puoi installare il pacchetto usando devtools :
devtools:::install_github('zachmayer/rbm')
library(rbm)
?rbm
?rbm_gpu
?stacked_rbm
Il codice è simile all'implementazione di Andrew Landgraf in R e dell'implementazione di Edwin Chen in Python , ma ho scritto che la funzione è simile alla funzione pca nella base R e include funzionalità per lo stacking. Penso che sia un po 'più user-friendly rispetto al pacchetto darch , che non sono mai riuscito a capire come usare (anche prima che fosse rimosso da CRAN).
Se hai installato il pacchetto gputools puoi usare la tua GPU per operazioni a matrice con la funzione rbm_gpu. Questo accelera molto le cose! Inoltre, la maggior parte del lavoro in un RBM è fatto con operazioni a matrice, quindi solo l'installazione di un buon BLAS, come openBLAS , velocizzerà molto le cose.
Ecco cosa succede quando si esegue il codice sul set di dati di esempio di 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