标签: pca

在非常大的稀疏矩阵上应用PCA

我正在使用R进行文本分类任务,并且我获得了一个文档项矩阵,其大小为22490×120,000(仅有400万个非零条目,小于1%的条目).现在我想通过利用PCA(主成分分析)来降低维数.遗憾的是,R无法处理这个巨大的矩阵,所以我将这个稀疏矩阵存储在"矩阵市场格式"的文件中,希望使用其他一些技术来做PCA.

所以任何人都可以给我一些有用库(无论编程语言)的提示,它可以轻松地用这个大规模矩阵做PCA,或者自己做一个简单的PCA,换句话说,首先计算协方差矩阵,然后计算协方差矩阵的特征值和特征向量.

我想要的是计算所有PC(120,000),并且只选择前N台PC,它们占90%的差异.显然,在这种情况下,我必须先给出一个阈值,将一些非常小的方差值设置为0(在协方差矩阵中),否则,协方差矩阵将不会稀疏,其大小将是120,000乘120,000,这是用一台机器无法处理.此外,负载(特征向量)将非常大,并且应以稀疏格式存储.

非常感谢您的帮助!

注意:我使用的是具有24GB RAM和8个CPU内核的机器.

language-agnostic machine-learning sparse-matrix pca

17
推荐指数
2
解决办法
8711
查看次数

关于word2vec嵌入的PCA

我试图重现本文的结果:https://arxiv.org/pdf/1607.06520.pdf

特别是这部分:

为了识别性别子空间,我们采用了十个性别对差异向量并计算了其主要成分(PC).如图6所示,有一个方向可以解释这些向量中的大部分方差.第一个特征值明显大于其余特征值.

在此输入图像描述

我使用与作者相同的单词向量集(Google News Corpus,300维度),我将其加载到word2vec中.

作者引用的"十个性别对差异向量"是根据以下单词对计算得出的:

在此输入图像描述

我用以下方式计算了每个规范化向量之间的差异:

model = gensim.models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-
negative300.bin', binary = True)
model.init_sims()

pairs = [('she', 'he'),
('her', 'his'),
('woman', 'man'),
('Mary', 'John'),
('herself', 'himself'),
('daughter', 'son'),
('mother', 'father'),
('gal', 'guy'),
('girl', 'boy'),
('female', 'male')]

difference_matrix = np.array([model.word_vec(a[0], use_norm=True) - model.word_vec(a[1], use_norm=True) for a in pairs])
Run Code Online (Sandbox Code Playgroud)

然后我根据论文在得到的矩阵上执行PCA,包含10个组件:

from sklearn.decomposition import PCA
pca = PCA(n_components=10)
pca.fit(difference_matrix)
Run Code Online (Sandbox Code Playgroud)

但是当我看到时,我得到了非常不同的结果pca.explained_variance_ratio_:

array([  2.83391436e-01,   2.48616155e-01,   1.90642492e-01,
         9.98411858e-02,   5.61260498e-02,   5.29706681e-02,
         2.75670634e-02,   2.21957722e-02,   1.86491774e-02,
         1.99108478e-32])
Run Code Online (Sandbox Code Playgroud)

或用图表:

在此输入图像描述

当应该超过60%时,第一个组件占差异的不到30%!

我得到的结果类似于当我尝试在随机选择的向量上进行PCA时得到的结果,所以我一定做错了,但我无法弄清楚是什么.

注意:我试过没有规范化向量,但我得到了相同的结果.

python nlp pca scikit-learn word2vec

17
推荐指数
2
解决办法
4508
查看次数

使用Numpy(np.linalg.svd)进行奇异值分解

我正在阅读Abdi&Williams(2010)的"主成分分析",我正在尝试重做SVD以获得进一步PCA的值.

文章指出在SVD之后:

X = PDQ ^ t

我在np.array X中加载我的数据.

X = np.array(data)
P, D, Q = np.linalg.svd(X, full_matrices=False)
D = np.diag(D)
Run Code Online (Sandbox Code Playgroud)

但是在检查时我没有得到上述相同

X_a = np.dot(np.dot(P, D), Q.T)
Run Code Online (Sandbox Code Playgroud)

X_a和X是相同的尺寸,但值不相同.我是否遗漏了某些内容,或者np.linalg.svd函数的功能是否与文中的等式不兼容?

python numpy pca

16
推荐指数
3
解决办法
4万
查看次数

如何在500维点找到100维空间中最接近的2个点?

