1.2 机器学习-向量化编程

从线性代数视角,机器学习就是一系列矩阵变换的过程,而实现矩阵变换关键就在于基础库Numpy,NumPy 构成了 scikit-learnSciPy 等强大机器学习库的基础。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中:

  1. 数据预处理模块(如StandardScaler)依赖NumPy进行矩阵运算
  2. 模型训练过程中的梯度计算基于NumPy数组
  3. 评估指标的计算利用NumPy的向量化操作

此外,NumPy还通过内存映射文件支持大数据处理,通过广播机制简化不同形状数组的运算,这些特性都使其成为机器学习领域不可或缺的基础工具。