目录

  • 前言
  • 1.向量是什么
  • 1.1 向量的定义
  • 1.2 向量的表示
  • 1.3 向量物理意义
  • 2.行向量与列向量
  • 3.向量运算
  • 3.1 向量加减法
  • 3.2 向量数乘
  • 3.3 转置
  • 3.4 向量内积
  • 3.5 向量运算法则
  • 4.向量的范数
  • 4.1 1-范数
  • 4.2 2-范数
  • 4.3 P-范数
  • 4.4 -范数
  • 4.5 −∞-范数
  • 5.特殊向量
  • 5.1 0向量
  • 5.2 单位向量
  • 6.矩阵是什么
  • 7.常见矩阵
  • 7.1 方阵
  • 7.2 对称矩阵
  • 7.3 单位矩阵
  • 7.4 对角矩阵
  • 8.矩阵运算
  • 8.1 矩阵加减法
  • 8.2 数乘
  • 8.3 矩阵乘法
  • 8.4 矩阵转置
  • 8.5 矩阵运算法则
  • 9.逆矩阵
  • 9.1 逆矩阵定义
  • 9.2 逆矩阵作用
  • 10.行列式
  • 11.伴随矩阵
  • 11.1 代数余子式
  • 11.2 伴随矩阵定义
  • 11.3 伴随矩阵性质
  • 11.4 伴随矩阵与逆矩阵


前言

本文其实值属于:程序员的数学【AIoT阶段二】 的一部分内容,本篇把这部分内容单独截取出来,方便大家的观看,本文介绍 线性代数基础,在机器学习中经常会有矩阵、向量的定义以及计算,是公式定义、推导中必不可少的一部分内容,很多基础概念的定义中都用到了向量的概念,有关线性代数,后续还会发一篇博文:程序员的数学【线性代数高级】,本文涵盖了一些计算的问题并使用代码进行了实现,安装代码运行环境见博客:最详细的Anaconda Installers 的安装【numpy,jupyter】(图+文),如果你只是想要简单的了解有关线代的内容,那么只需要学习一下博文:NumPy从入门到高级,如果你是跟着博主学习 程序员数学用Python 程序员数学基础_python 的小伙伴,建议先看博文:数据分析三剑客【AIoT阶段一(下)】(十万字博文 保姆级讲解),如果你没有 程序员数学用Python 程序员数学基础_线性代数_02 基础,那么还需先修博文:Python的进阶之道【AIoT阶段一(上)】(十五万字博文 保姆级讲解)

1.向量是什么

1.1 向量的定义

🚩在数学中,向量(也称为欧几里得向量、几何向量、矢量),指具有 大小方向 的量。它可以形象化地表示为带箭头的线段。箭头所指:代表向量的方向;线段长度:代表向量的大小。与向量对应的量叫做数量(物理学中称标量),数量(或标量)只有大小,没有方向。

程序员数学用Python 程序员数学基础_程序员的数学_03

1.2 向量的表示

🚩向量的记法:印刷体记作粗体的字母(如 a,b,u,v),书写时在字母顶上加一小箭头 程序员数学用Python 程序员数学基础_程序员数学用Python_04。如果给定向量的起点(A)和终点(B),可将向量记作 程序员数学用Python 程序员数学基础_线性代数_05,实际上向量有多种记法,可以用元组表示一个向量,如 程序员数学用Python 程序员数学基础_线性代数_06程序员数学用Python 程序员数学基础_数学_07,在线性代数中,程序员数学用Python 程序员数学基础_python_08 元向量可以用 程序员数学用Python 程序员数学基础_程序员数学用Python_09 矩阵表示,如:
程序员数学用Python 程序员数学基础_线性代数_10
显然,上述这种写法太占篇幅,不环保!,所以我们经常会写成:程序员数学用Python 程序员数学基础_程序员的数学_11,向量中的每个元素 程序员数学用Python 程序员数学基础_线性代数_12,都称作向量的一个分量。

1.3 向量物理意义

程序员数学用Python 程序员数学基础_程序员数学用Python_13


程序员数学用Python 程序员数学基础_数学_14

向量的几何意义就是空间中的点,物理意义就是速度或者力这样的矢量。

