我的代码非常简单,但是当我尝试将一个3x 2和2x 1矩阵相乘时,我得到了以下错误(对我来说,这毫无意义):
ValueError: operands could not be broadcast together with shapes (3,2) (2,1)
在这个程序中,我做的第一件事是在域[-1,1] x [-1,1]中随机生成两个点,并使用变量slope
和y_int
定义由这些点组成的直线,然后,我创建形式为{x_0,x_1,x_2}的N个随机x
值,其中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条答案
按热度按时间qyuhtwio1#
您使用的是数组,而不是矩阵。要从数组中获得矩阵乘法,您需要使用
dot()
函数,而不是*
。请参阅本页。当数据位于数组中时,*
运算符是元素级乘法,因此形状必须完全匹配。