Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于文档分类的scipy/sklearn稀疏矩阵分解_Python_Scipy_Scikit Learn_Sparse Matrix_Matrix Multiplication - Fatal编程技术网

Python 用于文档分类的scipy/sklearn稀疏矩阵分解

Python 用于文档分类的scipy/sklearn稀疏矩阵分解,python,scipy,scikit-learn,sparse-matrix,matrix-multiplication,Python,Scipy,Scikit Learn,Sparse Matrix,Matrix Multiplication,我试图在一个大型语料库(4 mil个文档)上进行文档分类,并在使用标准scikit学习方法时不断遇到内存错误。在清理/屏蔽我的数据后,我有一个非常稀疏的矩阵,大约有1百万字。我的第一个想法是使用sklearn.decomposition.TruncatedSVD,但由于内存错误,我无法用足够大的k执行.fit()操作(我能做的最大值仅占数据方差的25%)。我试着按照sklearn分类,但在进行KNN分类时,内存仍然不足我想手动进行核心外矩阵变换,将PCA/SVD应用于矩阵以降低维数,但是需要一种

我试图在一个大型语料库(4 mil个文档)上进行文档分类,并在使用标准scikit学习方法时不断遇到内存错误。在清理/屏蔽我的数据后,我有一个非常稀疏的矩阵,大约有1百万字。我的第一个想法是使用sklearn.decomposition.TruncatedSVD,但由于内存错误,我无法用足够大的k执行.fit()操作(我能做的最大值仅占数据方差的25%)。我试着按照sklearn分类,但在进行KNN分类时,内存仍然不足我想手动进行核心外矩阵变换,将PCA/SVD应用于矩阵以降低维数,但是需要一种方法来首先计算特征向量。我希望使用scipy.sparse.linalg.eigs是否有一种方法来计算特征向量矩阵以完成下面显示的代码?

from sklearn.feature_extraction.text import TfidfVectorizer
import scipy.sparse as sp
import numpy as np
import cPickle as pkl
from sklearn.neighbors import KNeighborsClassifier

def pickleLoader(pklFile):
    try:
        while True:
            yield pkl.load(pklFile)
    except EOFError:
        pass

#sample docs
docs = ['orange green','purple green','green chair apple fruit','raspberry pie banana yellow','green raspberry hat ball','test row green apple']
classes = [1,0,1,0,0,1]
#first k eigenvectors to keep
k = 3

#returns sparse matrix
tfidf = TfidfVectorizer()
tfs = tfidf.fit_transform(docs)

#write sparse matrix to file
pkl.dump(tfs, open('pickleTest.p', 'wb'))



#NEEDED - THIS LINE THAT CALCULATES top k eigenvectors   
del tfs

x = np.empty([len(docs),k])

#iterate over sparse matrix
with open('D:\\GitHub\\Avitro-Classification\\pickleTest.p') as f:
    rowCounter = 0
    for dataRow in pickleLoader(f):
        colCounter = 0
        for col in k:
            x[rowCounter, col] = np.sum(dataRow * eingenvectors[:,col])
f.close()

clf = KNeighborsClassifier(n_neighbors=10) 
clf.fit(x, k_class)
任何帮助或指导都将不胜感激!如果有更好的方法,我很乐意尝试不同的方法,但我想在这个大型稀疏数据集上尝试KNN,最好使用一些降维(这在我运行的小测试数据集上表现得非常好-我不想因为愚蠢的内存限制而失去性能!)

编辑:这是我第一次尝试运行的代码,它引导我走上了自己的核心外稀疏PCA实现之路。任何关于修复此内存错误的帮助都会使此操作变得更容易

from sklearn.decomposition import TruncatedSVD
import pickle

dataFolder = 'D:\\GitHub\\project\\'

# in the form of a list: [word sample test word, big sample test word test, green apple test word]
descWords = pickle.load(open(dataFolder +'descriptionWords.p'))

vectorizer = TfidfVectorizer()
X_words = vectorizer.fit_transform(descWords)

print np.shape(X_words)

del descWords
del vectorizer

svd = TruncatedSVD(algorithm='randomized', n_components=50000, random_state=42)
output = svd.fit_transform(X_words)
输出:

(3995803, 923633)
---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-27-c0db86bd3830> in <module>()
     16 
     17 svd = TruncatedSVD(algorithm='randomized', n_components=50000, random_state=42)
---> 18 output = svd.fit_transform(X_words)

C:\Python27\lib\site-packages\sklearn\decomposition\truncated_svd.pyc in fit_transform(self, X, y)
    173             U, Sigma, VT = randomized_svd(X, self.n_components,
    174                                           n_iter=self.n_iter,
--> 175                                           random_state=random_state)
    176         else:
    177             raise ValueError("unknown algorithm %r" % self.algorithm)

C:\Python27\lib\site-packages\sklearn\utils\extmath.pyc in randomized_svd(M, n_components, n_oversamples, n_iter, transpose, flip_sign, random_state, n_iterations)
    297         M = M.T
    298 
