математическая формула в python не работает

#python #python-3.x #numpy

#python #python-3.x #numpy

Вопрос:

Я изучал машинное обучение на python и в настоящее время изучаю основы. Сейчас я изучаю линейную регрессию и пытаюсь внедрить некоторые математические формулы в код python. Мне удалось успешно написать несколько формул, но есть одна, с которой мне трудно справиться: (X — Xmeans) * (Y — Ymeans) При попытке ее распечатать я всегда выдаю сообщение об ошибке «индексы списка должны быть целыми или фрагментами, а не numpy.float64».

Я пытался искать одинаковые случаи и их решения в Интернете, но ни один из них не сработал.

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


  

Ответ №1:

Вам действительно следует просто использовать встроенные операции numpy и векторизованные операции, когда это возможно.

Попробуйте что-то вроде этого:

 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. Обычно, когда вы используете numpy, вы хотите держаться подальше от циклов. Большинство операций с массивами numpy выполняются быстрее и проще с использованием встроенных или векторизованных операций (это не всегда так, но это хорошее обобщение, которым нужно руководствоваться, когда вы начинаете).

Ответ №2:

Вместо

 for i in X_minus_X_means and y_minus_y_means:
  

попробуйте написать

 for i in range(len(X_minus_X_means)):
  

в противном i случае не является целым числом и не может использоваться в качестве индекса

Ответ №3:

Возможно, при делении float получается a, из-за чего индекс становится нецелым?

 X_means = sum(X_positions) / len(X_positions)
  

Для целочисленного деления в python3 доступен оператор двойной косой черты // :

 X_means = sum(X_positions) // len(X_positions)
  

Вы также можете использовать ceil , floor , round , или int(val) .

Ответ №4:

оба X_minus_X_means и y_minus_y_means являются списком

y_minus_y_means содержит значение

 [-1.4000000000000004,
 -0.40000000000000036,
 0.5999999999999996,
 -0.40000000000000036,
 1.5999999999999996]
  

таким образом, в основном внутреннее for i in X_minus_X_means and y_minus_y_means: значение i вычисляемого в operation — это of type numpy.float64 и внутри цикла, вы получаете доступ к значению X_minus_X_means и y_minus_y_means используете index , которое является i float значением

Ответ №5:

Хотя я полностью поддерживаю и предпочитаю векторизованные операции, я думаю, вам следует знать о вызываемой функции zip , которая полезна в ситуациях, когда вы выполняете итерацию по двум (или более) спискам параллельно. Итак, в вашем случае проблемная часть должна быть изменена на следующую, избегая любого индекса 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)