Python возвращает ошибку при попытке умножить две матрицы numpy соответствующего размера

мой код довольно прост, но когда я пытаюсь умножить матрицу 3x2 и 2x1, я получаю следующую ошибку (что для меня не имеет смысла):

ValueError: operands could not be broadcast together with shapes (3,2) (2,1)

В этой программе первое, что я делаю, это случайное генерирование двух точек в домене [-1,1] x [-1,1] и определение линии этими точками с использованием переменных slope и y_int. Затем я создаю N случайных значений x формы {x_0, x_1, x_2}, где x_0 всегда 1, а x_1, x_2 - случайным образом сгенерированные числа в диапазоне [-1,1]. Эти значения N содержат код x_matrix в коде.

y_matrix - это классификация каждого из значений x_1,..., x_N. Если x_1 находится справа от случайной строки, указанной slope и y_int, тогда значение y_1 равно +1, а в противном случае -1.

Теперь, когда были указаны теги x_matrix и y_matrix, я просто хочу умножить псевдо-обратное значение x_matrix (pinv_x в коде) на y_matrix. Здесь возникает ошибка. Я нахожусь на своем конце, и я не могу придумать ничего, что могло бы быть неправильным.

Любая помощь приветствуется. Код ниже:

from numpy import *
import random
N = 2
# Determine target function f(x) 
x_1 = [random.uniform(-1,1),random.uniform(-1,1)]
x_2 = [random.uniform(-1,1),random.uniform(-1,1)]
slope = (x_1[1] - x_2[1]) / (x_1[0] - x_2[0])
y_int = x_1[1] - (slope * x_1[0])
# Construct training data. 
x_matrix = array([1, random.uniform(-1,1), random.uniform(-1,1)])
x_on_line = (x_matrix[1] / slope) - (y_int / slope)
if x_matrix[1] >= x_on_line:
 y_matrix = array([1])
else:
 y_matrix = array([-1])
for i in range(N-1):
 x_val = array([1, random.uniform(-1,1), random.uniform(-1,1)])
 x_matrix = vstack((x_matrix, x_val))
 x_on_line = (x_val[1] / slope) - (y_int / slope)
 if x_val[1] >= x_on_line:
 y_matrix = vstack((y_matrix, array([1])))
 else:
 y_matrix = vstack((y_matrix, array([-1])))
pinv_x = linalg.pinv(x_matrix)
print y_matrix
print pinv_x
w = pinv_x*y_matrix
1 ответ

Вы используете массивы, а не матрицы. Чтобы получить матричное умножение из массивов, вам нужно использовать функцию dot(), а не *. См. эту страницу. Оператор * является умножением по элементам, когда данные находятся в массиве, поэтому формы должны точно совпадать.

licensed under cc by-sa 3.0 with attribution.