🎯 向量相似度计算完整可视化

📌 学习目标: 通过可视化图表理解如何使用 GTE 模型生成文本向量,并计算向量之间的余弦相似度。

12D 向量空间可视化(简化示例)

说明:实际的 GTE 模型生成的是 768 维向量,为了便于理解,这里先用 2D 向量展示余弦相似度的几何意义。
观察要点:
  • 向量之间的夹角 θ 决定了相似度
  • 夹角越小,cos(θ) 越大,相似度越高
  • "如何学习Java编程" 和 "Java入门教程" 夹角小(约15°),相似度高(0.97)
  • "今天天气真好" 与前两者夹角大(约85°),相似度低(0.09)

2余弦相似度计算公式

公式:
cosine_similarity(A, B) = (A · B) / (||A|| × ||B||)

其中:
• A · B = 点积 = A₀×B₀ + A₁×B₁ + A₂×B₂ + ... + A₇₆₇×B₇₆₇
• ||A|| = 向量A的模长 = √(A₀² + A₁² + A₂² + ... + A₇₆₇²)
• ||B|| = 向量B的模长 = √(B₀² + B₁² + B₂² + ... + B₇₆₇²)

33D 向量空间可视化

说明:这里展示 3 维向量空间,实际 GTE 模型是 768 维。原理相同,只是维度更高。
3D 空间中的观察:
  • 绿色和蓝色向量(Java相关)方向接近,夹角小
  • 红色向量(天气)方向偏离较大
  • 从原点出发的箭头代表向量方向

4768维向量降维到2D(模拟真实场景)

说明:使用 PCA(主成分分析)或 t-SNE 将 768 维向量降到 2 维进行可视化。这里模拟真实的 GTE 向量分布。
降维后的观察:
  • 相似的句子在降维空间中距离更近
  • 不同主题的句子距离较远
  • 降维保留了主要的语义信息

5相似度矩阵热力图

说明:计算所有句子两两之间的余弦相似度,用热力图展示。
热力图解读:
  • 颜色越,相似度越高
  • 颜色越,相似度越低
  • 对角线为 1.0(自己与自己完全相同)

6详细计算过程(前5个维度)

以 "如何学习 Java 编程" vs "Java 入门教程" 为例,展示前 5 个维度的计算:
维度 i vec1[i]
(句子1)
vec2[i]
(句子2)
vec1[i] × vec2[i]
(点积分量)
vec1[i]²
(模长分量)
vec2[i]²
(模长分量)
完整计算(768维):

7Java 代码实现

public static double cosineSimilarity(float[] vec1, float[] vec2) {
    // 初始化三个累加器
    double dotProduct = 0.0;  // 点积:A·B
    double norm1 = 0.0;        // ||A||²
    double norm2 = 0.0;        // ||B||²

    // 遍历所有维度(768维)
    for (int i = 0; i < vec1.length; i++) {
        dotProduct += vec1[i] * vec2[i];    // 累加点积
        norm1 += vec1[i] * vec1[i];         // 累加A的平方和
        norm2 += vec2[i] * vec2[i];         // 累加B的平方和
    }

    // 返回余弦相似度
    return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
}

8相似度与夹角对照图

对照表:
夹角 θ cos(θ) 相似度判断 示例
1.000 完全相同 相同句子
15° 0.966 非常相似 同义句
30° 0.866 高度相似 "Java编程" vs "Java教程"
45° 0.707 中等相似 相关主题
60° 0.500 部分相关 有一定关联
85° 0.087 几乎无关 "Java" vs "天气"
90° 0.000 完全无关(正交) 不同主题

9Elasticsearch 中的应用流程