向量的分量我们称之为维度,程序员数学用Python 程序员数学基础_python_08 维向量集合的全体就构成了 程序员数学用Python 程序员数学基础_python_08 维欧式空间,一个 程序员数学用Python 程序员数学基础_python_08 维向量其实就是一个 程序员数学用Python 程序员数学基础_python_08

2.行向量与列向量

🚩行向量在线性代数中,是一个 程序员数学用Python 程序员数学基础_python_19 的矩阵,即矩阵由一个含有 程序员数学用Python 程序员数学基础_python_08

行向量示例:程序员数学用Python 程序员数学基础_程序员数学用Python_21

在线性代数中,列向量是一个 程序员数学用Python 程序员数学基础_线性代数_22 的矩阵,即矩阵由一个含有 程序员数学用Python 程序员数学基础_python_08

列向量示例:程序员数学用Python 程序员数学基础_线性代数_10

为简化书写、方便排版起见,有时会以加上转置符号 程序员数学用Python 程序员数学基础_线性代数_25

程序员数学用Python 程序员数学基础_程序员的数学_11

在机器学习中说到向量一般都是指 列向量

3.向量运算

3.1 向量加减法

🚩等于它们的分量分别相加,显然两个向量的长度得是相等的,减法我们在这里不列举,很容易举一反三。

程序员数学用Python 程序员数学基础_python_27

3.2 向量数乘

程序员数学用Python 程序员数学基础_程序员数学用Python_28

3.3 转置

程序员数学用Python 程序员数学基础_数学_29

程序员数学用Python 程序员数学基础_程序员的数学_30

3.4 向量内积

🚩两个列向量 程序员数学用Python 程序员数学基础_数学_31 等于对应位置相乘再相加。
程序员数学用Python 程序员数学基础_线性代数_32

3.5 向量运算法则

🚩实数与向量运算法则,设 程序员数学用Python 程序员数学基础_线性代数_33程序员数学用Python 程序员数学基础_python_34

  • 结合率:程序员数学用Python 程序员数学基础_程序员的数学_35
  • 分配率:程序员数学用Python 程序员数学基础_程序员数学用Python_36

向量内积运算法则:

  • 交换律:程序员数学用Python 程序员数学基础_程序员数学用Python_37
  • 分配率:程序员数学用Python 程序员数学基础_数学_38
  • 结合律:程序员数学用Python 程序员数学基础_线性代数_39

4.向量的范数

🚩范数的公式是向量每个分量绝对值 程序员数学用Python 程序员数学基础_python_40 次方 再用幂函数计算 程序员数学用Python 程序员数学基础_python_40分之一,这里 程序员数学用Python 程序员数学基础_python_40 肯定是整数 程序员数学用Python 程序员数学基础_程序员数学用Python_43到正无穷都是可以的。向量的范数就是把向量变成一个标量,范数的表示就是两个竖线来表示,然后右下角写上 程序员数学用Python 程序员数学基础_python_40

程序员数学用Python 程序员数学基础_程序员数学用Python_45

程序员数学用Python 程序员数学基础_数学_46

4.1 1-范数

程序员数学用Python 程序员数学基础_程序员的数学_47
即向量元素绝对值之和,表示 程序员数学用Python 程序员数学基础_python_48 到零点的 曼哈顿距离,如上图:红色、蓝色、黄色的线条。

4.2 2-范数

程序员数学用Python 程序员数学基础_python_49
即向量元素的平方和再开方,也叫 欧几里得范数,常用计算向量长度,表示 程序员数学用Python 程序员数学基础_python_48 到零点的欧式距离,如上图绿色的线条

4.3 P-范数

程序员数学用Python 程序员数学基础_python_51
即向量元素绝对值的 程序员数学用Python 程序员数学基础_python_40 次方和的 程序员数学用Python 程序员数学基础_python_53 次幂,表示 程序员数学用Python 程序员数学基础_python_48 到零点的 程序员数学用Python 程序员数学基础_python_40闵氏距离

4.4 程序员数学用Python 程序员数学基础_数学_56-范数

程序员数学用Python 程序员数学基础_线性代数_57
程序员数学用Python 程序员数学基础_python_40 趋向于正无穷时,即所有向量元素绝对值中的最大值。表示 切比雪夫距离

程序员数学用Python 程序员数学基础_python_59


