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