Как передать функцию 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, чтобы добавить функцию в реестр алгоритмов, которые выполняют неотрицательную матричную факторизацию, и затем вы можете вызывать ее по имени.

Другие вопросы по тегам