国际象棋棋盘上两个位置间的切比雪夫距离是指王要从一个位子移至另一个位子需要走的步数。由于王可以往斜前或斜后方向移动一格,因此可以较有效率的到达目的的格子。

4.5 程序员数学用Python 程序员数学基础_程序员数学用Python_60-范数

程序员数学用Python 程序员数学基础_线性代数_61
程序员数学用Python 程序员数学基础_python_40

5.特殊向量

5.1 0向量

🚩就是分量全部为 程序员数学用Python 程序员数学基础_程序员数学用Python_63 的向量
程序员数学用Python 程序员数学基础_线性代数_64

5.2 单位向量

🚩就是2-范数为 程序员数学用Python 程序员数学基础_python_65、模为 程序员数学用Python 程序员数学基础_python_65、长度为 程序员数学用Python 程序员数学基础_python_65

向量 程序员数学用Python 程序员数学基础_线性代数_05 的长度叫做向量的模,记作 程序员数学用Python 程序员数学基础_程序员数学用Python_69

计算公式:

  • 空间向量 程序员数学用Python 程序员数学基础_程序员的数学_70 ,其中 程序员数学用Python 程序员数学基础_python_71 表示三个轴上的坐标,模长为:程序员数学用Python 程序员数学基础_程序员的数学_72
  • 平面向量 程序员数学用Python 程序员数学基础_线性代数_73,模长为:程序员数学用Python 程序员数学基础_程序员的数学_74

根据2-范数的公式可知,2-范数就是向量的模,对于向量(列向量)来说,2-范数就是:程序员数学用Python 程序员数学基础_线性代数_75

6.矩阵是什么

🚩矩阵就是二维数组,下面是一个 程序员数学用Python 程序员数学基础_数学_76程序员数学用Python 程序员数学基础_python_08 的矩阵,它有 程序员数学用Python 程序员数学基础_数学_76 行,程序员数学用Python 程序员数学基础_python_08 列,每行每列上面都有元素,每个元素都有行标 程序员数学用Python 程序员数学基础_程序员的数学_80 和列标 程序员数学用Python 程序员数学基础_程序员的数学_81程序员数学用Python 程序员数学基础_python_82。简称 程序员数学用Python 程序员数学基础_程序员的数学_83

程序员数学用Python 程序员数学基础_程序员数学用Python_84

注意 程序员数学用Python 程序员数学基础_数学_85 的索引是 程序员数学用Python 程序员数学基础_python_86

程序员数学用Python 程序员数学基础_python_87 个数称为矩阵 程序员数学用Python 程序员数学基础_程序员数学用Python_88 的元素,简称为元,数 程序员数学用Python 程序员数学基础_python_82 位于矩阵 程序员数学用Python 程序员数学基础_程序员数学用Python_88 的第 程序员数学用Python 程序员数学基础_程序员的数学_80 行第 程序员数学用Python 程序员数学基础_程序员的数学_81 列,称为矩阵 程序员数学用Python 程序员数学基础_程序员数学用Python_88程序员数学用Python 程序员数学基础_程序员数学用Python_94 元,程序员数学用Python 程序员数学基础_python_87 矩阵 程序员数学用Python 程序员数学基础_程序员数学用Python_88 也记作 程序员数学用Python 程序员数学基础_python_97

7.常见矩阵

7.1 方阵

🚩如果 程序员数学用Python 程序员数学基础_数学_76 等于 程序员数学用Python 程序员数学基础_python_08,那就称为方阵:
程序员数学用Python 程序员数学基础_程序员数学用Python_100

7.2 对称矩阵

🚩如果对于任意的 程序员数学用Python 程序员数学基础_python_82 都等于 程序员数学用Python 程序员数学基础_程序员的数学_102,那么这个矩阵就是对称矩阵。从定义不难看出,对称矩阵的前提是该矩阵首先是一个方阵。

程序员数学用Python 程序员数学基础_数学_103

7.3 单位矩阵

🚩主对角线都是 程序员数学用Python 程序员数学基础_python_65,其它位置是 程序员数学用Python 程序员数学基础_程序员数学用Python_63,这称之为单位矩阵,单位矩阵写为 程序员数学用Python 程序员数学基础_python_106,一定是方阵,等同于数字里面的 程序员数学用Python 程序员数学基础_python_65

