J'ai appris le machine learning en python et j'étudie actuellement les bases. J'étudie maintenant la régression linéaire et j'essaye d'implémenter des formules mathématiques dans le code python. J'ai réussi à écrire des formules avec succès mais il y a celle avec laquelle j'ai du mal: (X - Xmeans) * (Y - Ymeans) Cela me donne toujours une erreur "Les index de liste doivent être des entiers ou des tranches, pas numpy.float64" lorsque j'essaye de l'imprimer.
J'ai essayé de rechercher les mêmes cas et leurs solutions sur le Web, mais aucun d'entre eux a fonctionné.
import numpy
import matplotlib.pyplot as plt
X_positions = numpy.array([2,3,4,5,6])
y_positions = numpy.array([4,5,6,5,7])
plt.plot([X_positions], [y_positions], 'ro')
plt.axis([0,10,0,10])
X_means = sum(X_positions) / len(X_positions)
y_means = sum(y_positions) / len(y_positions)
plt.plot([X_means], [y_means], 'go')
plt.axis([0,10,0,10])
X_minus_X_means = []
y_minus_y_means = []
X_minus_X_means_squared = []
for i in X_positions:
X_minus_X_means.append(i - X_means)
for i in y_positions:
y_minus_y_means.append(i - y_means)
for i in X_minus_X_means:
X_minus_X_means_squared.append(i ** 2)
X_minus_X_means_times_y_minus_y_means = []
#HERE IS THE PROBLEM
for i in X_minus_X_means and y_minus_y_means:
X_minus_X_means_times_y_minus_y_means.append(X_minus_X_means[i] * y_minus_y_means[i])
5 Réponses :
Peut-être que la division produit un float qui fait que l'index n'est pas un entier?
X_means = sum(X_positions) // len(X_positions)
Pour la division entière en python3, l'opérateur double barre oblique // est disponible:
X_means = sum(X_positions) / len(X_positions)
Vous pouvez également utiliser ceil , floor , round , ou int(val).
Au lieu de
for i in range(len(X_minus_X_means)):
essayez d'écrire
for i in X_minus_X_means and y_minus_y_means:
sinon i n'est pas un entier et ne peut pas être utilisé comme index
Vous devriez vraiment utiliser les opérations numpy intégrées et les opérations vectorisées lorsque cela est possible.
Essayez quelque chose comme ceci:
import numpy as np import matplotlib.pyplot as plt X_positions = np.array([2,3,4,5,6]) y_positions = np.array([4,5,6,5,7]) plt.plot([X_positions], [y_positions], 'ro') plt.axis([0,10,0,10]) X_means = X_positions.mean() y_means = y_positions.mean() plt.plot([X_means], [y_means], 'go') plt.axis([0,10,0,10]) X_minus_X_means = X_positions-X_means y_minus_y_means = y_positions-y_means X_minus_X_means_squared = X_minus_X_means**2 X_minus_X_means_times_y_minus_y_means = X_minus_X_means*y_minus_y_means
Habituellement, lorsque vous utilisez numpy, vous souhaitez éviter les boucles. La plupart des opérations sur les tableaux numpy sont plus rapides et plus faciles à l'aide d'opérations intégrées ou vectorisées (ce n'est pas toujours le cas, mais une généralisation solide à suivre lorsque vous commencez).
les deux X_minus_X_means et y_minus_y_means sont des listes
y_minus_y_means contiennent une valeur
[-1.4000000000000004, -0.40000000000000036, 0.5999999999999996, -0.40000000000000036, 1.5999999999999996]
donc fondamentalement à l'intérieur de for i dans X_minus_X_means et y_minus_y_means: la valeur de i calculée en opération est de type numpy.float64 et à l'intérieur de la boucle, vous êtes accès à la valeur de X_minus_X_means et y_minus_y_means en utilisant index qui est i une valeur de float
Bien que je supporte et préfère complètement les opérations vectorisées, je pense que vous devriez connaître la fonction appelée zip qui est utile dans les situations où vous itérez sur deux (ou plus) listes en parallèle. Donc dans votre cas, la partie problématique doit être changée en la suivante en évitant tout index i
for x, y in zip(X_minus_X_means, y_minus_y_means):
X_minus_X_means_times_y_minus_y_means.append(x * y)