将R多层感知器转Python时矩阵乘法结果不一致的问题
问题原因与解决方法
嘿,这个问题的核心其实是R和NumPy在矩阵创建时的元素填充顺序差异——R默认采用**列优先(Fortran顺序)填充,而NumPy默认采用行优先(C顺序)**填充!
1. 拆解R中hidden矩阵的实际结构
你在R里创建hidden的代码是:
hidden <- matrix(c(-0.4442772, -0.1844143, 0.2783537, 0.2599441, -0.3190043, 0.2062185), nrow=2, ncol=3)
R会把传入的向量按列依次填充到矩阵中,所以实际的hidden矩阵是:
[,1] [,2] [,3] [1,] -0.4442772 0.2783537 -0.3190043 [2,] -0.1844143 0.2599441 0.2062185
2. 对比你Python中的hidden矩阵
你在Python里写的hidden是按行直接定义的:
hidden = np.asmatrix([[-0.4442772, -0.1844143, 0.2783537], [0.2599441, -0.3190043, 0.2062185]])
这个矩阵的结构和R里的hidden完全不同,自然矩阵乘法的结果就不一致了!
3. 在Python中得到和R一致结果的两种方法
方法一:手动匹配R的矩阵行结构
直接按照R中hidden的行内容来定义Python矩阵:
import numpy as np Xp = np.array([0, 1, 1]) hidden = np.asmatrix([[-0.4442772, 0.2783537, -0.3190043], [-0.1844143, 0.2599441, 0.2062185]]) print(np.dot(hidden, Xp))
输出结果:
matrix([[-0.0406506], [0.4661626]])
和R的结果完全一致。
方法二:用NumPy的列优先顺序创建矩阵
使用和R相同的元素向量,通过reshape时指定order='F'(模拟R的列优先填充):
import numpy as np Xp = np.array([0, 1, 1]) # 用R的原始元素向量,按列优先reshape成2行3列矩阵 hidden = np.asmatrix(np.array([-0.4442772, -0.1844143, 0.2783537, 0.2599441, -0.3190043, 0.2062185]).reshape(2, 3, order='F')) print(np.dot(hidden, Xp))
同样能得到和R一致的结果。
4. 为什么第二组测试结果一致?
因为你在第二组测试中,Python定义的m1刚好和R按列填充后的m1结构完全匹配!
R中m1 <- matrix(c(2,3,4,7,0,1), nrow=3, ncol=2)按列填充后是:
[,1] [,2] [1,] 2 7 [2,] 3 0 [3,] 4 1
而你Python里写的m1 = np.matrix([[2,7], [3,0], [4,1]])完全对应这个结构,所以矩阵乘法结果自然一致。
内容的提问来源于stack exchange,提问作者Aipi
相关产品推荐
相关产品推荐

