Python广告数据挖掘与分析实战
上QQ阅读APP看书,第一时间看更新

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]])

矩阵转置的情况非常多,有时候我们不得不通过矩阵转置的方式来得到我们想要的矩阵形式,从而进行后续的计算。