математическая формула в Python не работает - PullRequest
1 голос
/ 15 апреля 2019

Я изучаю машинное обучение на 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])


Ответы [ 5 ]

3 голосов
/ 15 апреля 2019

Вы должны просто использовать встроенные операции 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 голос
/ 15 апреля 2019

Вместо

for i in X_minus_X_means and y_minus_y_means:

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

for i in range(len(X_minus_X_means)):

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

0 голосов
/ 20 апреля 2019

Хотя я полностью поддерживаю и предпочитаю векторизованные операции, я думаю, вы должны знать о функции, называемой 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)
0 голосов
/ 15 апреля 2019

оба 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, вычисленное в операции, имеет значение type numpy.float64 и внутри цикла, вы получаете доступ к значениям X_minus_X_means и y_minus_y_means, используя index, то есть i a float значение

0 голосов
/ 15 апреля 2019

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

X_means = sum(X_positions) / len(X_positions)

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...