Junki
Junki
Published on 2025-01-15 / 99 Visits
0
0

余弦相似度的原理和应用场景

定义

余弦相似度(Cosine Similarity)是一种用于衡量两个非零向量之间相似程度的指标。其基本原理是通过计算两个向量夹角的余弦值来判断它们的相似性。具体而言,余弦相似度被定义为两个向量的点积与它们的范数乘积之比,其公式为:

\text{余弦相似度} = \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \times \|\mathbf{B}\|}

其中:

  • \mathbf{A}\mathbf{B} 是两个向量。
  • \mathbf{A} \cdot \mathbf{B} 是两个向量的点积。
  • \|\mathbf{A}\|\|\mathbf{B}\| 分别是向量 \mathbf{A}\mathbf{B} 的欧几里得范数(即向量的长度)。
  • \theta 是两个向量之间的夹角。

余弦相似度的值介于-1和1之间:

  • 1表示完全相似(同向量)。
  • 0表示正交(没有相似度,夹角为90度)。
  • -1表示完全相反(逆向量)。

应用

应用场景包括:

  1. 文本相似度

    • 在文本处理和自然语言处理中,余弦相似度用于比较文章、文档和短文本的内容相似度。通过将文本表示成向量(例如TF-IDF向量或词嵌入),可以比较不同文本之间的相似性。
  2. 推荐系统

    • 在推荐系统中,余弦相似度用于度量用户和项目之间的相似性或用户之间的相似性。尤其是在协同过滤推荐中,通过计算用户或物品向量之间的余弦相似度,可以为用户提供个性化的推荐。
  3. 图像处理

    • 在图像处理和计算机视觉中,通过将图像转化为特征向量,余弦相似度可用于比较图片之间的相似性,例如在图像检索系统中查找相似图像。
  4. 聚类分析

    • 在聚类分析中,余弦相似度可以作为一种距离度量方法,帮助于将特征向量聚类,从而发现数据中潜在的结构关系。

这些应用场景表明,余弦相似度是一种灵活而强大的工具,尤其适用于高维空间中对数据点的相似性进行度量。

示例

一个简单的 Java 案例:

package similarity;

/**
 * 余弦相似度
 *
 * @author Junki
 */
public class CosineSimilarity {

    public static void main(String[] args) {
        double[] vectorA = {1, 2, 3};
        double[] vectorB = {4, 5, 6};

        double cosine = calculateCosineSimilarity(vectorA, vectorB);
        System.out.println("Cosine Similarity: " + cosine);
    }

    public static double calculateCosineSimilarity(double[] vectorA, double[] vectorB) {
        if (vectorA.length != vectorB.length) {
            throw new IllegalArgumentException("Vectors must be of the same length");
        }

        double dotProduct = 0.0;
        double normA = 0.0;
        double normB = 0.0;

        for (int i = 0; i < vectorA.length; i++) {
            dotProduct += vectorA[i] * vectorB[i];
            normA += Math.pow(vectorA[i], 2);
            normB += Math.pow(vectorB[i], 2);
        }

        return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
    }

}


Comment