Как передать функцию R в качестве аргумента, используя rpy2 в коде Python
Я пытаюсь создать интерфейс Python для блестящего пакета NMF - https://cran.r-project.org/web/packages/NMF/NMF.pdf (поскольку он гораздо более гибкий, чем параметры Python). Все идет нормально.
Я придумываю что-то вроде этого:
# Python rpy2
__NMF = importr("NMF")
n_comp_R = robjects.IntVector(n_components)
nmf_ro = self.__NMF.nmf(data, n_comp_R, methods, self.seed, nrun=10)
Отлично работает. Методы - это список возможных алгоритмов, которые я могу использовать:
nmfAlgorithm ()
[1] "брюнет", "кл", "ли", "фробениус", "смещение"
[6] "nsNMF", "ls-nmf", "pe-nmf", "siNMF", "snmf/r".
[11] "snmf/l"
Другая возможность - использовать собственный алгоритм, как описано в документации NMF.
# R code
my.algorithm <- function(x, seed, param.1, param.2) {
# do something with starting point ...
# return updated starting point
return(seed)
}
res <- nmf(data, n_comp, my.algorithm)
Как я могу воспроизвести это, используя rpy2
?
Я пробовал что-то вроде:
import rpy2.robjects as robjects
my_algorithm = robjects.r('''
function (x, seed, scale.factor = 1)
{
pca <- prcomp(t(x), retx = TRUE)
factorization.rank <- nbasis(seed)
cat(seed)
basis(seed) <- abs(pca$rotation[, 1:factorization.rank])
coef(seed) <- t(abs(pca$x[, 1:factorization.rank]))/scale.factor
return(seed)
}
''')
nmf_ro = __NMF.nmf(data, n_comp_R, my_algorithm.r_repr(), nrun=1)
Но это не сделало волшебство =(
Алгоритм NMF - нет соответствующей записи для ключа "ключ = функция (x, seed, scale.factor> = 1)
{
pca <- prcomp (t (x), retx = TRUE)
factorization.rank <- nbasis (семя)
кошка (семя)
базис (начальное число) <- abs (pca $ вращение [, 1: factorization.rank])
coef (seed) <- t (abs (pca $ x [, 1: factorization.rank])) / scale.factor
возвращение (семя)
} "В реестре.
Используйте одно из: 'brunet', 'Frobenius', 'KL', 'lee', 'ls-nmf', '.M # brunet', 'nsNMF', 'offset', 'pe-nmf', '.R #brunet ','.R # lee ','.R # nsNMF ','.R # offset ',' siNMF ','.siNMF ',' snmf / l ',' snmf / r '.
warnings.warn (x, RRuntimeWarning)
Интересно, может ли кто-нибудь помочь мне здесь?
1 ответ
Первоначально задававший вопрос получил ответ на свой вопрос о проекте NMF на Github. Как описано здесь, вы определяете свой новый алгоритм как функцию, затем используете setNMFMethod, чтобы добавить функцию в реестр алгоритмов, которые выполняют неотрицательную матричную факторизацию, и затем вы можете вызывать ее по имени.