程序员数学用Python 程序员数学基础_线性代数_108

7.4 对角矩阵

🚩对角矩阵,就是主对角线非 程序员数学用Python 程序员数学基础_程序员数学用Python_63,其它位置是 程序员数学用Python 程序员数学基础_程序员数学用Python_63
程序员数学用Python 程序员数学基础_python_111
对角矩阵一定是方阵。不然没有对角线!

8.矩阵运算

8.1 矩阵加减法

🚩矩阵的加法就是矩阵的对应位置相加,减法也是一样就是对应位置相减。
程序员数学用Python 程序员数学基础_程序员数学用Python_112

8.2 数乘

程序员数学用Python 程序员数学基础_数学_113

8.3 矩阵乘法

🚩矩阵的乘法和一般的乘法是不太一样!

它是把第一个矩阵的每一行,和第二个矩阵的每一列拿过来做内积得到结果。

程序员数学用Python 程序员数学基础_python_114


程序员数学用Python 程序员数学基础_程序员的数学_115

对于矩阵乘法的两个矩阵,假设第一个矩阵为 程序员数学用Python 程序员数学基础_数学_76程序员数学用Python 程序员数学基础_python_08 列,第二个矩阵为 程序员数学用Python 程序员数学基础_python_08程序员数学用Python 程序员数学基础_程序员数学用Python_119 列,那么进行矩阵乘法后得到的矩阵为 程序员数学用Python 程序员数学基础_数学_76程序员数学用Python 程序员数学基础_程序员数学用Python_119 列:程序员数学用Python 程序员数学基础_线性代数_122

8.4 矩阵转置

🚩转置的操作和向量是一样的,就是把 程序员数学用Python 程序员数学基础_python_82 变成 程序员数学用Python 程序员数学基础_程序员的数学_102,即把行和列互换一下:
程序员数学用Python 程序员数学基础_程序员的数学_125

8.5 矩阵运算法则

  • 矩阵加减法
    满足:分配律、结合律、交换律
  • 矩阵乘法
    满足:分配律、结合律,不满足交换律
  • 程序员数学用Python 程序员数学基础_数学_126

矩阵乘法 + 转置:程序员数学用Python 程序员数学基础_程序员数学用Python_127

9.逆矩阵

9.1 逆矩阵定义

矩阵有 程序员数学用Python 程序员数学基础_python_128 乘法,但是没有 程序员数学用Python 程序员数学基础_数学_129

逆矩阵怎么定义的?

假设有个矩阵 程序员数学用Python 程序员数学基础_程序员数学用Python_88,注意它一定是方阵(必须是方阵),乘以矩阵 程序员数学用Python 程序员数学基础_程序员数学用Python_131 等于单位矩阵 程序员数学用Python 程序员数学基础_python_106

程序员数学用Python 程序员数学基础_python_133程序员数学用Python 程序员数学基础_数学_134

那么我们称这里的 程序员数学用Python 程序员数学基础_程序员数学用Python_131程序员数学用Python 程序员数学基础_程序员数学用Python_88

有个很重要的结论就是,如果这样的 程序员数学用Python 程序员数学基础_程序员数学用Python_131 存在的话,它的左逆和右逆一定相等,统称为 程序员数学用Python 程序员数学基础_程序员数学用Python_88 的逆矩阵 程序员数学用Python 程序员数学基础_python_139,则:程序员数学用Python 程序员数学基础_程序员的数学_140

9.2 逆矩阵作用

🚩矩阵求逆有什么用呢?

它可以帮助我们解线性方程组,比如 程序员数学用Python 程序员数学基础_python_141 。两边同时乘以 程序员数学用Python 程序员数学基础_python_48

程序员数学用Python 程序员数学基础_线性代数_143
程序员数学用Python 程序员数学基础_程序员数学用Python_144
程序员数学用Python 程序员数学基础_程序员的数学_145

就可以求解出方程的系数,它发明的目的也是干这样的事情用的。

举例说明:

# 三元一次方程 
# 3x + 2y + 4z = 19 
# 2x -y + 3z = 9 
# x + y - z = 0

import numpy as np

X = np.array([[3, 2, 4],
              [2, -1, 3],
              [1, 1, -1]])
