2015-03-03 1 views
1

Я сталкиваюсь с некоторыми проблемами при использовании метода pearsonr из SciPy. Я старался держать его как можно проще (обратите внимание на великолепный цикл N^2), но все же я сталкиваюсь с этой проблемой. Я не совсем понимаю, где я ошибаюсь. мои массивы выбираются правильно и имеют одинаковую размерность.SciPy PearsonR ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()

Код я бегу это:

from scipy import stats 
from sklearn.preprocessing import LabelBinarizer, Binarizer 
from sklearn.feature_extraction.text import CountVectorizer 

ny_cluster = LabelBinarizer().fit_transform(ny_raw.clusterid.values) 
ny_vocab = Binarizer().fit_transform(CountVectorizer().fit_transform(ny_raw.text.values)) 

ny_vc_phi = np.zeros((ny_vocab.shape[1], ny_cluster.shape[1])) 
for i in xrange(ny_vc_phi.shape[0]): 
    for j in xrange(ny_vc_phi.shape[1]): 
     ny_vc_phi[i,j] = stats.pearsonr(ny_vocab[:,i].todense(), ny_cluster[:,j])[0] 

Которая производит ошибку:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
/data/TweetClusters/TweetsLocationBayesClf/<ipython-input-29-ff1c3ac4156d> in <module>() 
     3 for i in xrange(ny_vc_phi.shape[0]): 
     4  for j in xrange(ny_vc_phi.shape[1]): 
----> 5   ny_vc_phi[i,j] = stats.pearsonr(ny_vocab[:,i].todense(), ny_cluster[:,j])[0] 
     6 

/usr/lib/python2.7/dist-packages/scipy/stats/stats.pyc in pearsonr(x, y) 
    2201  # Presumably, if abs(r) > 1, then it is only some small artifact of floating 

    2202  # point arithmetic. 

-> 2203  r = max(min(r, 1.0), -1.0) 
    2204  df = n-2 
    2205  if abs(r) == 1.0: 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Я действительно не понимаю, где этот выбор происходит. Конечно, это не помогает, я не знаю, как вычисляется r-переменная. Может быть, я как-то испортил свои материалы?

ответ

5

Проверьте, что аргументы pearsonr являются одномерные массивов. То есть, как ny_vocab[:,i].todense(), так и ny_cluster[:,j] должно быть 1-й. Попробуйте:

ny_vc_phi[i,j] = stats.pearsonr(ny_vocab[:,i].todense().ravel(), ny_cluster[:,j].ravel())[0] 

(я добавил вызов ravel() к каждому из аргументов pearsonr.)

+1

Это было очень близко к моему решению, поэтому я маркировки как ответил. Для любого, кто задавался вопросом, я использовал разреженную матрицу, поэтому был включен массив, который нужно было включить. Для любого, кто задавался вопросом, строка verbatim была 'ny_vc_phi [i, j] = stats.pearsonr (np.squeeze (np.asarray (ny_vocab [:, i] .todense())), ny_cluster [:, j]) [0 ] ' –

+0

Я собирался отредактировать вопрос и предложить« сжать »в качестве альтернативы, если проблема была просто« тривиальным »измерением, но вы избили меня. :-) –

Смежные вопросы

 Смежные вопросы