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을 시도했지만 동일한 오류가 발생합니다.
어떻게 해결할 수 있습니까?
'fit_predict (tfidf [idxs]) '에'idxs'가 무엇입니까? tfidf의 일부 값만 사용하고 있습니까? –
'idxs' 인덱스 목록 (예, tfidf의 일부 값만 사용하고 있습니다 - 총 163k 문서가 있지만 ~ 107k 만 사용하고 있습니다) – Parzival
scipy 및 scikit 버전을 업데이트 해 보셨습니까? ? –