我正在使用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内核的机器.
我试图重现本文的结果: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时得到的结果,所以我一定做错了,但我无法弄清楚是什么.
注意:我试过没有规范化向量,但我得到了相同的结果.
我正在阅读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函数的功能是否与文中的等式不兼容?
我有一个在100维空间中有500,000个点的数据库,我想找到最接近的2个点.我该怎么做?
更新:太空是欧几里得,对不起.并感谢所有的答案.顺便说一句,这不是功课.
algorithm performance nearest-neighbor pca approximate-nn-searching
我正在尝试使用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()函数?
我可以通过以下代码在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) 我正在使用KNN对手写数字进行分类.我现在也已经实施了PCA以减少维数.从256我到200.但我只注意到,~0.10%的信息丢失.我删了56维.损失不应该更大吗?只有当我跌到5维时,才会有20%的损失.这是正常的吗?
主成分分析(PCA)与机器学习中的特征选择有什么区别?PCA是一种功能选择方法吗?
是否有可能在PCA图上测试2个已知组之间聚类的重要性?测试它们的接近程度或扩散量(方差)以及簇之间的重叠量等.
我试图在巨大的稀疏矩阵上应用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) pca ×10
python ×4
scikit-learn ×3
algorithm ×2
r ×2
knn ×1
nlp ×1
numpy ×1
performance ×1
r-caret ×1
statistics ×1
svd ×1
word2vec ×1