2017-03-01 7 views
6

का उपयोग करते समय मैं दस्तावेज़ों का एक समूह क्लस्टर करने के लिए scikit-learn's DBSCAN कार्यान्वयन का उपयोग करने का प्रयास कर रहा हूं। सबसे पहले मैं विज्ञान-सीखने के TfidfVectorizer का उपयोग कर टीएफ-आईडीएफ मैट्रिक्स बना देता हूं (यह 163405x13029 प्रकार numpy.float64 प्रकार का स्पैर मैट्रिक्स है)। फिर मैं इस मैट्रिक्स के विशिष्ट उप-समूह को क्लस्टरनाइज़ करने का प्रयास करता हूं। चीजें ठीक काम करती हैं जब सबसेट छोटा होता है (कहें, कुछ हजार पंक्तियों तक)। लेकिन बड़े सबसेट्स (हजारों पंक्तियों के साथ) मुझे ValueError: could not convert integer scalar मिलता है।"पूर्णांक स्केलर को परिवर्तित नहीं कर सका" त्रुटि DBSCAN

यहाँ पूर्ण ट्रैस है (idxs एक सूचकांक की सूची है):


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 

मैं अजगर 3.4.3 का उपयोग कर रहा (रेड हैट पर) scipy 0.18.1, और, scikit सीखने 0.18.1।

मैंने बंदर पैच को here का सुझाव दिया लेकिन यह काम नहीं किया।

चारों ओर गुगल करने के लिए मुझे bugfix मिला जो स्पष्ट रूप से अन्य प्रकार के स्पैर मैट्रिस (जैसे सीएसआर) के लिए एक ही समस्या हल करता है, लेकिन कॉओ के लिए नहीं।

मैंने here सुझाए गए अनुसार डीबीएससीएएन को एक स्पैर त्रिज्या पड़ोस ग्राफ (एक फीचर मैट्रिक्स के बजाए) खिलाया है, लेकिन एक ही त्रुटि होती है।

मैंने HDBSCAN को आजमाया है, लेकिन एक ही त्रुटि होती है।

मैं इसे कैसे ठीक कर सकता हूं या इसे बाईपास कर सकता हूं?

+0

'fit_predict (tfidf [idxs]) में' idxs' क्या है। क्या आप tfidf से केवल कुछ मानों का उपयोग कर रहे हैं? –

+0

'idxs 'सूचकांक की एक सूची (हाँ, मैं tfidf से केवल कुछ मानों का उपयोग कर रहा हूं - इसमें कुल ~ 163k दस्तावेज़ हैं, लेकिन मैं उनमें से केवल ~ 107k का उपयोग कर रहा हूं) – Parzival

+0

क्या आपने scipy और scikit संस्करण को अपडेट करने का प्रयास किया है ? –

उत्तर

3

भले ही कार्यान्वयन इसे अनुमति देगा, DBSCAN शायद इस तरह के उच्च आयामी डेटा (सांख्यिकीय दृष्टि से, आयाम के अभिशाप के कारण) पर खराब परिणाम देगा।

इसके बजाय मैं आपको TruncatedSVD कक्षा का उपयोग करने के लिए सलाह देता हूं ताकि आपके टीएफ-आईडीएफ फीचर वैक्टर की आयाम को 50 या 100 घटकों तक कम किया जा सके और फिर परिणामों पर DBSCAN लागू किया जा सके।

संबंधित मुद्दे