3.1.4 矩阵运算
在机器学习中用到矩阵运算的情况非常多。值得庆幸的是,Python的NumPy工具包中恰好也提供了矩阵运算的功能。
1.创建矩阵
首先,我们来看如何通过前面的二维数组创建矩阵。二维数组和矩阵在外形上非常相似,但不同的是,数组可以有多维,而矩阵则只能是二维的,由行和列构成。相同数据构成的二维数组和矩阵在Python中主要通过array(数组)和matrix(矩阵)这些关键字来加以区分。
In [91]: data = np.array([[0.9,0.35,0.14,0.46],[0.53,0.78,0.12,0.86]]) In [92]: mat = np.mat(data) In [93]: mat Out[93]: matrix([[0.9 , 0.35, 0.14, 0.46], [0.53, 0.78, 0.12, 0.86]])
可以通过shape属性来查看矩阵的形状:
In [94]: np.shape(mat) Out[94]: (2, 4) In [95]: data0 = np.matrix(np.zeros((4,4))) In [96]: data0 Out[96]: matrix([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) In [97]: data1 = np.matrix(np.ones((4,4))) In [98]: data1 Out[98]: matrix([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]])
这里矩阵zeros/ones函数的参数是一个tuple类型,并且默认是浮点型的数据,如果想要返回int类型的数据,可以使用dtype=int更改数据类型。
这里shape属性中的元组分别表示矩阵的行数和列数,说明mat是一个2行4列的矩阵。np.zeros((4,4))表示创建4×4的全0矩阵,np.ones((4,4))表示创建4×4的全1矩阵。
我们有时还会创建一些随机数矩阵,特别是在进行数据初始化的时候。NumPy中的random模块被广泛用于创建随机数,下面展示由np.random.rand(2,2)先创建一个二维数组,再将其转换成矩阵matrix并输出。
In [99]: data2 = np.matrix(np.random.rand(2,2)) In [100]: data2 Out[100]: matrix([[0.7879823 , 0.4018926 ], [0.14737219, 0.85269316]])
用类似的方法,可以得到一个3×3的0~10之间的随机整数矩阵。
In [101]: data3=np.matrix(np.random.randint(10,size=(3,3))) In [102]: data3 Out[102]: matrix([[9, 7, 5], [5, 5, 4], [4, 4, 9]])
2.常见的矩阵运算
常见的矩阵运算包括矩阵相乘、矩阵点乘和矩阵转置等。
(1)矩阵相乘
In [103]: a1 = np.matrix([1,2]) In [104]: a2 = np.matrix([[1],[2]]) In [105]: a3 = a1*a2 In [106]: a3 Out[106]: matrix([[5]])
可以看到,1×2的矩阵a1乘以2×1的矩阵a2,得到1×1的矩阵a3。这里需要特别说明的是,两个矩阵相乘时,要求前一个矩阵的列数要与后一个矩阵的行数相等才可以,否则就不能进行矩阵相乘。例如1×2的矩阵与3×1的矩阵就不能相乘。
In [107]: a2 = np.matrix([[1],[2],[3]]) In [108]: a3 = a1*a2 --------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-108-2baf151ace19> in <module>() ----> 1 a3 = a1*a2 C:\ProgramData\Anaconda3\lib\site-packages\NumPy\matrixlib\defmatrix.py in __mul__(self, other) 218 if isinstance(other, (N.ndarray, list, tuple)) : 219 # This promotes 1-D vectors to row vectors 220 return N.dot(self, asmatrix(other)) 221 if isscalar(other) or not hasattr(other, '__rmul__') : 222 return N.dot(self, other) ValueError: shapes (1,2) and (3,1) not aligned: 2 (dim 1) != 3 (dim 0)
(2)矩阵点乘
矩阵点乘是指两个矩阵的对应元素相乘。np.multiply是NumPy中自带的乘法(点乘)函数。
In [113]: a1 = np.matrix([2,2]) In [114]: a2 = np.matrix([3,3]) In [115]: a3 = np.multiply(a1,a2) In [116]: a3 Out[116]: matrix([[6, 6]])
另外,如果一个矩阵与标量相乘,也是表示矩阵点乘的意思。
In [117]: a2 = a1*3 In [118]: a2 Out[118]: matrix([[6, 6]])
可以看到,上述两种写法的矩阵点乘结果一致,在实际应用中我们可以根据个人习惯来选择。
(3)矩阵转置
矩阵转置也是我们在数据分析挖掘中常用的功能。矩阵转置是将原矩阵的行转为列,列转为行,常用符号“T”来表示矩阵转置。
In [119]: a1 = np.matrix([[1,1],[0,0]]) In [120]: a1.T Out[120]: matrix([[1, 0], [1, 0]])
矩阵转置的情况非常多,有时候我们不得不通过矩阵转置的方式来得到我们想要的矩阵形式,从而进行后续的计算。