如何在Python代码

时间:2017-01-26 04:08:48

标签: python r machine-learning rpy2 nmf

我正在尝试为精彩的NMF包创建一个Python接口 - 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]“brunet”“KL”“lee”“Frobenius”“offset”

     

[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算法 - 密钥“key = function(x,seed,scale.factor&gt; = 1)

没有匹配条目      

{

     

pca&lt; - prcomp(t(x),retx = TRUE)

     

factorization.rank&lt; - nbasis(种子)

     

猫(种子)

     

基础(种子)&lt; - abs(pca $ rotation [,1:factorization.rank])

     

coef(seed)&lt; - 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'。< / p>      

warnings.warn(x,RRuntimeWarning)

我想知道是否有人可以帮助我?

1 个答案:

答案 0 :(得分:1)

原始提问者had his question answered on the NMF project on Github。如上所述,您将新算法定义为函数,然后使用setNMFMethod将函数添加到执行非负矩阵分解的算法注册表中,然后您可以按名称调用它。