python - 计算适用于 numpy 数组,但不适用于 numpy 矩阵

标签 python arrays numpy matrix

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)

这段代码是一个基本的神经网络。当我使用 asarray 转换训练集时,它效果很好,但它本身不适用于矩阵。矩阵似乎无法计算 sigmoid_derivative,终端显示 ValueError: Shapes (4,1) and (4,1) notaligned: 1 (dim 1) != 4 (dim 0)

为什么矩阵在代码中不起作用?

最佳答案

错误出现在

 x * (1 - x)

表达式。 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乘积。

关于python - 计算适用于 numpy 数组,但不适用于 numpy 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42358737/

相关文章:

php - 在数组中协商数组

javascript - 如何循环对象数组来求解简单的求和

python - 如何检查字符串中的第 n 个字符,然后在新列 Python 中更新

python - 在 numpy 数组中查找平均值最高的行

python - 从命令行强制 TensorFlow-GPU 使用 CPU

python - 在python中使用全局变量

javascript - Chromium 不会复制数组值

python - Pycharm调试器无法启动: finished with exit code -1073741819 (0xC0000005)

python - 如何获取 Distutils compile() 函数使用的实际命令?

python - 不使用 for 循环构建 numpy 数组