機器學習的數學之 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)A

A – 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 |