2012-01-21 36 views
5

Tôi có một lớn (100K bởi 30K) và (rất) dữ liệu thưa thớt ở định dạng svmlight mà tôi tải như sau:triển khai thưa thớt của tính toán khoảng cách trong python/scikit-học

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

mà trả về một scipy thưa thớt mảng X

tôi chỉ đơn giản là cần phải tính toán khoảng cách cặp của tất cả các điểm đào tạo như

D = pdist(X) 

Thật không may, triển khai khoảng cách tính toán chỉ trong công việc scipy.spatial.distance cho các ma trận dày đặc. Do kích thước của các tập dữ liệu đó là không khả thi, nói, sử dụng pdist như

D = pdist(X.todense()) 

Bất kỳ con trỏ để triển khai tính toán khoảng cách ma trận thưa thớt hoặc cách giải quyết liên quan đến vấn đề này sẽ được đánh giá rất nhiều.

Rất cám ơn

Trả lời

4

Trong scikit-học có một chức năng sklearn.metrics.euclidean_distances mà làm việc cho cả ma trận thưa thớt và mảng NumPy dày đặc. Xem số reference documentation.

Tuy nhiên khoảng cách phi Euclide chưa được triển khai cho các ma trận thưa thớt.

+0

Cảm ơn câu trả lời của bạn. Lúc đầu nó có vẻ như là một giải pháp cho vấn đề của tôi vì "euclidean_distances" làm việc với dữ liệu thưa thớt, tuy nhiên ngay cả với 'D = euclidean_distances (X, X)' tôi nhận được một lỗi bộ nhớ. – Nicholas

+0

@Nicholas: 'euclidean_distances' nhất thiết phải trả về' X.shape [0] '×' X.shape [0] 'mảng dày đặc, tức là 1e10 trong trường hợp của bạn. –

+1

@Nicholas nếu bạn muốn triển khai k-means trên tập dữ liệu lớn (theo hướng 'X.shape [0]'), bạn nên thử lớp 'sklearn.cluster.MiniBatchKMeans'). Nó xử lý các thiết lập đầu vào tăng dần bởi các khối nhỏ do đó việc sử dụng bộ nhớ được kiểm soát. – ogrisel

Các vấn đề liên quan