📅  最后修改于: 2023-12-03 15:11:27.540000             🧑  作者: Mango
本文将介绍如何用代码计算两个N维向量之间的夹角(角度)。在数学上,向量的“长度”称为模,向量之间的夹角称为内积。在几何中,两个向量的夹角可以用余弦公式计算,如下所示:
cos(θ) = (a·b) / (||a|| ||b||)
其中,a和b为向量,a·b表示它们的内积,||a||和||b||表示它们的模。
由此可得,两个向量之间的夹角θ为:
θ = acos((a·b) / (||a|| ||b||))
简单的说,就是两个向量内积除以它们的模的乘积的反余弦值。
接下来,我们将用Python来实现这个计算过程。
import math
def cosine_similarity(a: list, b: list) -> float:
"""
计算两个向量的余弦相似度
:param a: 第一个向量,类型为list
:param b: 第二个向量,类型为list
:return: 返回两个向量之间的余弦相似度
"""
numerator = sum([a[i] * b[i] for i in range(len(a))])
denominator = math.sqrt(sum([x ** 2 for x in a])) * math.sqrt(sum([x ** 2 for x in b]))
return numerator / denominator
def vector_angle(a: list, b: list) -> float:
"""
计算两个向量之间的夹角
:param a: 第一个向量,类型为list
:param b: 第二个向量,类型为list
:return: 返回两个向量之间的夹角(弧度制)
"""
cos_value = cosine_similarity(a, b)
return math.acos(cos_value)
上述代码中,我们通过定义cosine_similarity()函数计算了两个向量之间的余弦相似度,然后通过余弦公式计算了夹角,返回结果为弧度制角度,需进一步转换为角度制。
完整代码如下:
import math
def cosine_similarity(a: list, b: list) -> float:
"""
计算两个向量的余弦相似度
:param a: 第一个向量,类型为list
:param b: 第二个向量,类型为list
:return: 返回两个向量之间的余弦相似度
"""
numerator = sum([a[i] * b[i] for i in range(len(a))])
denominator = math.sqrt(sum([x ** 2 for x in a])) * math.sqrt(sum([x ** 2 for x in b]))
return numerator / denominator
def vector_angle(a: list, b: list) -> float:
"""
计算两个向量之间的夹角
:param a: 第一个向量,类型为list
:param b: 第二个向量,类型为list
:return: 返回两个向量之间的夹角(角度制)
"""
cos_value = cosine_similarity(a, b)
radian = math.acos(cos_value)
degree = radian * 180 / math.pi
return degree
现在,我们可以使用vector_angle()函数来计算任何两个N维向量之间的夹角了。例如:
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
angle = vector_angle(a, b)
print(angle)
输出结果为:
2.96
这表示a向量和b向量之间的夹角为2.96度。