Aby odpowiedzieć na moje pytanie, napisałem mały pakiet w R dla RBM: https://github.com/zachmayer/rbm
Ten pakiet jest wciąż intensywnie rozwijany i niewiele wiem o RBM, więc chętnie przyjmę wszelkie opinie (i prośby o ściągnięcie)! Możesz zainstalować pakiet za pomocą devtools :
devtools:::install_github('zachmayer/rbm')
library(rbm)
?rbm
?rbm_gpu
?stacked_rbm
Kod jest podobny do implementacji Andrew Landgrafa w R i implementacji Edwina Chena w pythonie , ale napisałem tę funkcję, aby była podobna do funkcji pca w bazie R i zawierała funkcję stosową. Myślę, że jest trochę bardziej przyjazny dla użytkownika niż pakiet darch , którego nigdy nie mogłem wymyślić, jak go używać (nawet zanim został usunięty z CRAN).
Jeśli masz zainstalowany pakiet gputools , możesz używać swojego GPU do operacji macierzowych za pomocą funkcji rbm_gpu. To bardzo przyspiesza! Co więcej, większość pracy w RBM jest wykonywana przy użyciu operacji matrycowych, więc samo zainstalowanie dobrego BLAS, takiego jak openBLAS , również znacznie przyspieszy.
Oto, co dzieje się po uruchomieniu kodu na przykładowym zestawie danych Edwina:
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