我有一个在100维空间中有500,000个点的数据库,我想找到最接近的2个点.我该怎么做?

更新:太空是欧几里得,对不起.并感谢所有的答案.顺便说一句,这不是功课.

algorithm performance nearest-neighbor pca approximate-nn-searching

15
推荐指数
4
解决办法
2691
查看次数

将PCA预处理参数传递给train()

我正在尝试使用PCA作为预处理在插入符号中构建预测模型.预处理如下:

preProc <- preProcess(IL_train[,-1], method="pca", thresh = 0.8)
Run Code Online (Sandbox Code Playgroud)

是否有可能将thresh参数直接传递给插入符号的train()函数?我尝试了以下,但它不起作用:

modelFit_pp <- train(IL_train$diagnosis ~ . , preProcess="pca",
                            thresh= 0.8, method="glm", data=IL_train)
Run Code Online (Sandbox Code Playgroud)

如果没有,我如何将单独的preProc结果传递给train()函数?

r machine-learning pca r-caret

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

PCA在Scikit中的预测和重建

我可以通过以下代码在scikit中执行PCA:X_train有279180行和104列.

from sklearn.decomposition import PCA
pca = PCA(n_components=30)
X_train_pca = pca.fit_transform(X_train)
Run Code Online (Sandbox Code Playgroud)

现在,当我想将特征向量投影到特征空间时,我必须做到以下几点:

""" Projection """
comp = pca.components_ #30x104
com_tr = np.transpose(pca.components_) #104x30
proj = np.dot(X_train,com_tr) #279180x104 * 104x30 = 297180x30
Run Code Online (Sandbox Code Playgroud)

但我对此步骤犹豫不决,因为Scikit 文档说:

components_:array,[n_components,n_features]

特征空间中的主轴,表示数据中最大方差的方向.

在我看来,它已经被预测,但是当我检查源代码时,它只返回特征向量.

如何投影它的正确方法是什么?

最终,我的目标是计算重建的MSE.

""" Reconstruct """
recon = np.dot(proj,comp) #297180x30 * 30x104 = 279180x104

"""  MSE Error """
print "MSE = %.6G" %(np.mean((X_train - recon)**2))
Run Code Online (Sandbox Code Playgroud)

python machine-learning pca scikit-learn

15
推荐指数
2
解决办法
1万
查看次数

PCA和KNN算法

我正在使用KNN对手写数字进行分类.我现在也已经实施了PCA以减少维数.从256我到200.但我只注意到,~0.10%的信息丢失.我删了56维.损失不应该更大吗?只有当我跌到5维时,才会有20%的损失.这是正常的吗?

algorithm knn pca

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

PCA(主成分分析)与特征选择的区别

主成分分析(PCA)与机器学习中的特征选择有什么区别?PCA是一种功能选择方法吗?

machine-learning pca feature-selection

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

在PCA图上测试聚类的重要性

是否有可能在PCA图上测试2个已知组之间聚类的重要性?测试它们的接近程度或扩散量(方差)以及簇之间的重叠量等.

statistics r pca

14
推荐指数
2
解决办法
2万
查看次数

使用sklearn在大型稀疏矩阵上执行PCA

我试图在巨大的稀疏矩阵上应用PCA,在下面的链接中它说sklearn的randomizedPCA可以处理scipy稀疏格式的稀疏矩阵. 在非常大的稀疏矩阵上应用PCA

但是,我总是得到错误.有人可以指出我做错了什么.

输入矩阵'X_train'包含float64中的数字:

>>>type(X_train)
<class 'scipy.sparse.csr.csr_matrix'>
>>>X_train.shape
(2365436, 1617899)
>>>X_train.ndim 
2
>>>X_train[0]     
<1x1617899 sparse matrix of type '<type 'numpy.float64'>'
    with 81 stored elements in Compressed Sparse Row format>
Run Code Online (Sandbox Code Playgroud)

我想做:

>>>from sklearn.decomposition import RandomizedPCA
>>>pca = RandomizedPCA()
>>>pca.fit(X_train)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/decomposition/pca.py", line 567, in fit
    self._fit(check_array(X))
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/utils/validation.py", line 334, in check_array
    copy, force_all_finite)
  File "/home/RT11/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sklearn/utils/validation.py", line 239, in _ensure_sparse_format
    raise TypeError('A sparse matrix was passed, but dense '
TypeError: …
Run Code Online (Sandbox Code Playgroud)

python sparse-matrix svd pca scikit-learn

14
推荐指数
2
解决办法
1万
查看次数