Y = np.array([19, 9, 0])

display(X, Y)

# np.linalg.inv表示矩阵求逆 
# dot表示矩阵乘法
W = np.linalg.inv(X).dot(Y)
print('求解方程x,y,z为:', W)

程序员数学用Python 程序员数学基础_python_146


从这里我们也可以看出来单位矩阵像我们乘法里面的 程序员数学用Python 程序员数学基础_python_65

逆矩阵相关公式:

  • 程序员数学用Python 程序员数学基础_python_148
  • 程序员数学用Python 程序员数学基础_程序员数学用Python_149
  • 程序员数学用Python 程序员数学基础_python_150

10.行列式

🚩 行列式其实在机器学习中用的并不多,一个矩阵必须是方阵,才能计算它的行列式

行列式是把矩阵变成一个标量
程序员数学用Python 程序员数学基础_线性代数_151

import numpy as np
A = np.array([[1,3],[2,5]])
display(A)
print('矩阵A的行列式是:\n',np.linalg.det(A))

程序员数学用Python 程序员数学基础_程序员的数学_152

行列式在求解,逆矩阵的过程中,起到了作用,行列式 不为0,才可以求解逆矩阵!

import numpy as np
A = np.array([[1,3],[2,6]])
display(A)
print('矩阵A的行列式是:\n',np.linalg.det(A))

# 无法求解行列式,报错信息:LinAlgError: Singular matrix
print('矩阵A的逆矩阵为:\n',np.linalg.inv(A))

程序员数学用Python 程序员数学基础_程序员的数学_153

11.伴随矩阵

11.1 代数余子式

🚩 代数余子式定义:

程序员数学用Python 程序员数学基础_程序员数学用Python_154


代数余子式计算

程序员数学用Python 程序员数学基础_python_155

计算过程如下:

程序员数学用Python 程序员数学基础_程序员的数学_156

11.2 伴随矩阵定义

🚩 设有一矩阵 程序员数学用Python 程序员数学基础_程序员数学用Python_88
程序员数学用Python 程序员数学基础_python_158

程序员数学用Python 程序员数学基础_python_159 是矩阵 程序员数学用Python 程序员数学基础_程序员数学用Python_88 中元素 程序员数学用Python 程序员数学基础_python_82 的代数余子式,那么矩阵 程序员数学用Python 程序员数学基础_数学_162
程序员数学用Python 程序员数学基础_数学_163

称为矩阵 程序员数学用Python 程序员数学基础_程序员数学用Python_88伴随矩阵

11.3 伴随矩阵性质

程序员数学用Python 程序员数学基础_python_165
程序员数学用Python 程序员数学基础_python_165

程序员数学用Python 程序员数学基础_程序员数学用Python_167 都表示单位矩阵,程序员数学用Python 程序员数学基础_数学_168

11.4 伴随矩阵与逆矩阵

程序员数学用Python 程序员数学基础_线性代数_169
程序员数学用Python 程序员数学基础_线性代数_170,其中 程序员数学用Python 程序员数学基础_数学_168 代表行列式
程序员数学用Python 程序员数学基础_程序员数学用Python_88程序员数学用Python 程序员数学基础_python_173程序员数学用Python 程序员数学基础_程序员数学用Python_174

根据上式可得:
程序员数学用Python 程序员数学基础_数学_175程序员数学用Python 程序员数学基础_python_173

import numpy as np

# 声明矩阵
A = np.array([
    [1, 2, 3],
    [2, 2, 1],
    [3, 4, 3]])
A_bs = [] # 伴随矩阵
n = 3 # A方阵的行、列数量

for i in range(n):
    for j in range(n):
        row = [0, 1, 2] # 行索引
        col = [0, 1, 2] # 列索引
        row.remove(i) # 去除行
        col.remove(j) # 去除列
        # 代数余子式
        A_ij = A[np.ix_(row, col)]
        A_bs.append(((-1) ** (i + j)) * np.linalg.det(A_ij))
        
A_bs = np.array(A_bs).reshape(3, 3).T

print('根据伴随矩阵求逆矩阵:\n', A_bs / np.linalg.det(A))
print('用NumPy模块求逆矩阵:\n', np.linalg.inv(A))

程序员数学用Python 程序员数学基础_程序员数学用Python_177