機器學習的數(shù)學 之python矩陣運算
本文提綱
1. 什么是矩陣
2. 矩陣在現(xiàn)實應用場景
3. 矩陣表示
4. 矩陣運算
5. 理解矩陣乘法
一、 什么是矩陣
一個 m × n 的矩陣是一個由 m 行 n 列元素排列成的矩形陣列。以下是一個由 6 個數(shù)字元素構(gòu)成的 2 行 3 列的矩陣:
矩陣屬于線性代數(shù)數(shù)學分支。線性代數(shù)是關(guān)于向量空間和線性映射的一個數(shù)學分支。它包括對線、面和子空間的研究,同時也涉及到所有的向量空間的一般性質(zhì)。表面上,排成矩形的數(shù)字就是個矩陣。實際,矩陣是有限維線性空間的線性變換的表示形式。它代表著空間到空間的映射。
二、 矩陣在現(xiàn)實應用場景
在程序中,配合矩陣模擬真實數(shù)據(jù),并可以實現(xiàn)如下功能:二維圖形變換、人臉變換、人臉識別、信息轉(zhuǎn)換等。比如一張圖片,簡單的黑白圖只有黑色和白色構(gòu)成,是不是可以有 1 0 兩個數(shù)值的二維矩陣來表示呢?自然,尤其在圖像處理里面,圖像信息是用二維矩陣數(shù)據(jù)。
矩陣分析,是一種方便的計算工具,可以以簡單的形式表達復雜的信息。
三、 矩陣表達式
我們選擇 Python 作為代碼演示案例。利用的是 NumPy 庫。什么是 NumPy?
NumPy 是一個基礎(chǔ)科學的計算包,包含:
- 一個強大的N維數(shù)組對象
- sophisticated (broadcasting) functions
- tools for integrating C/C++ and Fortran code
- 有用的線性代數(shù)、傅立葉轉(zhuǎn)換和隨機數(shù)生成函數(shù)
在代碼中,導入 numpy 函數(shù)。
比如下面展示 1 × 2 和 2 × 2 的矩陣。調(diào)用 shape 方法,可獲取矩陣的大小。同樣,numpy 方便了我們很多操作??梢灾苯觿?chuàng)建全 0 矩陣、全 1 矩陣和單元矩陣。代碼 matrix_exp.py 如下:
- # -*- coding: utf-8 -*-
- # 導入 numpy 函數(shù),以 np 開頭
- import numpy as np
- if __name__ == '__main__':
- mat1 = np.array([1, 3])
- mat1 = np.mat(mat1) # 相當于 np.mat([1,3]), mat 函數(shù)將目標數(shù)據(jù)的類型轉(zhuǎn)換為矩陣(matrix)
- print mat1
- # 1 行 2 列的矩陣(也稱 1 * 2 矩陣)
- # ==> [[1 3]]
- mat2 = np.array([[1, 3], [3, 4]])
- mat2 = np.mat(mat2)
- print mat2
- # 2 * 2 矩陣
- # ==> [[1 3]
- # ==> [3 4]]
- # 獲取矩陣的大小
- print mat1.shape
- print mat2.shape
- mat3 = np.zeros((2, 3)) # 2 * 3 的全 0 矩陣
- mat4 = np.ones((3, 2)) # 3 * 2 的全 1 矩陣
- mat5 = np.identity(3) # 3 * 3 的單元矩陣
- mat6 = np.eye(3, 3, 0) # eye(N, M=None, k=0, dtype=float) 對角線是 1 其余值為 0 的矩陣, k 指定對角線的位置
- print mat3
- print mat4
- print mat5
- print mat6
右鍵,Run 可得到下面結(jié)果:
- [[1 3]]
- [[1 3]
- [3 4]]
- (1, 2)
- (2, 2)
- [[ 0. 0. 0.]
- [ 0. 0. 0.]]
- [[ 1. 1.]
- [ 1. 1.]
- [ 1. 1.]]
- [[ 1. 0. 0.]
- [ 0. 1. 0.]
- [ 0. 0. 1.]]
- [[ 1. 0. 0.]
- [ 0. 1. 0.]
- [ 0. 0. 1.]]
如上注解詳細解釋了方法的使用。
「提示」代碼共享在 GitHub:https://github.com/JeffLi1993/robot-mumu
四、 矩陣運算
矩陣運算包括了加減乘除、轉(zhuǎn)置、逆矩陣、行列式、矩陣的冪、伴隨矩陣等。
矩陣加法、減法、數(shù)量乘法規(guī)則如下:(和向量的運算規(guī)則一樣)
- -A = (-1)A
- A - B = A + (-B)
- 2A + 3B = (2A)+ (3B)
比如下面展示下 矩陣與矩陣相乘、矩陣求逆、轉(zhuǎn)置矩陣及每行或每列求和的運算。代碼 matrix_op.py 如下:
- # -*- coding: utf-8 -*-
- # 導入 numpy 函數(shù),以 np 開頭
- import numpy as np
- if __name__ == '__main__':
- # 矩陣相乘
- mat1 = np.mat([1, 3])
- mat2 = np.mat([[3], [4]])
- mat3 = mat1 * mat2
- print mat3
- # 1 * 2 矩陣乘以 2 * 1 矩陣,得到 1 * 1 矩陣
- # ==> [[15]]
- # 矩陣求逆
- mat4 = np.mat([[1, 0, 1], [0, 2, 1], [1, 1, 1]])
- mat5 = mat4.I # I 對應 getI(self) ,返回可逆矩陣的逆
- print mat5
- # 矩陣的逆
- # ==> [[-1. -1. 2.]
- # ==> [-1. 0. 1.]
- # ==> [ 2. 1. -2.]]
- # 轉(zhuǎn)置矩陣
- mat6 = np.mat([[1, 1, 1], [0, 2, 1], [1, 1, 1]])
- mat7 = mat6.T # I 對應 getT(self) ,返回矩陣的轉(zhuǎn)置矩陣
- print mat7
- # 矩陣的轉(zhuǎn)置矩陣
- # ==> [[1 0 1]
- # ==> [1 2 1]
- # ==> [1 1 1]]
- # 矩陣每一列的和
- sum1 = mat6.sum(axis=0)
- print sum1
- # 矩陣每一行的和
- sum2 = mat6.sum(axis=1)
- print sum2
- # 矩陣所有行列的總和
- sum3 = sum(mat6[1, :])
- print sum3
- # 矩陣與數(shù)組之間的轉(zhuǎn)換
- mat8 = np.mat([[1, 2, 3]])
- arr1 = np.array(mat8) # 矩陣轉(zhuǎn)換成數(shù)組
- print arr1
- arr2 = [1, 2, 3]
- mat9 = np.mat(arr2) # 數(shù)組轉(zhuǎn)換成矩陣
- print mat9
右鍵,Run 可得到下面結(jié)果:
- [[15]]
- [[-1. -1. 2.]
- [-1. 0. 1.]
- [ 2. 1. -2.]]
- [[1 0 1]
- [1 2 1]
- [1 1 1]]
- [[2 4 3]]
- [[3]
- [3]
- [3]]
- [[0 2 1]]
- [[1 2 3]]
- [[1 2 3]]
五、 理解矩陣和向量乘法
從解多元方程組可以看出
【本文為51CTO專欄作者“李強強”的原創(chuàng)稿件,轉(zhuǎn)載請通過51CTO聯(lián)系作者獲取授權(quán)】