余弦相似度简单介绍
余弦相似度原理
余弦相似度是一种衡量两个向量之间相似性的方法,它基于向量之间的夹角余弦值来计算。在文本挖掘、推荐系统等领域,余弦相似度被广泛应用来度量文档、用户偏好等对象之间的相似性。
定义
余弦相似度通过计算两个向量之间的夹角余弦值来衡量它们的相似性。余弦值越接近1,夹角越小,说明两个向量越相似;余弦值越接近-1,夹角越大,说明两个向量越不相似;余弦值为0时,两个向量正交,表示它们之间没有相关性。
引伸义
余弦相似度在推荐系统、文本分类、信息检索等领域有广泛应用。例如,在推荐系统中,可以通过计算用户的历史偏好向量和物品特征向量之间的余弦相似度,来推荐与用户兴趣最相似的物品。
数据分析
数据准备:首先,我们需要准备两个向量,这些向量可以代表文本、用户偏好、物品特征等。例如,我们有两个用户U1和U2的评分向量,分别表示他们对不同物品的评分。
U1: [5, 3, 0, 1, 4]
U2: [4, 2, 1, 0, 5]
计算点积:然后,我们计算这两个向量的点积。
A = [5, 3, 0, 1, 4]
B = [4, 2, 1, 0, 5]
A ⋅ B = 5*4 + 3*2 + 0*1 + 1*0 + 4*5 = 20 + 6 + 0 + 0 + 20 = 46
计算模长:接下来,我们分别计算这两个向量的模长。
||A|| = √(5^2 + 3^2 + 0^2 + 1^2 + 4^2) = √(25 + 9 + 0 + 1 + 16) = √51
||B|| = √(4^2 + 2^2 + 1^2 + 0^2 + 5^2) = √(16 + 4 + 1 + 0 + 25) = √46
计算余弦相似度:最后,我们用点积除以两个向量模长的乘积,得到余弦相似度。
Cosine Similarity = (A ⋅ B) / (||A|| * ||B||) = 46 / (√51 * √46) ≈ 0.976
Java示例代码
当使用Java来计算两个向量之间的余弦相似度时,你需要确保两个向量的长度是相同的。以下是一个简单的Java示例代码,用于计算两个double数组(表示向量)之间的余弦相似度:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | public class CosineSimilarityCalculator { /** * 计算两个向量的余弦相似度 * * @param vectorA 第一个向量 * @param vectorB 第二个向量 * @return 余弦相似度 * @throws IllegalArgumentException 如果两个向量的长度不同 */ public static double cosineSimilarity( double [] vectorA, double [] vectorB) { if (vectorA.length != vectorB.length) { throw new IllegalArgumentException( "两个向量的长度必须相同" ); } 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 ); } // 计算模长 double magnitudeA = Math.sqrt(normA); double magnitudeB = Math.sqrt(normB); // 防止除以0 if (magnitudeA == 0 || magnitudeB == 0 ) { return 0.0 ; // 如果其中一个向量为零向量,则余弦相似度为0 } // 计算余弦相似度 return dotProduct / (magnitudeA * magnitudeB); } public static void main(String[] args) { double [] vectorA = { 5 , 3 , 0 , 1 , 4 }; double [] vectorB = { 4 , 2 , 1 , 0 , 5 }; try { double similarity = cosineSimilarity(vectorA, vectorB); System.out.println( "Cosine Similarity: " + similarity); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } } |
在这个示例中,cosineSimilarity 方法接受两个 double 数组作为参数,并返回它们的余弦相似度。如果两个向量的长度不同,它将抛出一个 IllegalArgumentException。在 main 方法中,我们创建了两个示例向量,并调用了 cosineSimilarity 方法来计算并打印它们的余弦相似度。
常见的相似度计算方法
余弦相似度(Cosine Similarity)
皮尔逊相关系数
曼哈顿距离(Manhattan Distance)
欧氏距离(Euclidean Distance)
Jaccard相似度
修正余弦相似度(Adjusted Cosine Similarity)
皮尔逊χ²检验(Pearson's Chi-squared Test)
互信息(Mutual Information, MI)
Tanimoto系数(Tanimoto Coefficient)
切比雪夫距离(Chebyshev Distance)
汉明距离(Hamming Distance)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
2019-05-29 Sitecore安全:访问权限