機器學習的數學之 python 矩陣運算
作者:泥瓦匠BYSocket
轉載註明出處
1. 什麼是矩陣
2. 矩陣在現實應用場景3. 矩陣表示4. 矩陣運算5. 理解矩陣乘法
一、 什麼是矩陣
一個 m × n 的矩陣是一個由 m 行 n 列元素排列成的矩形陣列。以下是一個由 6 個數字元素構成的 2 行 3 列的矩陣:
矩陣屬於線性代數數學分支。線性代數是關於向量空間和線性映射的一個數學分支。它包括對線、面和子空間的研究,同時也涉及到所有的向量空間的一般性質。表面上,排成矩形的數字就是個矩陣。實際,矩陣是有限維線性空間的線性變換的表示形式。它代表著空間到空間的映射。二、 矩陣在現實應用場景
在程序中,配合矩陣模擬真實數據,並可以實現如下功能:二維圖形變換、人臉變換、人臉識別、信息轉換等。比如一張圖片,簡單的黑白圖只有黑色和白色構成,是不是可以有 1 0 兩個數值的二維矩陣來表示呢?自然,尤其在圖像處理裡面,圖像信息是用二維矩陣數據。
矩陣分析,是一種方便的計算工具,可以以簡單的形式表達複雜的信息。三、 矩陣表達式
我們選擇 Python 作為代碼演示案例。利用的是 NumPy 庫。什麼是 NumPy?
NumPy 是一個基礎科學的計算包,包含:- 一個強大的N維數組對象
- sophisticated (broadcasting) functions
- tools for integrating C/C++ and Fortran code
- 有用的線性代數、傅立葉轉換和隨機數生成函數
在代碼中,導入 numpy 函數。
比如下面展示 1 × 2 和 2 × 2 的矩陣。調用 shape 方法,可獲取矩陣的大小。同樣,numpy 方便了我們很多操作。可以直接創建全 0 矩陣、全 1 矩陣和單元矩陣。代碼 matrix_exp.py 如下:# -*- coding: utf-8 -*- # 導入 numpy 函數,以 np 開頭import numpy as np if __name__ == __main__: mat1 = np.array([1, 3]) mat1 = np.mat(mat1) # 相當於 np.mat([1,3]), mat 函數將目標數據的類型轉換為矩陣(matrix) print mat1 # 1 行 2 列的矩陣(也稱 1 * 2 矩陣) # ==> [[1 3]] print 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 print 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 可得到下面結果:
[[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:JeffLi1993/robot-mumu四、 矩陣運算
矩陣運算包括了加減乘除、轉置、逆矩陣、行列式、矩陣的冪、伴隨矩陣等。
矩陣加法、減法、數量乘法規則如下:(和向量的運算規則一樣)-A = (-1)AA – B = A + (-B)2A + 3B = (2A)+ (3B)比如下面展示下 矩陣與矩陣相乘、矩陣求逆、轉置矩陣及每行或每列求和的運算。代碼 matrix_op.py 如下:# -*- coding: utf-8 -*- # 導入 numpy 函數,以 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]] print # 矩陣求逆 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.]] print # 轉置矩陣 mat6 = np.mat([[1, 1, 1], [0, 2, 1], [1, 1, 1]]) mat7 = mat6.T # I 對應 getT(self) ,返回矩陣的轉置矩陣 print mat7 # 矩陣的轉置矩陣 # ==> [[1 0 1] # ==> [1 2 1] # ==> [1 1 1]] print # 矩陣每一列的和 sum1 = mat6.sum(axis=0) print sum1 # 矩陣每一行的和 sum2 = mat6.sum(axis=1) print sum2 # 矩陣所有行列的總和 sum3 = sum(mat6[1, :]) print sum3 print # 矩陣與數組之間的轉換 mat8 = np.mat([[1, 2, 3]]) arr1 = np.array(mat8) # 矩陣轉換成數組 print arr1 arr2 = [1, 2, 3] mat9 = np.mat(arr2) # 數組轉換成矩陣 print mat9
右鍵,Run 可得到下面結果:
[[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]]
五、 理解矩陣和向量乘法
推薦下下面的文章去更深入的理解:
理解矩陣乘法 - 阮一峰的網路日誌Linear Algebra: What matrices actually are推薦閱讀:
※在機器學習的演算法中, 矩陣運算的效率總是優於for循環嗎?
※網路結構中節點嵌入向量表達(network embedding)方法介紹
※關於LDA的gibbs採樣,為什麼可以獲得正確的樣本?
※最實用的機器學習演算法Top5
※Topic Model Series [2]: 向Bayesian轉變
TAG:机器学习 | 深度学习DeepLearning | Python |