如何在Python中有效地计算巨大的矩阵乘法(tfidf功能)?

社会

我目前想使用python中的余弦相似度和Tfidf功能来计算全对文档相似度。我的基本方法如下:

from sklearn.feature_extraction.text import TfidfVectorizer
#c = [doc1, doc2, ..., docn]
vec = TfidfVectorizer()
X = vec.fit_transform(c)
del vec
Y = X * X.T

工作正常,但不幸的是,不适用于我的大型数据集。X的尺寸为(350363, 2526183),因此输出矩阵Y应该具有(350363, 350363)由于tfidf功能,X非常稀疏,因此很容易装入内存(仅2GB左右)。但是,乘法在运行一段时间后给了我一个内存错误(即使内存未满,但我认为scipy非常聪明,以至于无法预期内存使用情况)。

我已经尝试过使用dtypes并没有成功。我还确保numpy和scipy链接了它们的BLAS库-但这不会对csr_matrix点功能产生影响,因为它是在C语言中实现的。我想也许会使用诸如memmap之类的东西,但是我不确定那。

有谁知道如何最好地解决这个问题?

凯尔·卡斯特纳(Kyle Kastner)

您可能需要查看random_projectionscikit-learn中的模块。约翰逊Lindenstrauss引理说,随机投影矩阵是保证维持成对距离高达一些宽容eta,这是一个超参数,当你计算出所需的随机投影的数量。

长话短说,SparseRandomProjection 这里看到的scikit-learn类是为您执行此操作的转换器。如果在X上运行它,vec.fit_transform您应该会看到功能尺寸的相当大的减少。

的公式sklearn.random_projection.johnson_lindenstrauss_min_dim表明,要保留高达10%的公差,您只需要johnson_lindenstrauss_min_dim(350363, .1)10942个特征。这是一个上限,因此您可以花更少的钱就可以逃脱。即使是1%的公差,也只需要johnson_lindenstrauss_min_dim(350363, .01)1028192个功能,这仍然比您现在拥有的功能要少得多。

编辑:尝试简单-如果您的数据是dtype ='float64',请尝试使用'float32'。仅此一项就可以节省大量空间,尤其是在您不需要双精度的情况下。

如果问题是您也不能在内存中存储“最终矩阵”,我建议您在HDF5Store中使用数据(如在使用pytables的熊猫中所见)。该链接具有一些不错的入门代码,您可以迭代地计算点乘积的大块并写入磁盘。我最近在一个45GB数据集的项目中广泛使用了此方法,如果您决定采用这种方法,可以提供更多帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在numpy中有效地计算高斯核矩阵?

如何在python中有效地结合断开的csr矩阵?

如何在Python中有效地计算多个文档中的双字母组

如何在Julia中有效地初始化巨大的稀疏数组?

如何在Matlab中更有效地执行以下矩阵乘法?

如何在 python 中有效地重复矩阵中的二进制模式和比率?

如何在 Python 中有效地将 2 元组的所有串联计算成更长的链

如何在 Matlab 中有效地计算单个有限差分?

如何在SQL中有效地计算列值的出现?

如何在Pytorch中有效地计算张量?

如何在Python中有效地从一个巨大的块中提取具有偏移量的字节?

如何在python中有效地搜索列表

如何在python中有效地搜索列表?

如何在python中有效地将字典中的值分组

如何在python中有效地对列表进行分类

如何在Python中有效地将参数解译到数据库

如何在python类列表中有效地创建编号列表

如何在Python中有效地匹配两个数组值?

如何在 Python 中有效地按段聚合

如何在python中有效地找到图形的顶部边界线

如何在 Cython 中有效地使用 Python 风格的整数?

如何在python中有效地根据多个条件拆分文本?

在PostgreSQL中有效地计算滚动总和

在Python中有效地从稀疏矩阵的列中减去均值

在Python中有效地对稀疏矩阵进行分组

如何有效地执行列乘法?

有效地计算邻接矩阵

有效地计算总和矩阵

如何在Python中有效地生成具有随机斜率和截距的直线?