2012-01-21 60 views
5

我有一个大的(100K由30K)和(非常)在svmlight格式稀疏数据集,其余加载如下:稀疏实现/ scikit学习

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()) 

任何指针稀疏矩阵距离计算的实现方式或解决方法与关于这个问题,将不胜感激。

非常感谢

回答

4

在scikit学习有一个sklearn.metrics.euclidean_distances函数,该函数用于稀疏矩阵和密集numpy的阵列工作。请参阅reference documentation

但是对于稀疏矩阵还没有实现非欧几里得距离。

+0

谢谢你的回答。起初,它似乎解决了我的问题,因为“euclidean_distances”适用于稀疏数据,但即使使用'D = euclidean_distances(X,X)',我也会遇到内存不足错误。 – Nicholas

+0

@Nicholas:'euclidean_distances'必然返回一个'X.shape [0]'×'X.shape [0]'密集数组,在你的情况下是1e10。 –

+1

@Nicholas如果你想在大数据集上实现k-means(在'X.shape [0]'方向),你应该试试'sklearn.cluster.MiniBatchKMeans'类。它通过小块逐步处理输入集,从而控制内存使用量。 – ogrisel