Python 的 NumPy 库用于直接处理特征向量。特征向量表示数据,并且可以对它们执行基本运算。实际应用将演示向量操作、范数、点积和距离——这些运算在机器学习算法中经常用到。假设我们有数据,代表了两位在线用户根据其与三类内容(如:文章、视频和播客)的互动(例如:花费的时间)而简化的个人资料。用户A:[10小时文章,5小时视频,2小时播客]用户B:[8小时文章,9小时视频,3小时播客]我们可以将它们表示为 $\mathbb{R}^3$ 中的向量。设置向量首先,让我们导入 NumPy 并创建这些向量。import numpy as np # 用户互动向量(小时) user_a = np.array([10, 5, 2]) user_b = np.array([8, 9, 3]) print(f"用户A向量: {user_a}") print(f"用户B向量: {user_b}")基本运算假设我们想分析这两位用户在互动方面的差异。我们可以简单地用一个向量减去另一个。# 计算差异向量 difference = user_a - user_b print(f"差异 (A - B): {difference}")结果 [2, -4, -1] 表明,与用户 B 相比,用户 A 在文章上多花了 2 小时,在视频上少花了 4 小时,在播客上少花了 1 小时。现在,假设我们想预测如果用户 A 将所有类别的活动量增加 50%,他们的互动情况会是怎样。这就是标量乘法。# 将用户 A 的互动按 1.5 倍(150%)缩放 scaled_user_a = user_a * 1.5 print(f"缩放后的用户 A: {scaled_user_a}")计算范数(大小)我们如何量化每位用户的“总体互动”?向量范数能让我们了解其大小。让我们计算 $L_2$(欧几里得)范数和 $L_1$(曼哈顿)范数。$L_2$ 范数计算方法为 $||v||_2 = \sqrt{\sum_i v_i^2}$。# L2 范数(欧几里得) l2_norm_a = np.linalg.norm(user_a) # 默认是 L2 范数 l2_norm_b = np.linalg.norm(user_b) print(f"L2 范数(用户 A): {l2_norm_a:.2f}") print(f"L2 范数(用户 B): {l2_norm_b:.2f}")$L_2$ 范数表示 3D 特征空间中从原点到向量的直线距离。它提供了一个考虑所有分量的总体大小衡量。$L_1$ 范数计算方法为 $||v||_1 = \sum_i |v_i|$。# L1 范数(曼哈顿) l1_norm_a = np.linalg.norm(user_a, ord=1) l1_norm_b = np.linalg.norm(user_b, ord=1) print(f"L1 范数(用户 A): {l1_norm_a:.2f}") print(f"L1 范数(用户 B): {l1_norm_b:.2f}")$L_1$ 范数代表了所有类别互动时长的总和。在此情境下,它或许可以更直接地解释为总花费时间。尽管用户 A 的 $L_2$ 范数略高,但用户 B 的总互动时间(20 小时)略高于用户 A(17 小时)。不同的范数侧重于向量大小的不同方面。点积计算相似度点积有助于衡量两个向量的对齐程度或相似度。点积值越大且为正,表示向量指向更相似的方向。点积计算方法为 $A \cdot B = \sum_i A_i B_i$。# 计算点积 dot_product = np.dot(user_a, user_b) print(f"点积 (A . B): {dot_product}")结果(131)是正数,表示他们在互动模式上存在一定的对齐。为了得到一个与大小(总小时数)无关的标准化相似度衡量,我们可以计算余弦相似度:$$ \cos(\theta) = \frac{A \cdot B}{||A||_2 ||B||_2} $$# 计算余弦相似度 cosine_similarity = dot_product / (l2_norm_a * l2_norm_b) print(f"余弦相似度: {cosine_similarity:.2f}")余弦相似度接近 1 意味着向量指向非常相似的方向(各类别互动比例相似),而接近 0 的值表示正交(模式差异很大),-1 则表示方向相反。在此,0.91 表明互动资料相对相似,尽管在特定类别上存在差异。该指标在推荐系统和信息检索中应用广泛。计算距离这些用户在互动资料上“相距多远”?我们可以使用范数来计算距离。最常见的是欧几里得距离,它就是我们之前计算的差异向量的 $L_2$ 范数。$$ \text{距离}(A, B) = ||A - B||_2 $$# 计算欧几里得距离 euclidean_distance = np.linalg.norm(difference) # 差异向量的 L2 范数 # 或者: np.linalg.norm(user_a - user_b) print(f"用户 A 和用户 B 之间的欧几里得距离: {euclidean_distance:.2f}")这个距离用一个数字表示了两位用户的互动向量在 3D 空间中的差异程度。距离越小,意味着用户越相似。这个思想对于 k-最近邻 (k-NN) 等算法来说非常重要。我们还可以计算曼哈顿距离(差异向量的 $L_1$ 范数):# 计算曼哈顿距离 manhattan_distance = np.linalg.norm(difference, ord=1) print(f"用户 A 和用户 B 之间的曼哈顿距离: {manhattan_distance:.2f}")曼哈顿距离汇总了每个轴上的绝对差异($|2| + |-4| + |-1| = 7$)。它表示的是,如果你只能沿着特征空间轴的网格线移动时的距离。总结在本次实践练习中,你使用 NumPy 完成了以下操作:将数据点(用户资料)表示为向量。进行基本的向量运算(减法、标量乘法)来比较和转换数据。计算 $L_1$ 和 $L_2$ 范数,以了解向量的大小或总互动量。计算点积和余弦相似度,以衡量用户偏好的对齐程度或相似性。计算欧几里得距离和曼哈顿距离,以量化用户资料间的差异。这些运算是许多机器学习技术的基础组件。熟练运用 NumPy 等工具进行这些计算和解释,是有效应用线性代数的重要一步。随着课程的推进,你会看到这些运算应用于更多维度的向量,表示复杂的数据特征。