余弦相似度(Cosine Similarity)是一种衡量两个向量之间相似度的方法,它通过计算两个向量的夹角的余弦值来得到相似度。在推荐系统、文本相似度检测等领域中,余弦相似度算法被广泛应用。
以下是使用Java实现余弦相似度算法的示例代码:
import java.util.Map;
import java.util.HashMap;
public class CosineSimilarity {
// 计算两个向量的点积
private static double dotProduct(Map<String, Double> vec1, Map<String, Double> vec2) {
double dotProduct = 0.0;
for (String key : vec1.keySet()) {
if (vec2.containsKey(key)) {
dotProduct += vec1.get(key) * vec2.get(key);
}
}
return dotProduct;
}
// 计算向量的欧几里得长度(L2范数)
private static double magnitude(Map<String, Double> vector) {
double sum = 0.0;
for (Double value : vector.values()) {
sum += Math.pow(value, 2);
}
return Math.sqrt(sum);
}
// 计算两个向量的余弦相似度
public static double cosineSimilarity(Map<String, Double> vec1, Map<String, Double> vec2) {
double dotProduct = dotProduct(vec1, vec2);
double magnitude1 = magnitude(vec1);
double magnitude2 = magnitude(vec2);
if (magnitude1 == 0 || magnitude2 == 0) {
return 0; // 如果任一向量为零向量,则相似度为0
}
return dotProduct / (magnitude1 * magnitude2);
}
public static void main(String[] args) {
// 示例向量
Map<String, Double> vec1 = new HashMap<>();
vec1.put("A", 1.0);
vec1.put("B", 2.0);
vec1.put("C", 3.0);
Map<String, Double> vec2 = new HashMap<>();
vec2.put("A", 1.0);
vec2.put("B", 2.0);
vec2.put("C", 4.0);
// 计算余弦相似度
double similarity = cosineSimilarity(vec1, vec2);
System.out.println("Cosine Similarity: " + similarity);
}
}
在上面的代码中,我们定义了两个辅助方法dotProduct和magnitude,分别用于计算两个向量的点积和向量的欧几里得长度(L2范数)。cosineSimilarity方法则利用这两个辅助方法来计算两个向量的余弦相似度。
在main方法中,我们创建了两个示例向量vec1和vec2,然后调用cosineSimilarity方法来计算它们之间的余弦相似度,并将结果打印出来。
请注意,这只是一个简单的示例,用于说明余弦相似度算法的基本实现。在实际应用中,向量可能非常大,包含成千上万个维度,因此可能需要使用更高效的数据结构和算法来处理这些向量。此外,对于稀疏向量(即大多数元素为0的向量),可能需要使用特定的稀疏矩阵技术来优化性能。