赵走x博客
网站访问量:151851
首页
书籍
软件
工具
古诗词
搜索
登录
机器学习的数学基础:矩阵篇
机器学习的数学基础:矩阵篇
资源编号:570042
热度:90
# 前言 机器学习如火如荼,要学习机器学习,数学基础少不了。所以本系列将对机器学习所用到的线性代数、微积分和概率统计的基础知识做一个简单的概括。 本文将总结线性代数中矩阵的基本知识点。同时理论结合实践,使用 Python 来进行实践。如果需要跟着进行编程实践,请先确保下列环境已安装: * Python - 编程实践所使用的语言; * Numpy - Python 的数值计算库。 矩阵(Matrix)是人为约定的一种数据的表示方法,在图像处理、人工智能等领域,使用矩阵来表示和处理数据非常常见。一个矩阵的举例:  其中,矩阵 A的下标 2×3表示 A是一个 2 行 3 列的矩阵。类似的,另一个示例:  再看回矩阵 A,如果要表示第 2 行的第 2 个元素 3 ,可以使用 A[2,2]或 a2,2。 Python 的 Numpy 库提供了 ndarray 类用于存储高维数组及普通的数组运算,另外提供 matrix 类用来支持矩阵运算。使用 Python 创建矩阵很简单: ``` import numpy as np a = np.matrix('5 2 7;1 3 4') b = np.matrix('5 2 7 6;1 3 4 2;8 2 -2 3') ``` 也可以用下面这种形式: ``` import numpy as np a = np.matrix([[5,2,7],[1,3,4]]) b = np.matrix([[5,2,7,6],[1,3,4,2],[8,2,-2,3]]) ``` 两种形式完全等效。但第一种更简明直观,不容易犯错。因此推荐第一种方式。 要把一个 matrix 对象转换为 ndarray 对象,可以直接用 getA() 方法。而把 ndarray 对象转成 matrix 对象可以用 asmatrix() 方法。 ``` >>> b = a.getA() >>> print b [[5 2 7] [1 3 4]] >>> type(b)
>>> c = np.asmatrix(b) >>> print c [[5 2 7] [1 3 4]] >>> type(c)
``` 要取出矩阵中的某个值,可以使用类似数组的下标运算符。但要注意的是,计算机是以 0 开始计数的。例如,要取出 A[2,2] ,应该使用: ``` >>> a[1,1] a[1,1] 3 ``` # 基本运算 #### 加  要注意两个矩阵的行数和列数必须相同,否则无定义。 Python 示例: ``` >>> a = np.matrix('1 0 1;1 2 1;2 1 1') a = np.matrix('1 0 1;1 2 1;2 1 1') >>> b = np.matrix('2 1 -1;0 -1 2;2 -1 0') b = np.matrix('2 1 -1;0 -1 2;2 -1 0') >>> a + b a + b matrix([[3, 1, 0], [1, 1, 3], [4, 0, 1]]) ``` 很容易看出,矩阵的加法满足交换律和结合律,即 A+B=B+A, (A+B)+C=A+(B+C)。 ###减 矩阵减法也和加法一样简单。对于上面给出的 A和 B,有:  同样,相减的两个矩阵行数和列数必须完全相同,否则无定义。 Python 示例: ``` >>> a - b a - b matrix([[-1, -1, 2], [ 1, 3, -1], [ 0, 2, 1]]) ``` ### 乘  与初等代数的乘法不同,矩阵的乘法并不满足交换律,即 A×B≠B×A。但满足分配律,即 (A×B)×C=A×(B×C)。 再介绍两个特殊的矩阵: * 单元矩阵 I。它的特点是行数列数相等,且在对角线上值为 1,其他地方值为 0 。它的一个特性是与其他矩阵相乘都等于那个矩阵本身。一个 3×3 的单元矩阵示例:  * 零矩阵。顾名思义就是全部元素都是 0 的矩阵。零矩阵乘以任何矩阵都为零矩阵,与任何矩阵相加都等于那个矩阵。 Python 示例: ``` >>> a * b a * b matrix([[ 4, 0, -1], [ 4, -2, 3], [ 6, 0, 0]]) >>> b * a b * a matrix([[ 1, 1, 2], [ 3, 0, 1], [ 1, -2, 1]]) >>> c = np.matrix('5 7 2;4 3 1') c = np.matrix('5 7 2;4 3 1') >>> d = np.matrix('1;5;6') d = np.matrix('1;5;6') >>> c*d c*d matrix([[52], [25]]) >>> a * b * d a * b * d matrix([[-2], [12], [ 6]]) >>> a * (b * d) a * (b * d) matrix([[-2], [12], [ 6]]) >>> I = np.eye(3) # 创建一个3阶单元矩阵 I = np.np.eye(3) >>> a * I a * I matrix([[1, 0, 1], [1, 2, 1], [2, 1, 1]]) >>> I * a I * a matrix([[1, 0, 1], [1, 2, 1], [2, 1, 1]]) >>> a * z a * z matrix([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) >>> b * z b * z matrix([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) >>> c * z c * z matrix([[0, 0, 0], [0, 0, 0]]) ``` 注意上面创建单元矩阵用了 ‘eye()’ 函数,它等同于下面的写法: ``` >>> I = np.matrix('1 0 0;0 1 0;0 0 1') ``` ### 除(求逆) 矩阵并没有一个直接叫除法的操作。但有个与之相似的运算,叫做求逆运算。  矩阵的求逆有很多种方法。常见的有伴随阵法、初等变换法、分块矩阵求逆法等。 ##### 伴随阵法    ##### 初等变换法   ##### 奇异矩阵  Python 求逆示例: ``` >>> a = np.matrix('1 0 1; 1 2 1; 2 1 1') a = np.matrix('1 0 1; 1 2 1; 2 1 1') >>> a.I a.I matrix([[-0.5, -0.5, 1. ], [-0.5, 0.5, 0. ], [ 1.5, 0.5, -1. ]]) >>> a * a.I a * a.I matrix([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]] >>> a.I * a a.I * a matrix([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) >>> f = np.matrix('0 1;0 0') f = np.matrix('0 1;0 0') >>> f.I f.I Traceback (most recent call last): File "
", line 1, in
File "/Library/Python/2.7/site-packages/numpy/matrixlib/defmatrix.py", line 972, in getI return asmatrix(func(self)) File "/Library/Python/2.7/site-packages/numpy/linalg/linalg.py", line 526, in inv ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj) File "/Library/Python/2.7/site-packages/numpy/linalg/linalg.py", line 90, in _raise_linalgerror_singular raise LinAlgError("Singular matrix") numpy.linalg.linalg.LinAlgError: Singular matrix ``` ### 矩阵的转置  Python 示例: ``` >>> a = np.matrix('2 4;1 3') >>> a.T matrix([[2, 1], [4, 3]]) >>> b = np.matrix('1 2 3;4 5 6') >>> b.T matrix([[1, 4], [2, 5], [3, 6]]) ``` 矩阵的转置有一个性质:矩阵乘积的转置等于矩阵调换后分别做转置的乘积,即  Python 示例: ``` >>> a = np.matrix('2 4;1 3') >>> b = np.matrix('1 6;2 5') >>> a*b matrix([[10, 32], [ 7, 21]]) >>> b.T*a.T matrix([[10, 7], [32, 21]]) ``` # 应用举例 矩阵是一种非常通用的数据表示方法,只要能用矩阵来表示数据,就能够用矩阵的这套运算来解决问题。下面列举几种常见的数学问题,它们都能够使用矩阵的思路来解决。 ### 求解方程组 例如一个二元方程组  可以用矩阵表示成:   虽然这个例子给出的方法用于二元一次矩阵求解还不如直接用初中就学到的消元法,但矩阵的好处在于对于更高维的数据,比如有成百上千个未知数,这个解法依然有效。 在 Python 中,可以使用 Numpy 的线性代数算法库 linalg 提供的 solve 方法求解方程组。示例如下: ``` >>> a = np.matrix('3 2; -1 1') >>> b = np.matrix('7; 1') >>> np.linalg.solve(a, b) matrix([[ 1.], [ 2.]]) ``` ### 求向量组合  