📜  程序,计算两个N维向量之间的角度(1)

📅  最后修改于: 2023-12-03 15:11:27.540000             🧑  作者: Mango

计算两个N维向量之间的角度

本文将介绍如何用代码计算两个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度。