标签: nmf

如何比较PCA和NMF的预测能力

我想比较算法的输出与不同的预处理数据:NMF和PCA.为了获得可比较的结果,而不是为每个PCA和NMF选择相同数量的组件,我想选择解释的量,例如95%的保留方差.

我想知道是否有可能确定NMF每个组成部分保留的差异.

例如,使用PCA,这将通过以下方式给出: retainedVariance(i) = eigenvalue(i) / sum(eigenvalue)

有任何想法吗?

pca dimensionality-reduction scikit-learn matrix-factorization nmf

13
推荐指数
1
解决办法
3171
查看次数

使用scikit-learn NMF和一组预先计算的基矢量(Python)

我想使用scikit-learn NMF(从这里)(或任何其他NMF,如果它确实起作用,实际上).

具体来说,我有一个输入矩阵(这是一个音频幅度谱图),我想分解它.

我已经预先计算了W矩阵.如何使用一个固定的W¯¯sklearn.decompose.NMF?我还没有找到任何其他问题.

我看到这个方法在fit参数中也提到了类似的东西:"如果为False,假设组件被预先计算并存储在变换器中,并且不会被更改." 但是,我不知道如何制作变换器对象.

python scikit-learn nmf

11
推荐指数
1
解决办法
1008
查看次数

Numpy给出“ TypeError:无法将序列乘以'float'类型的非整数”

有问题的部分是:

   self.H = np.multiply(self.H, np.divide(np.matmul(preprocessing.normalize(self.W).T, np.multiply(self.X, np.power(self.A, self.beta - 2)))), np.matmul(self.W.T, np.power(self.A, self.beta - 1)) + self.sparsity)
Run Code Online (Sandbox Code Playgroud)

A,W,H是熊猫数据帧。Beta和稀疏性是整数。

它们的初始化是:

    self.W = pd.DataFrame(np.random.randint(100,size=(self.X.shape[0], self.K)))
    self.H = pd.DataFrame(np.random.randint(0,100,size=(self.K, self.X.shape[1])))
    self.W = preprocessing.normalize(self.W)
    self.A = self.W.dot(self.H)
Run Code Online (Sandbox Code Playgroud)

python numpy matrix scipy nmf

5
推荐指数
1
解决办法
906
查看次数

使用sklearn NMF组件重建新数据与inverse_transform不匹配

我在训练数据上使用 scikit-learn NMF 模型拟合模型。现在我使用

result_1 = model.inverse_transform(model.transform(new_data))
Run Code Online (Sandbox Code Playgroud)

然后,我计算逆变换的我的数据从NMF模型手动拍摄组件,利用公式在第15页这里

temp = np.dot(model.components_, model.components_.T)
transform = np.dot(np.dot(model.components_.T, np.linalg.pinv(temp)), 
model.components_)
result_2 = np.dot(new_data, transform)
Run Code Online (Sandbox Code Playgroud)

我想了解为什么 2 个结果不匹配。在计算逆变换和重建数据时我做错了什么?

示例代码:

import numpy as np
from sklearn.decomposition import NMF

data = np.array([[0,0,1,1,1],[0,1,1,0,0],[0,1,0,0,0],[1,0,0,1,0]])
print(data)
//array([[0, 0, 1, 1, 1],
       [0, 1, 1, 0, 0],
       [0, 1, 0, 0, 0],
       [1, 0, 0, 1, 0]])


