从线性代数视角,机器学习就是一系列矩阵变换的过程,而实现矩阵变换关键就在于基础库Numpy,
NumPy 构成了 scikit-learn 和 SciPy 等强大机器学习库的基础。NumPy 支持向量化编程,通过其内置的向量化函数和工具,可以高效处理数组运算,避免显式循环。
从数学基础的线性代数视角来看,机器学习本质上可以理解为一系列矩阵变换和运算的过程。无论是简单的线性回归还是复杂的深度学习模型,其核心计算都可以归结为矩阵乘法、特征值分解、奇异值分解等线性代数运算。
作为Python科学计算的基础库,NumPy在这个过程中的作用至关重要。它提供了高效的n维数组对象ndarray和丰富的矩阵运算函数,包括:
1、NumPy基本操作
1.1、数组创建
arr.shape : 数组形状 ,arr.size : 元素总数 ,arr.dtype : 数据类型。
python
if __name__ == '__main__':
# 从列表创建数组
scores = [random.randint(0, 100) for _ in range(200)]
arr = np.array(scores)
# 创建特殊数组
zero_array = np.zeros(shape=(2, 3, 4, 5)) # 全零数组
one_array = np.ones(shape=(3,)) # 全⼀数组
range_array = np.arange(10) # 0-9的数组
linspace_array = np.linspace(-10, 10, 150) # 等差数列
1.2、向量基本矩阵运算(加减乘除)
python
if __name__ == '__main__':
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 基本运算
result_add = a + b # [5, 7, 9]
result_mul = a * b # [4, 10, 18]
result_pow = a ** b # [1, 32, 729]
# 与标量运算
scalar_add = a + 2 # [3, 4, 5]
与 Python列表对⽐:
- 列表: [1,2,3] + [4,5,6] = [1,2,3,4,5,6] (连接)
- NumPy: array([1,2,3]) + array([4,5,6]) = array([5,7,9]) (元素级相加)
1.3、⼴播机制(Broadcasting)
定义:在不引起歧义的前提下,NumPy ⾃动调整数组形状以进⾏运算。
python
if __name__ == '__main__':
arr1 = np.array([1, 2, 3, 4, 5]) # shape: (5,)
arr2 = np.array([3]) # shape: (1,)
result = arr1 + arr2 # ⼴播成功: [4, 5, 6, 7, 8]
print(result)
# ⼆维⼴播⽰例
arr2d = np.array([[1], [2]]) # shape: (2, 1)
result2d = arr1 + arr2d # 结果 shape: (2, 5)
print(result2d)
⼴播规则:
- 从最后⼀个维度开始⽐较
- 维度⼤⼩相等或其中⼀个为 1 时可以⼴播
- 缺失维度视为 1。
1.4、数学函数计算
python
if __name__ == '__main__':
arr = np.array([1, 2, 3, 4, 5])
# 三⾓函数
sin_values = np.sin(arr)
cos_values = np.cos(arr)
print(f"sin= {sin_values},cos={cos_values}")
# 指数和对数
exp_values = np.exp(arr)
log_values = np.log(arr)
log2_values = np.log2(arr)
log10_values = np.log10(arr)
2、NumPy向量化操作
2.1向量空间基础
核⼼概念:从向量空间⾓度理解数据,涉及模⻓、夹⾓和内积。
2.2向量模⻓计算
数学公式 :对于向量 ,模⻓为:
python
if __name__ == '__main__':
v1 = np.array([1, 2, 3, 4, 5])
# ⽅法1:⼿动计算
norm_manual = (v1 ** 2).sum() ** 0.5
print(f"norm_manual:{norm_manual}")
# ⽅法2:使⽤ NumPy 函数
norm_numpy = np.linalg.norm(v1)
print(f"norm_numpy:{norm_numpy}")
2.3 向量内积与余弦相似度
内积公式 :
余弦相似度公式:
常用语计算2个向量之间相似性,值域为 [-1, 1],1表示两个向量方向完全相同,0表示正交,-1表示方向相反。
python
if __name__ == '__main__':
v1 = np.array([1, 2, 3, 4, 5])
v2 = np.array([6, 3, 1, 3, 6])
# 内积计算
dot_product_manual = (v1 * v2).sum()
dot_product_operator = v1 @ v2
print(f"dot_operator={dot_product_operator}")
# 余弦相似度
cosine_similarity = v1 @ v2 / (np.linalg.norm(v1) * np.linalg.norm(v2))
print(f"cosine_similarity={cosine_similarity}")
2.4欧⼏⾥得距离
即两点之间的直线距离 。它是欧几里得几何中最基础、最直观的距离度量方式。在数学和数据分析中,它用于衡量在多维空间中两个点之间的绝对距离。
公式 :
python
if __name__ == '__main__':
v1 = np.array([1, 2, 3, 4, 5])
v2 = np.array([6, 3, 1, 3, 6])
# 欧⼏⾥得距离
euclidean_distance = ((v1 - v2) ** 2).sum() ** 0.5
# 或使⽤ NumPy
euclidean_distance = np.linalg.norm(v1 - v2)
2.5矩阵运算
python
if __name__ == '__main__':
m1 = np.arange(12).reshape(3, 4) # 3×4 矩阵
m2 = np.arange(12).reshape(4, 3) # 4×3 矩阵
# 矩阵乘法(注意维度匹配)
result = m1 @ m2 # 结果为 3×3 矩阵
print(f"{result}")
NumPy的核心优势在于其向量化编程能力,通过其内置的向量化函数和工具,可以高效处理数组运算,避免显式循环。例如,要实现两个向量的点积运算,传统Python需要编写循环:
result = 0
for i in range(len(a)):
result += a[i] * b[i]
而使用NumPy只需简洁的一行代码:
result = np.dot(a, b)
这种向量化运算不仅代码更简洁,更重要的是底层通过C语言实现,计算效率显著提升。
NumPy的高效实现直接支撑了scikit-learn、SciPy等机器学习库的性能。例如在scikit-learn中:
- 数据预处理模块(如StandardScaler)依赖NumPy进行矩阵运算
- 模型训练过程中的梯度计算基于NumPy数组
- 评估指标的计算利用NumPy的向量化操作
此外,NumPy还通过内存映射文件支持大数据处理,通过广播机制简化不同形状数组的运算,这些特性都使其成为机器学习领域不可或缺的基础工具。