官术网_书友最值得收藏!

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

矩陣轉置的情況非常多,有時候我們不得不通過矩陣轉置的方式來得到我們想要的矩陣形式,從而進行后續的計算。

主站蜘蛛池模板: 阿拉善盟| 新晃| 察隅县| 乃东县| 双峰县| 公安县| 横峰县| 扎兰屯市| 河津市| 宁都县| 乌拉特前旗| 博野县| 搜索| 彭阳县| 涪陵区| 灌云县| 台江县| 酒泉市| 基隆市| 安陆市| 深圳市| 肇源县| 甘南县| 高邮市| 中山市| 博罗县| 海淀区| 栾川县| 汶川县| 老河口市| 特克斯县| 平顺县| 襄汾县| 临武县| 油尖旺区| 长丰县| 文昌市| 谢通门县| 萝北县| 霍山县| 梁山县|