一、基础概念(标量、向量、矩阵、张量)
(1).标量:标量是数学和中的一个基本概念,它是一个没有方向的、只有大小的量。标量通常用普通的数字来表示,如5、10、-3.14等。在数学数学表达式中,标量通常用斜体字母表示,如a、b、c等。
(2).向量:表示一列数,这些数有序排列的,可以通过下标获取对应值,通常⽤粗体小写字母表示,它表示元素取实数,且有 n 个元素,第⼀个元素表⽰为:x1。将向量写成列向量的形式:
(3). 矩阵:矩阵是一个二维数组,其中的每一个元素被两个索引(而非 一个)所确定。我们通常会赋予矩阵粗体的大写变量名称,比如 A。如果一个 实数矩阵高度为 m,宽度为 n,那么我们说 A ∈ R m×n
(4).张量(Tensor): 超过两维的数组。一般地,一个数组中的元素分布在若干维坐标的规则网格中,我们称之为张量。我们使用字体 A 来表示张量 “A’’。张量 A 中坐标为 (i, j, k) 的元素记作 Ai,j,k。
代码演示:
import numpy as np
# 标量
a = 1
# 向量
b = np.array([1,2])
# 矩阵
c = np.array([[1,2], [3,4]])
# 张量
d = np.array([
[[1,2,3],[4,5,6],[7,8,9]],
[[1,2,3],[4,5,6],[7,8,9]],
[[1,2,3],[4,5,6],[7,8,9]],
])
print("标量: " + str(a))
print("向量: " + str(b))
print("矩阵: " + str(c))
print("张量: " + str(d))
# 运行结果:
'''标量: 1
向量: [1 2]
矩阵: [[1 2]
[3 4]]
张量: [[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 2 3]
[4 5 6]
[7 8 9]]]
'''
二、矩阵的转置
代码演示:
import numpy as np
A = np.array([[1.0,2.0],[1.0,0.0],[2.0,3.0]])
A_T = A.transpose()
print("A:", A)
print("A 的转置:", A_T)
# 运行结果
'''A: [[1. 2.]
[1. 0.]
[2. 3.]]
A 的转置: [[1. 1. 2.]
[2. 0. 3.]]'''
三、矩阵的加法
代码演示:
import numpy as np
a = np.array([[1.0,2.0],[3.0,4.0]])
b = np.array([[5.0,6.0],[7.0,8.0]])
print("矩阵相加:", a + b)
# 运行结果
'''矩阵相加: [[ 6. 8.]
[10. 12.]]'''
四、矩阵的乘法
代码演示:
import numpy as np
m1 = np.array([[1.0,3.0],[1.0,0.0]])
m2 = np.array([[1.0,2.0],[3.0,0.0]])
print("按矩阵乘法规则:", np.dot(m1, m2))
print("按逐元素相乘:", np.multiply(m1, m2))
print("按逐元素相乘:", m1*m2)
v1 = np.array([1.0,2.0])
v2 = np.array([3.0,4.0])
print("向量内积:", np.dot(v1, v2))
# 运行结果
'''按矩阵乘法规则: [[10. 2.]
[ 1. 2.]]
按逐元素相乘: [[1. 6.]
[3. 0.]]
按逐元素相乘: [[1. 6.]
[3. 0.]]
向量内积: 11.0'''
五、单位矩阵和逆矩阵
(1).单位矩阵的结构⼗分简单,所有的对⾓元素都为 1 ,其他元素都为 0。单位矩阵乘以任意⼀个向量等于这个向量本⾝。单位矩阵 如下图所示:
代码演示:
import numpy as np
a = np.identity(3)
print(a)
# 运行结果
'''[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]'''
(2). 矩阵A的矩阵逆(matrix inversion)记作 ,其定义的矩阵满足如下条件:
当存在,那么线性⽅程组的解为:
代码演示:
import numpy as np
A = [[1.0,2.0],[3.0,4.0]]
A_inv = np.linalg.inv(A)
print("A 的逆矩阵", A_inv)
# 运行结果
'''A 的逆矩阵 [[-2. 1. ]
[ 1.5 -0.5]]'''
六、范数
-
L1 范数(当前范数):L1 范数为求解中所有元素的绝对值之和。对于 n 维求解 x,其 L1 范数表示为 ||x||₁,计算方式为:||x ||₁ = |x₁| + |x2| + ... + |xₙ|。
-
L2范数(欧几里得范数):L2范数定义为支持中所有元素的平方和的平方根。对于n维支持x,其L2范数表示为||x||2,计算方式为: ||x||2 = √(x₁² + x2² + ... + xₙ²)。
-
L∞范数(无穷范数):L∞范数定义为求解中所有元素的绝对值的顶峰。对于n 维求解x,其L∞范数表示为||x||∞,计算方式为:||x||∞ = max(|x₁|, |x2|, ..., |xₙ|)。
-
Lp 范数:Lp 范数是一个通用的范数定义,其中 p 是一个正实数。对于 n 维 表示 x,其 Lp 范数表示为 ||x||ₚ,计算方式为:||x|| ₚ = (|x₁|ᵖ + |x2|ᵖ + ... + |xₙ|ᵖ)^(1/p)。
机器学习中通常使⽤的是 F 范数 (Frobenius norm),其定义为:
代码演示:
import numpy as np
a = np.array([1.0,2.0])
print("向量 2 范数", np.linalg.norm(a,ord=2))
print("向量 1 范数", np.linalg.norm(a,ord=1))
print("向量无穷范数", np.linalg.norm(a,ord=np.inf))
b = np.array([[1.0,2.0],[3.0,4.0]])
print("矩阵 F 范数", np.linalg.norm(b,ord="fro"))
# 运行结果
'''
向量 2 范数 2.23606797749979
向量 1 范数 3.0
向量无穷范数 2.0
矩阵 F 范数 5.477225575051661
'''
七、特征值分解
import numpy as np
A = np.array([[1.0,2.0,3.0],
[4.0,5.0,6.0],
[7.0,8.0,9.0]])
# 计算特征值
print("特征值:", np.linalg.eigvals(A))
# 计算特征值和特征向量
eigvals,eigvectors = np.linalg.eig(A)
print("特征值:", eigvals)
print("特征向量:", eigvectors)
# 运行结果
'''
特征值: [ 1.61168440e+01 -1.11684397e+00 -1.30367773e-15]
特征值: [ 1.61168440e+01 -1.11684397e+00 -1.30367773e-15]
特征向量: [[-0.23197069 -0.78583024 0.40824829]
[-0.52532209 -0.08675134 -0.81649658]
[-0.8186735 0.61232756 0.40824829]]
'''