Python 计算在numpy数组中工作,但在numpy矩阵中不工作
这段代码是一个基本的神经网络。当我使用Python 计算在numpy数组中工作,但在numpy矩阵中不工作,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,这段代码是一个基本的神经网络。当我使用asarray转换训练集时,它工作得很好,但它本身不工作。似乎矩阵无法计算sigmoid_导数,端子显示ValueError:形状(4,1)和(4,1)未对齐:1(尺寸1)!=4(尺寸0) 为什么矩阵在代码中不起作用?错误在 from numpy import exp, array, random, dot, matrix, asarray class NeuralNetwork(): def __init__(self): ra
asarray
转换训练集时,它工作得很好,但它本身不工作。似乎矩阵无法计算sigmoid_导数,端子显示ValueError:形状(4,1)和(4,1)未对齐:1(尺寸1)!=4(尺寸0)
为什么矩阵在代码中不起作用?错误在
from numpy import exp, array, random, dot, matrix, asarray
class NeuralNetwork():
def __init__(self):
random.seed(1)
self.synaptic_weights = 2 * random.random((3, 1)) - 1 # init weight from -1 to 1
def __sigmoid(self, x):
return 1 / (1 + exp(-x))
def __sigmoid_derivative(self, x):
return x * (1 - x)
def train(self, train_input, train_output, iter):
for i in range(iter):
output = self.think(train_input)
error = train_output - output
adjustment = dot(train_input.T, error * self.__sigmoid_derivative(output))
self.synaptic_weights += adjustment
def think(self, inputs):
return self.__sigmoid(dot(inputs, self.synaptic_weights))
neural_network = NeuralNetwork()
train = matrix([[0, 0, 1, 0],[1, 1, 1, 1],[1, 0, 1, 1],[0, 1, 1, 0]])
train_input = asarray(train[:, 0:3])
train_output = asarray(train[:,3])
neural_network.train(train_input, train_output, 10000)
表情<代码>x为(4,1)形状。使用数组元素对元素的乘法,这个x*(1-x)
工作正常,返回另一个(4,1)结果
但是如果x
是一个(4,1)矩阵,那么*
是矩阵积,对于数组也是一样的np.dot
。这需要一个(4,1)*(1,4)=>(4,4)或一个(1,4)*(4,1)=>(1,1)。对于矩阵积,您已经使用了dot
,因此此导数显然是元素级导数
如果您看到使用
np.matrix
的机器学习代码,它可能基于较旧的示例,并保留matrix
以实现向后兼容性。最好使用array
,并根据需要使用dot
产品。np.matrix
是np.array
(ndarray)的一个子类,看起来有点像MATLAB矩阵。它始终是2d,并使用*
作为点
产品。如果您真的不需要使用它,请坚持使用array。是
x*(1-x)`元素对元素的乘积,或矩阵(点)积。除非x
是正方形,否则它将出现维数问题。因为matrix
将尝试使用矩阵乘法而不是元素乘法?
x * (1 - x)