--> 299     Q = randomized_range_finder(M, n_random, n_iter, random_state)
    300 
    301     # project M to the (k + p) dimensional space using the basis vectors

C:\Python27\lib\site-packages\sklearn\utils\extmath.pyc in randomized_range_finder(A, size, n_iter, random_state)
    212 
    213     # generating random gaussian vectors r with shape: (A.shape[1], size)
--> 214     R = random_state.normal(size=(A.shape[1], size))
    215 
    216     # sampling the range of A using by linear projection of r

C:\Python27\lib\site-packages\numpy\random\mtrand.pyd in mtrand.RandomState.normal (numpy\random\mtrand\mtrand.c:9968)()

C:\Python27\lib\site-packages\numpy\random\mtrand.pyd in mtrand.cont2_array_sc (numpy\random\mtrand\mtrand.c:2370)()

MemoryError: 
(3995803923633)
---------------------------------------------------------------------------
MemoryError回溯(上次最近调用)
在()
16
17 svd=TruncatedSVD(算法='randomized',n_分量=50000,随机状态=42)
--->18输出=svd.fit_变换(X_字)
C:\Python27\lib\site packages\sklearn\decomposition\truncated_svd.pyc in fit_transform(self,X,y)
173 U,Sigma,VT=随机化的svd(X,自n分量,
174 n_iter=自n_iter,
-->175随机_状态=随机_状态)
176.其他:
177提升值错误(“未知算法%r”%self.algorithm)
随机svd中的C:\Python27\lib\site packages\sklearn\utils\extmath.pyc(M,n_组件,n_过采样,n_iter,转置,翻转符号,随机状态,n_迭代)
297米=百万吨
298
-->299 Q=随机测距仪(M,n,n,iter,随机状态)
300
301#使用基向量将M投影到(k+p)维空间
随机测距仪中的C:\Python27\lib\site packages\sklearn\utils\extmath.pyc(A、大小、n、随机状态)
212
213#生成具有形状的随机高斯向量r:(A.形状[1],大小)
-->214 R=随机状态。正常(大小=(A.shape[1],大小))
215
216#使用r的线性投影对A的范围进行采样
C:\Python27\lib\site packages\numpy\random\mtrand.pyd在mtrand.RandomState.normal(numpy\random\mtrand\mtrand.C:9968)()
C:\Python27\lib\site packages\numpy\random\mtrand.pyd在mtrand.cont2\u array\u sc(numpy\random\mtrand\mtrand.C:2370)()
记忆错误:
scikit learn 0.15.2中未实现稀疏数据上的核心外SVD或PCA。你可能想试试

编辑:我在第一次回复中忘记指定“关于稀疏数据”。

scikit learn 0.15.2中未实现关于稀疏数据的核心外SVD或PCA。你可能想试试


编辑:我忘了在第一次答复中指定“关于稀疏数据”。

对,这就是为什么我问是否有人知道计算非平方稀疏矩阵特征向量的方法。上面的代码将大型稀疏矩阵写入文件,然后使用生成器,这样它就不会保存在内存中。我只需要推导出特征向量,这样我就可以愉快地工作了。非方矩阵的特征向量没有任何意义。你可能指的是奇异向量。scikit learn的
TruncatedSVD
已经做到了这一点(在内部使用
随机化_svd
scipy.sparse.linalg.svd
)。但这两种方法都是批处理的(即非增量)。另一方面,gensim可以在稀疏的字包数据上进行核心奇异值分解。啊,我忘记了一个步骤(我需要先得到协方差矩阵,它是平方的)。我无法让TruncatedSVD开箱即用,这就是我出现内存错误的地方,但还没有时间弄清楚如何让批处理在sklearn中工作。我不确定如何将数据存储在磁盘上,以便以批处理形式将其读取到TruncatedSVD函数。当我有一点空闲时间时,我将不得不探索并跟进上面的更新,以展示我第一次尝试运行的内容……任何想法都会有所帮助,我对sklearn的稀疏实现不太熟悉。对,这就是为什么我问是否有人知道计算非平方稀疏矩阵的特征向量的方法。上面的代码将大型稀疏矩阵写入文件,然后使用生成器,这样它就不会保存在内存中。我只需要推导出特征向量,这样我就可以愉快地工作了。非方矩阵的特征向量没有任何意义。你可能指的是奇异向量。scikit learn的
TruncatedSVD
已经做到了这一点(在内部使用
随机化_svd
scipy.sparse.linalg.svd
)。但这两种方法都是批处理的(即非增量)。另一方面,gensim可以在稀疏的字包数据上进行核心奇异值分解。啊,我忘记了一个步骤(我需要先得到协方差矩阵,它是平方的)。我无法让TruncatedSVD开箱即用,这就是我出现内存错误的地方,但还没有时间弄清楚如何让批处理在sklearn中工作。我不知道我需要什么