定义
余弦相似度(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表示完全相反(逆向量)。
应用
应用场景包括:
-
文本相似度:
- 在文本处理和自然语言处理中,余弦相似度用于比较文章、文档和短文本的内容相似度。通过将文本表示成向量(例如TF-IDF向量或词嵌入),可以比较不同文本之间的相似性。
-
推荐系统:
- 在推荐系统中,余弦相似度用于度量用户和项目之间的相似性或用户之间的相似性。尤其是在协同过滤推荐中,通过计算用户或物品向量之间的余弦相似度,可以为用户提供个性化的推荐。
-
图像处理:
- 在图像处理和计算机视觉中,通过将图像转化为特征向量,余弦相似度可用于比较图片之间的相似性,例如在图像检索系统中查找相似图像。
-
聚类分析:
- 在聚类分析中,余弦相似度可以作为一种距离度量方法,帮助于将特征向量聚类,从而发现数据中潜在的结构关系。
这些应用场景表明,余弦相似度是一种灵活而强大的工具,尤其适用于高维空间中对数据点的相似性进行度量。
示例
一个简单的 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));
}
}