2016-06-28 95 views
1

我想培养出KD-树上的文档语料库的TFIDF但它给ValueError异常:设置一个数组元素与序列而训练KD树TFIDF

ValueError: setting an array element with a sequence. 

代码和错误描述如下。有人可以帮我找出问题吗?

代码:

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

相关问题