2014-01-13 5 views
4

scikit-learn의 DictVectorizer에서 반환 된 Scipy 스파 스 행렬에서 가장 가까운 이웃 클러스터링을 계산하려고합니다. 그러나 scikit-learn을 사용하여 거리 행렬을 계산하려고하면 'euclidean'거리를 사용하여 pairwise.euclidean_distancespairwise.pairwise_distances 사이의 오류 메시지가 표시됩니다. 나는 scikit-learn이 거리 매트릭스를 계산할 수 있다는 인상을 받았다.Scipy Sparse - 거리 행렬 (Scikit 또는 Scipy)

내 매트릭스는 모양이 매우 희박합니다 : <364402x223209 sparse matrix of type <class 'numpy.float64'> with 728804 stored elements in Compressed Sparse Row format>.

나는 Scipy에서 pdistkdtree과 같은 방법을 시도했지만 결과를 처리 할 수 ​​없다는 다른 오류가 발생했습니다.

누구든지 저에게 거리 매트릭스 및/또는 가장 가까운 이웃 결과를 효과적으로 계산할 수있는 솔루션을 가르쳐 주시겠습니까?

일부 예제 코드 :

import numpy as np 
from sklearn.feature_extraction import DictVectorizer 
from sklearn.neighbors import NearestNeighbors 
from sklearn.metrics import pairwise 
import scipy.spatial 

file = 'FileLocation' 
data = [] 
FILE = open(file,'r') 
for line in FILE: 
    templine = line.strip().split(',') 
    data.append({'user':str(int(templine[0])),str(int(templine[1])):int(templine[2])}) 
FILE.close() 

vec = DictVectorizer() 
X = vec.fit_transform(data) 

result = scipy.spatial.KDTree(X) 

오류 : 나는 실행하는 경우

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/scipy/spatial/kdtree.py", line 227, in __init__ 
    self.n, self.m = np.shape(self.data) 
ValueError: need more than 0 values to unpack 

마찬가지로 :

scipy.spatial.distance.pdist(X,'euclidean') 

를 내가 얻을 다음

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/scipy/spatial/distance.py", line 1169, in pdist 
    [X] = _copy_arrays_if_base_present([_convert_to_double(X)]) 
    File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/scipy/spatial/distance.py", line 113, in _convert_to_double 
    X = X.astype(np.double) 
ValueError: setting an array element with a sequence. 
,

마지막에 NearestNeighbor을 실행하여 메모리 오류의 결과를 scikit 배우기 :

nbrs = NearestNeighbors(n_neighbors=10, algorithm='brute') 
+2

어떤 종류의 오류가 발생합니까? 어떤 코드를 실행하고 있습니까? – jorgeca

+0

질문에 해당 정보를 편집하십시오 : 당신이하고있는 것을 보여주는 최소한의 예와 얻은 실제 오류. – jorgeca

+1

감사! 이제 훨씬 더 좋아 보인다. – jorgeca

답변

2

먼저, 스파 스 매트릭스 KDTreepdist을 사용할 수 없습니다, 당신은 촘촘한로 변환해야한다 (당신의 선택은이 있는지 여부 귀하의 옵션) : the docs에서

>>> X 
<2x3 sparse matrix of type '<type 'numpy.float64'>' 
     with 4 stored elements in Compressed Sparse Row format> 

>>> scipy.spatial.KDTree(X.todense()) 
<scipy.spatial.kdtree.KDTree object at 0x34d1e10> 
>>> scipy.spatial.distance.pdist(X.todense(),'euclidean') 
array([ 6.55743852]) 

둘째 :

Efficient brute-force neighbors searches can be very competitive for small data samples. However, as the number of samples N grows, the brute-force approach quickly becomes infeasible.

'ball_tree'알고리즘을 사용하여 데이터를 처리 할 수 ​​있는지 확인해보십시오. 귀하의 코멘트에서

+0

원래 공 트리를 시도했지만 무차별 대입 알고리즘으로 되돌려 야한다는 경고가있었습니다. 이 차원의 행렬에서 스파 스 거리 행렬을 실제로 계산할 수있는 파이썬 기반 메소드를 알고 계십니까? – user2694306

+3

@ user2694306 당신의 ** 유클리드 거리 매트릭스는 밀도가 높아야합니다 (아마도 제로 값이없는 것 같습니다), 74 Gb 이상의 메모리를 확장해야합니다. 나는 그것이 가능하다는 것을 전혀 의심하지 않는다. – alko

0

:

Since it is a sparse matrix, I would expect there to be solutions to intelligently calculate the distances and store the result in a similarly sparse matrix.

기본 수학은 유클리드 거리 만 제로이 정확히 동일한 포인트 (이 때문에이, 당신의 입력 행렬이 중복의 거대한 숫자가 들어있는 경우에만 가능하다는 것을 보여줍니다 실제로는 axioms of distance 중 하나입니다. 중복을 제거하면 작동 할 수 있습니다.

문제에 따라 sklearn.metrics.pairwise_distances_argmin_min 또는 코사인 유사도 X * X.T (유클리드 거리와 반대 순서 임)을 사용할 수 있습니다.

관련 문제