2016-06-28 7 views
1

に関する研修KDツリーながら順序で配列要素を設定します説明は以下の通りです。誰かが問題を理解するのを助けることができますか?とValueError:私は文書コーパスのTFIDFにKD-ツリーを訓練しようとしていますが、それは</p> <pre><code>ValueError: setting an array element with a sequence. </code></pre> <p>コードとエラーになりますTFIDF

コード:

t0 = time.time() 
count_vect = CountVectorizer() 
X_train_counts = count_vect.fit_transform(X) 

tfidf_transformer = TfidfTransformer() 
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts) 

t1 = time.time() 
total = t1-t0 
print "TF-IDF built:", total 

#######################------------------------############################ 

t0 = time.time() 
#nbrs = NearestNeighbors(n_neighbors=20, algorithm='kd_tree', metric='euclidean') 
#nbrs.fit(X_train_tfidf)#,Y) 
nbrs = KDTree(np.array(X_train_tfidf), leaf_size=100) 


t1 = time.time() 
total = t1-t0 
print "KNN Trained:", total 

#######################------------------------############################ 

これはエラーです:

TF-IDF built: 0.108999967575 
Traceback (most recent call last): 
    File ".\tfidf_knn.py", line 48, in <module> 
    nbrs = KDTree(np.array(X_train_tfidf), leaf_size=100) 
    File "sklearn/neighbors/binary_tree.pxi", line 1055, in sklearn.neighbors.kd_tree.BinaryTree.__init__ (sklearn\neighbo 
rs\kd_tree.c:8298) 
    File "C:\Anaconda2\lib\site-packages\numpy\core\numeric.py", line 474, in asarray 
    return array(a, dtype, copy=False, order=order) 
ValueError: setting an array element with a sequence. 

答えて

2

X_train_tfidfは疎行列(scipy.sparse)で、numpyの配列に変換するために、あなたは何をする必要があります。 toarray()。この例では私のために実行します。

印刷
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer 
import time 
from sklearn.neighbors import KDTree 
from scipy.sparse import csr_matrix # sparse format compatible with sklearn models 
from sklearn.neighbors import NearestNeighbors 


import numpy as np 
X=[ 'I Love dogs' , 
'you love cats', 
' He loves Birds', 
' she loves lizards', 
' None loves me' 
] 
t0 = time.time() 
count_vect = CountVectorizer() 
X_train_counts = count_vect.fit_transform(X) 

tfidf_transformer = TfidfTransformer() 
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts) 

t1 = time.time() 
total = t1-t0 
print "TF-IDF built:", total 

#######################------------------------############################ 

t0 = time.time() 
nbrs = KDTree(X_train_tfidf.toarray(), leaf_size=100) 

################## for sparse input we cannot use kdtree, but we can use brute ################# 
#nbrs = NearestNeighbors(n_neighbors=20, algorithm='kd_tree') 
#nbrs.fit(csr_matrix(X_train_tfidf))#,Y) 


t1 = time.time() 
total = t1-t0 
print "KNN Trained:", total 

:助けを

TF-IDF built: 0.00499987602234 
KNN Trained: 0.029000043869 
+0

感謝を!しかし、それは小さなデータにも役立ちましたが、それは大きな配列を与えます---私が "toarray()"を実行した後、行列はもはや疎ではないので、メモリを取り戻します。 KDTreeに疎な行列を与える方法はありますか? – user3667569

+0

ねえ。私の編集を参照してください。スパース入力ではkd_treeを使用することはできませんが、メソッドをブルートに変更することはできます。結果はそれほど異なってはいけません。また、あなたの疎な行列をsklearnモデルとより互換性のある別の形式(csr_matrix)に変換する必要があります。 – kazAnova

関連する問題

 関連する問題