在上一节中,我们看到点积提供了一种方法来了解两个向量之间的夹角。当这个夹角恰好是 90 度时,会出现一个特殊且非常有用的情况。这一特性是机器学习和数据分析许多方面的核心。如果两个非零向量相互垂直,则称它们为正交。在线性代数中,检验正交性的方法简单直接:它们的点积为零。$$ v \cdot w = 0 $$如果你计算两个向量的点积,结果为 0,你就知道它们是正交的。从几何角度看,这意味着它们指向相互成直角的方向。你可以将它们想象成首尾相接时形成一个完美的“L”形。{"layout":{"xaxis":{"title":"维度 1","range":[-4,4],"zerolinecolor":"#ced4da","gridcolor":"#e9ecef"},"yaxis":{"title":"维度 2","range":[-4,4],"zerolinecolor":"#ced4da","gridcolor":"#e9ecef"},"annotations":[{"x":2,"y":3,"ax":0,"ay":0,"xref":"x","yref":"y","axref":"x","ayref":"y","showarrow":true,"arrowhead":2,"arrowwidth":3,"arrowcolor":"#4263eb"},{"x":-3,"y":2,"ax":0,"ay":0,"xref":"x","yref":"y","axref":"x","ayref":"y","showarrow":true,"arrowhead":2,"arrowwidth":3,"arrowcolor":"#f03e3e"},{"x":2.3,"y":3.1,"text":"<b>v</b> = [2, 3]","showarrow":false,"font":{"color":"#4263eb"}},{"x":-3.4,"y":2.3,"text":"<b>w</b> = [-3, 2]","showarrow":false,"font":{"color":"#f03e3e"}}],"margin":{"l":40,"r":20,"t":20,"b":40},"plot_bgcolor":"#FFFFFF"},"data":[]}向量 $v$ 和 $w$ 是正交的,因为它们的点积是 $(2 \times -3) + (3 \times 2) = -6 + 6 = 0$。这一关系是点积几何定义的直接结果:$v \cdot w = |v| |w| \cos(\theta)$。如果两个向量都具有非零长度($ |v| > 0 $ 和 $ |w| > 0 $),则它们的点积为零的唯一情况是 $\cos(\theta) = 0$。当夹角 $\theta$ 为 90° 时,余弦函数为零,这证实了向量相互垂直。正交性为何有价值在机器学习中,正交性是一个理想特性。当特征向量正交时,这意味着它们是线性独立的。简单来说,它们表示相互独立、不冗余的数据。例如,如果我们要分析住房数据,表示“建筑面积”的向量和表示“卧室数量”的向量是相关的。它们不是正交的。然而,像主成分分析 (PCA) 这样的方法通过寻找一组新的正交向量来表示数据中最主要的信息,这可以简化模型并提升其性能。使用 NumPy 检验正交性我们可以方便地使用 NumPy 的 dot() 函数在 Python 中检验正交性。让我们定义图中所示的两个向量,并计算它们的点积。import numpy as np # 定义两个正交向量 v = np.array([2, 3]) w = np.array([-3, 2]) # 计算点积 dot_product = np.dot(v, w) print(f"向量 v: {v}") print(f"向量 w: {w}") print(f"v 和 w 的点积: {dot_product}")输出:向量 v: [2 3] 向量 w: [-3 2] v 和 w 的点积: 0正如预期的那样,结果为 0,证实了 v 和 w 是正交的。现在我们尝试使用两个非正交向量。# 定义两个非正交向量 p = np.array([1, 5]) q = np.array([2, 4]) # 计算点积 dot_product_pq = np.dot(p, q) print(f"向量 p: {p}") print(f"向量 q: {q}") print(f"p 和 q 的点积: {dot_product_pq}")输出:向量 p: [1 5] 向量 q: [2 4] p 和 q 的点积: 22结果是 22,一个非零值,这表明这些向量不垂直。关于浮点精度的一个说明在使用计算机时,涉及浮点数(带小数的数字)的计算有时可能会出现微小的精度误差。你可能会遇到这样一种情况:两个向量应该是正交的,但它们的点积结果却是一个非常小的数字,例如 1.4e-16,而不是精确的 0。这是正常现象,发生的原因是计算机存储这些数字的方式。因此,通过测试结果是否精确为零来检验正交性是一种不建议的做法。# 一个向量及其正交对应物 a = np.array([1/3, 2/3]) b = np.array([-2, 1]) dot_product_ab = np.dot(a, b) print(f"点积: {dot_product_ab}") # 此检验可能会失败! is_orthogonal = (dot_product_ab == 0) print(f"它们正交吗?(直接检验): {is_orthogonal}")输出:点积: -2.220446049250313e-16 它们正交吗?(直接检验): False正确的方法是检验点积是否在一个小容差范围内接近零。NumPy 为此提供了 np.isclose() 函数。# 检验正交性的正确方法 is_orthogonal_close = np.isclose(dot_product_ab, 0) print(f"它们正交吗?(使用 np.isclose): {is_orthogonal_close}")输出:它们正交吗?(使用 np.isclose): True使用 np.isclose() 可以让你的代码在应对浮点运算的局限性时更加可靠。这种做法将帮你避免在机器学习项目中出现意外情况。