python / scikit-learn中距离计算的稀疏实现

Posted

技术标签:

【中文标题】python / scikit-learn中距离计算的稀疏实现【英文标题】:Sparse implementations of distance computations in python / scikit-learn 【发布时间】:2012-02-15 21:30:05 【问题描述】:

我有一个 svmlight 格式的大型(100K x 30K)和(非常)稀疏数据集,我按如下方式加载:

import numpy as np
from scipy.cluster.vq import kmeans2
from scipy.spatial.distance import pdist, squareform
from sklearn.datasets import load_svmlight_file

X,Y = load_svmlight_file("somefile_svm.txt")

返回一个稀疏的 scipy 数组 X

我只需要将所有训练点的成对距离计算为

D = pdist(X)

不幸的是,scipy.spatial.distance 中的距离计算实现仅适用于密集矩阵。由于数据集的大小,使用 pdist 作为

是不可行的
D = pdist(X.todense())

任何指向稀疏矩阵距离计算实现或解决此问题的方法的指针将不胜感激。

非常感谢

【问题讨论】:

【参考方案1】:

scikit-learn 中有一个sklearn.metrics.euclidean_distances 函数适用于稀疏矩阵和密集的numpy 数组。请参阅reference documentation。

然而,稀疏矩阵尚未实现非欧几里得距离。

【讨论】:

感谢您的回答。起初,它似乎是我的问题的解决方案,因为“euclidean_distances”适用于稀疏数据,但即使使用D=euclidean_distances(X, X),我也会遇到内存不足错误。 @Nicholas: euclidean_distances 必然返回一个 X.shape[0] × X.shape[0] 密集数组,在您的情况下为 1e10。 @Nicholas 如果你想在大型数据集上实现 k-means(在X.shape[0] 方向),你应该尝试sklearn.cluster.MiniBatchKMeans 类)。它以小块增量处理输入集,因此控制了内存使用。 其实我想在python中实现的不是k-means(C中存在许多有效的稀疏实现),而是实现评估聚类结果质量的措施。为此,创建 python 脚本的简单性会派上用场,但它似乎无法处理我的问题的内存需求。非常感谢所有的答案! 如果您的数据非常稀疏,并且您的行是正数且归一化,您可以计算点积 A * A 的稀疏矩阵。如果数据足够稀疏,可以放入内存。然后可以通过2 - 2 * A * A 隐式定义欧几里得距离。

以上是关于python / scikit-learn中距离计算的稀疏实现的主要内容,如果未能解决你的问题,请参考以下文章

机器学习:SVM(scikit-learn 中的 SVM:LinearSVC)

在 Python 中使用自定义距离函数对任意对象进行聚类

手把手教你使用Python打造一款摸鱼倒计界面

给定距离矩阵的 Python 中的最近邻

在 scikit-learn 中为 KNN 使用除 p-norm 之外的其他成对距离度量

《机器学习系统设计》之应用scikit-learn做文本分类(上)