1
votes

la formule mathématique en python ne fonctionne pas

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])



0 commentaires

5 Réponses :


0
votes

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).


0 commentaires

1
votes

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


0 commentaires

3
votes

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


1 commentaires

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).



0
votes

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


0 commentaires

0
votes

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)


0 commentaires