Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算在numpy数组中工作,但在numpy矩阵中不工作_Python_Arrays_Numpy_Matrix - Fatal编程技术网

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)