2017-03-01 7 views
6

scikit-learn의 DBSCAN 구현을 사용하여 여러 문서를 클러스터링하려고합니다. 먼저 scikit-learn의 TfidfVectorizer (numpy.float64 유형의 163405x13029 드문 드문 한 행렬)를 사용하여 TF-IDF 행렬을 만듭니다. 그런 다음이 행렬의 특정 하위 집합을 클러스터하려고합니다. 하위 집합이 작을 때 (예 : 최대 수천 행) 문제가 해결됩니다. 그러나 큰 수의 하위 집합 (수만 행)을 사용하면 ValueError: could not convert integer scalar이됩니다.DBSCAN을 사용할 때 "정수 스칼라를 변환 할 수 없습니다"오류가 발생했습니다.

여기에 전체 역 추적의 (idxs는 인덱스의 목록입니다) : 나는 파이썬 3.4.3를 사용하고 있습니다


ValueError      Traceback (most recent call last) 
<ipython-input-1-73ee366d8de5> in <module>() 
    193  # use descriptions to clusterize items 
    194  ncm_clusterizer = DBSCAN() 
--> 195  ncm_clusterizer.fit_predict(tfidf[idxs]) 
    196  idxs_clusters = list(zip(idxs, ncm_clusterizer.labels_)) 
    197  for e in idxs_clusters: 

/usr/local/lib/python3.4/site-packages/sklearn/cluster/dbscan_.py in fit_predict(self, X, y, sample_weight) 
    294    cluster labels 
    295   """ 
--> 296   self.fit(X, sample_weight=sample_weight) 
    297   return self.labels_ 

/usr/local/lib/python3.4/site-packages/sklearn/cluster/dbscan_.py in fit(self, X, y, sample_weight) 
    264   X = check_array(X, accept_sparse='csr') 
    265   clust = dbscan(X, sample_weight=sample_weight, 
--> 266      **self.get_params()) 
    267   self.core_sample_indices_, self.labels_ = clust 
    268   if len(self.core_sample_indices_): 

/usr/local/lib/python3.4/site-packages/sklearn/cluster/dbscan_.py in dbscan(X, eps, min_samples, metric, algorithm, leaf_size, p, sample_weight, n_jobs) 
    136   # This has worst case O(n^2) memory complexity 
    137   neighborhoods = neighbors_model.radius_neighbors(X, eps, 
--> 138               return_distance=False) 
    139 
    140  if sample_weight is None: 

/usr/local/lib/python3.4/site-packages/sklearn/neighbors/base.py in radius_neighbors(self, X, radius, return_distance) 
    584    if self.effective_metric_ == 'euclidean': 
    585     dist = pairwise_distances(X, self._fit_X, 'euclidean', 
--> 586           n_jobs=self.n_jobs, squared=True) 
    587     radius *= radius 
    588    else: 

/usr/local/lib/python3.4/site-packages/sklearn/metrics/pairwise.py in pairwise_distances(X, Y, metric, n_jobs, **kwds) 
    1238   func = partial(distance.cdist, metric=metric, **kwds) 
    1239 
-> 1240  return _parallel_pairwise(X, Y, func, n_jobs, **kwds) 
    1241 
    1242 

/usr/local/lib/python3.4/site-packages/sklearn/metrics/pairwise.py in _parallel_pairwise(X, Y, func, n_jobs, **kwds) 
    1081  if n_jobs == 1: 
    1082   # Special case to avoid picklability checks in delayed 
-> 1083   return func(X, Y, **kwds) 
    1084 
    1085  # TODO: in some cases, backend='threading' may be appropriate 

/usr/local/lib/python3.4/site-packages/sklearn/metrics/pairwise.py in euclidean_distances(X, Y, Y_norm_squared, squared, X_norm_squared) 
    243   YY = row_norms(Y, squared=True)[np.newaxis, :] 
    244 
--> 245  distances = safe_sparse_dot(X, Y.T, dense_output=True) 
    246  distances *= -2 
    247  distances += XX 

/usr/local/lib/python3.4/site-packages/sklearn/utils/extmath.py in safe_sparse_dot(a, b, dense_output) 
    184   ret = a * b 
    185   if dense_output and hasattr(ret, "toarray"): 
--> 186    ret = ret.toarray() 
    187   return ret 
    188  else: 

/usr/local/lib/python3.4/site-packages/scipy/sparse/compressed.py in toarray(self, order, out) 
    918  def toarray(self, order=None, out=None): 
    919   """See the docstring for `spmatrix.toarray`.""" 
--> 920   return self.tocoo(copy=False).toarray(order=order, out=out) 
    921 
    922  ############################################################## 

/usr/local/lib/python3.4/site-packages/scipy/sparse/coo.py in toarray(self, order, out) 
    256   M,N = self.shape 
    257   coo_todense(M, N, self.nnz, self.row, self.col, self.data, 
--> 258      B.ravel('A'), fortran) 
    259   return B 
    260 

ValueError: could not convert integer scalar 

(레드햇)에, 0.18.1 scipy, 그리고 scikit 배우기 0.18.1.

here 제안 된 원숭이 패치를 시도했지만 작동하지 않았습니다.

주위를 검색하다면 다른 유형의 희소 행렬 (예 : csr)에 대해 동일한 문제가 분명히 해결되었지만 coo는 해결되지 않은 것으로 나타났습니다.

here으로 제안 된 바와 같이 DBSCAN에 특성 반경 대신 희소 반경 그래프를 넣으려고 시도했지만 동일한 오류가 발생합니다.

나는 HDBSCAN을 시도했지만 동일한 오류가 발생합니다.

어떻게 해결할 수 있습니까?

+0

'fit_predict (tfidf [idxs]) '에'idxs'가 무엇입니까? tfidf의 일부 값만 사용하고 있습니까? –

+0

'idxs' 인덱스 목록 (예, tfidf의 일부 값만 사용하고 있습니다 - 총 163k 문서가 있지만 ~ 107k 만 사용하고 있습니다) – Parzival

+0

scipy 및 scikit 버전을 업데이트 해 보셨습니까? ? –

답변

3

구현이 허용하는 경우에도 DBSCAN은 매우 높은 차원의 데이터 (차원의 저주로 인해 통계적 관점에서)에 나쁜 결과를 초래할 수 있습니다.

대신에 TruncatedSVD 클래스를 사용하여 TF-IDF 기능 벡터의 크기를 50 또는 100 구성 요소로 축소 한 다음 결과에 DBSCAN을 적용하는 것이 좋습니다.