web-dev-qa-db-fra.com

Les tableaux utilisés comme index doivent être de type entier (ou booléen)

Les erreurs sont comme ceci:

Traceback (most recent call last):
  File "NearestCentroid.py", line 53, in <module>
    clf.fit(X_train.todense(),y_train)
  File "/usr/local/lib/python2.7/dist-packages/scikit_learn-0.13.1-py2.7-linux-i686.Egg/sklearn/neighbors/nearest_centroid.py", line 115, in fit
    variance = np.array(np.power(X - self.centroids_[y], 2))
IndexError: arrays used as indices must be of integer (or boolean) type

Les codes sont comme ça:

distancemetric=['euclidean','l2']
for mtrc in distancemetric:
for shrkthrshld in [None]:
#shrkthrshld=0
#while (shrkthrshld <=1.0):
    clf = NearestCentroid(metric=mtrc,shrink_threshold=shrkthrshld)
    clf.fit(X_train.todense(),y_train)
    y_predicted = clf.predict(X_test.todense())

J'utilise le package scikit-learn, X-train, y_train sont au format LIBSVM, X est la fonction: paire de valeurs, y_train est la cible/le libellé, X_train est au format matriciel CSR, le shrink_threshold ne prend pas en charge la matrice CSR creuse, alors j'ajoute .todense() à X_train, alors j'ai eu cette erreur, quelqu'un pourrait-il m'aider à résoudre ce problème? Merci beaucoup!

10
user1710418

J'ai eu un problème similaire en utilisant le pystruct.learners.OneSlackSSVM Pystruct.

Cela s’est produit parce que mes étiquettes de formation étaient des flottants, au lieu d’entiers. Dans mon cas, c’est parce que j’ai initialisé les étiquettes avec np.ones, sans spécifier dtype = np.int8. J'espère que ça aide.

22
FaXilifresh

Il arrive assez souvent qu'un tableau d'indexation soit clairement du type integer de la façon dont il a été créé, mais dans le cas d'une liste vide passée, devient par défaut float, un cas qui pourrait ne pas être considéré par le programmeur. Par exemple:

>>> np.array(xrange(1))
>>> array([0])                #integer type as expected
>>> np.array(xrange(0))
>>> array([], dtype=float64)  #does not generalize to the empty list

Par conséquent, il convient de toujours définir explicitement le dtype dans le constructeur du tableau.

3
Radio Controlled

Parfois, vos données sont en entier et tout est correct, mais c'est ce qui est arrivé car l'une de vos séries de données est un tableau vide. Vous pouvez donc utiliser cette condition:

if len(X_train.todense())> 0:
0
yasi