model = NMF(alpha=0.0, init='random', l1_ratio=0.0, max_iter=200, n_components=2, random_state=0, shuffle=False, solver='cd', tol=0.0001, verbose=0)
model.fit(data)
NMF(alpha=0.0, beta_loss='frobenius', init='random', l1_ratio=0.0,
  max_iter=200, n_components=2, random_state=0, shuffle=False, …
Run Code Online (Sandbox Code Playgroud)

python numpy recommendation-engine scikit-learn nmf

5
推荐指数
1
解决办法
1867
查看次数

SKLearn NMF 与自定义 NMF

我正在尝试使用非负矩阵分解构建推荐系统。使用scikit-learn NMF作为模型,我拟合我的数据,导致一定的损失(即重建误差)。然后,我使用inverse_transform方法生成新数据的推荐。

现在,我使用在 TensorFlow 中构建的另一个模型执行相同的操作。训练后的重建误差接近于之前使用 sklearn 方法获得的重建误差。然而,潜在因素和最终建议都不相同。

据我所知,这两种方法之间的区别之一是:在 sklearn 中,我使用坐标下降求解器,而在 TensorFlow 中,我使用基于梯度下降的 AdamOptimizer。其他一切似乎都是一样的:

  1. 使用的损失函数是 Frobenius 范数
  2. 两种情况都没有正则化
  3. 使用相同数量的潜在维度对相同数据进行测试

我正在使用的相关代码:

1.scikit-learn方法:

model =  NMF(alpha=0.0, init='random', l1_ratio=0.0, max_iter=200, 
n_components=2, random_state=0, shuffle=False, solver='cd', tol=0.0001, 
verbose=0)
model.fit(data)
result = model.inverse_transform(model.transform(data))
Run Code Online (Sandbox Code Playgroud)

2.TensorFlow方法:

w = tf.get_variable(initializer=tf.abs(tf.random_normal((data.shape[0], 
2))), constraint=lambda p: tf.maximum(0., p))
h = tf.get_variable(initializer=tf.abs(tf.random_normal((2, 
data.shape[1]))), constraint=lambda p: tf.maximum(0., p))
loss = tf.sqrt(tf.reduce_sum(tf.squared_difference(x, tf.matmul(w, h))))
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果这两种方法生成的建议不匹配,那么我如何确定哪些是正确的?根据我的用例,sklearn 的 NMF 给了我很好的结果,但 TensorFlow 实现却没有。如何使用我的自定义实现实现相同的目标?

python recommendation-engine scikit-learn tensorflow nmf

5
推荐指数
1
解决办法
2320
查看次数

是否有良好的库可以快速进行非负矩阵分解(NMF)?

我有一个稀疏矩阵,其形状为570000*3000.我试图尼玛做NMF(使用默认的NMF方法,并设定max_iter至65岁).但是,我发现nimfa很慢.有人用更快的库来做NMF吗?

c++ python pca matrix-factorization nmf

4
推荐指数
1
解决办法
3363
查看次数

Very Large and Very Sparse Non Negative Matrix factorization

我有一个非常大且稀疏的矩阵(531K x 315K),总单元数约为1670亿。非零值仅为1s。非零值的总数约为45K。是否有有效的NMF软件包来解决我的问题?我知道有几个软件包,它们仅适用于较小的数据矩阵。任何想法都可以。提前致谢。

python sparse-matrix bigdata matrix-factorization nmf

3
推荐指数
1
解决办法
2033
查看次数

R 中稀疏矩阵上的快速 NMF

我正在寻找 R 中稀疏矩阵的快速 NMF 实现。

RNMF包由许多算法组成,但这些算法在计算时间方面都没有给人留下深刻的印象。

NNLM::nnmf()目前看来 R 中最先进的技术,特别是method = "scd"loss = "mse",实现为通过顺序坐标下降求解的交替最小二乘法。然而,这种方法在非常大、非常稀疏的矩阵上相当慢。

rsparse::WRMF函数非常快,但这是因为只有正值用于和A的逐行计算WH的逐行计算。

是否有在稀疏矩阵上求解 NMF 的合理实现?

scikit-learnR 中有等价的吗?看到这个问题

R 中有各种工作函数,例如fnnls, tsnnls,但没有一个超越nnls::nnls(用 Fortran 编写)。我无法将这些函数中的任何一个编码到更快的 NMF 框架中。

r nmf

3
推荐指数
1
解决办法
967
查看次数

非负矩阵分解 - IndexError:索引 4 超出轴 1 的范围,大小为 4

这是我将使用的数据集的一部分:

 u'tff prep normalized clean water permability ncwp result outside operating range',
 u'technician inadvertently omitted documenting initial room \u201c cleaned sanitized field form',
 u'sunflower seed observed floor room 1',
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码:

tfidf_model = vectorizer.fit_transform(input_document_lower)
tfidf_feature_names = vectorizer.get_feature_names()
nmf = NMF(n_components=no_topics, random_state=1, alpha=.1, l1_ratio=.5, init='nndsvd').fit(tfidf_model)
Run Code Online (Sandbox Code Playgroud)

就像标题所述,我收到以下错误:

IndexError: index 4 is out of bounds for axis 1 with size 4
Run Code Online (Sandbox Code Playgroud)

老实说,我不确定如何开始调试。我使用相同的数据集构建了一个 LDA,没有任何问题。任何帮助将非常感激

python machine-learning topic-modeling nmf

1
推荐指数
1
解决办法
276
查看次数

优化 for 循环 RcppArmadillo 中的矩阵乘法

目的是在 R 中实现正交投影非负矩阵分解 (opnmf) 的快速版本。我正在翻译此处提供的 matlab 代码。

我实现了一个普通的 R 版本,但对于 20 因子解决方案,它比我的数据 (~ 225000 x 150) 上的 matlab 实现慢得多(大约慢 5.5 倍)。

所以我认为使用 c++ 可能会加快速度,但它的速度与 R 类似。我认为这可以优化,但不确定如何优化,因为我是 c++ 的新手。是讨论类似问题的线程。

这是我的 RcppArmadillo 实现。

// [[Rcpp::export]]
Rcpp::List arma_opnmf(const arma::mat & X, const arma::mat & W0, double tol=0.00001, int maxiter=10000, double eps=1e-16) {
  arma::mat W = W0;
  arma::mat Wold = W;
  arma::mat XXW = X * (X.t()*W);
  double diffW = 9999999999.9;
  
  Rcout << "The value of maxiter : " << …
Run Code Online (Sandbox Code Playgroud)

r matrix-multiplication nmf rcpparmadillo

0
推荐指数
1
解决办法
415
查看次数