相似度算法余弦相似度
相似度算法余弦相似度
余弦距离,也称作余弦相似度,使用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小度量
余弦值越接近于1,就表明夹角越接近0度,也就是两个向量越接近,这就叫做余弦相似性
计算方法 计算夹角,
1.直角三角形计算是cos=a/b 临边比对边
2.非直角三角形计算公式为:
3.向量表示的三角形中,向量a和向量b的夹角余弦计算如下:
4.如果向量a,b不是二维,二是n维,方法依然合适,
余弦值越接近余1,就表明夹角越接近于0,也就是两个向量越相似
另外:余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异。
借助三维坐标系来看下欧氏距离和余弦距离的区别:
从上图可以看出,欧氏距离衡量的是空间各点的绝对距离,跟各个点所在的位置坐标直接相关;而余弦距离衡量的是空间向量的夹角,更加体现在方向上的差异,而不是位置。如果保持A点位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦距离 clip_image011 是保持不变的(因为夹角没有发生变化),而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦距离之间的不同之处。
欧氏距离和余弦距离各自有不同的计算方式和衡量特征,因此它们适用于不同的数据分析模型:
欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。
余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。
正因为余弦相似度在数值上的不敏感,会导致这样一种情况存在:
用户对内容评分,按5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得到的结果是0.98,两者极为相似。但从评分上看X似乎不喜欢2这个 内容,而Y则比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性就出现了调整余弦相似度,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8,相似度为负值并且差异不小,但显然更加符合现实。
那么是否可以在(用户-商品-行为数值)矩阵的基础上使用调整余弦相似度计算呢?从算法原理分析,复杂度虽然增加了,但是应该比普通余弦夹角算法要强。
下面举一个例子,来说明余弦计算文本相似度】
举一个例子来说明,用上述理论计算文本的相似性。为了简单起见,先从句子着手。
句子A:这只皮靴号码大了。那只号码合适
句子B:这只皮靴号码不小,那只更合适
怎样计算上面两句话的相似程度?
基本思路是:如果这两句话的用词越相似,它们的内容就应该越相似。因此,可以从词频入手,计算它们的相似程度。
第一步,分词。
句子A:这只/皮靴/号码/大了。那只/号码/合适。
句子B:这只/皮靴/号码/不/小,那只/更/合适。
第二步,列出所有的词。
这只,皮靴,号码,大了。那只,合适,不,小,很
第三步,计算词频。
句子A:这只1,皮靴1,号码2,大了1。那只1,合适1,不0,小0,更0
句子B:这只1,皮靴1,号码1,大了0。那只1,合适1,不1,小1,更1
第四步,写出词频向量。
句子A:(1,1,2,1,1,1,0,0,0)
句子B:(1,1,1,0,1,1,1,1,1)
到这里,问题就变成了如何计算这两个向量的相似程度。我们可以把它们想象成空间中的两条线段,都是从原点([0, 0, …])出发,指向不同的方向。两条线段之间形成一个夹角,如果夹角为0度,意味着方向相同、线段重合,这是表示两个向量代表的文本完全相等;如果夹角为90度,意味着形成直角,方向完全不相似;如果夹角为180度,意味着方向正好相反。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。
使用上面的公式(4)
计算两个句子向量
句子A:(1,1,2,1,1,1,0,0,0)
和句子B:(1,1,1,0,1,1,1,1,1)的向量余弦值来确定两个句子的相似度。
计算过程如下:
计算结果中夹角的余弦值为0.81非常接近于1,所以,上面的句子A和句子B是基本相似的
由此,我们就得到了文本相似度计算的处理流程是:
(1)找出两篇文章的关键词;
(2)每篇文章各取出若干个关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频
(3)生成两篇文章各自的词频向量;
(4)计算两个向量的余弦相似度,值越大就表示越相似。
代码实现如下:
#余弦相似度算法
def CosSimilarity(UL,p1,p2):si = GetSameItem(UL,p1,p2)n = len(si)if n == 0:return 0s = sum([UL[p1][item]*UL[p2][item] for item in si])den1 = math.sqrt(sum([pow(UL[p1][item],2) for item in si]))den2 = math.sqrt(sum([pow(UL[p2][itme],2) for item in si]))return s/(den1*den2)
相似度算法余弦相似度相关推荐
- 相似度算法--余弦相似度
转载:http://blog.csdn.net/u012160689/article/details/15341303 余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间 ...
- Jackcard相似度和余弦相似度(向量空间模型)的java实现
版权声明:本文为博主原创文章,地址:http://blog.csdn.net/napoay,转载请留言. 总结Jackcard相似度和余弦相似度. 一.集合的Jackcard相似度 1.1Jackca ...
- cos相似度算法 余弦距离计算
定义 余弦距离,也称余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体之间差异大小的度量.我们知道在数学领域内,cosθ 的值越接近 1,此时两个向量的夹角 θ 越接近 0度,表明这两个向 ...
- 向量点积衡量相似度_点积相似度、余弦相似度、欧几里得相似度
看starspace的时候发现它实现了dot和cos两种similarity的度量方式,这里总结一下: 余弦相似度衡量两个向量在方向上的相似性,而不care两个向量的实际长度,A和B的长度即使是一个超 ...
- mysql数据相似度算法_相似度计算方法
相似度就是比较两个事物的相似性.一般通过计算事物的特征之间的距离,如果距离小,那么相似度大:如果距离大,那么相似度小. 问题定义:有两个对象X,Y,都包含N维特征,X=(x1,x2,x3,...,xn ...
- 标题相似度算法_相似度计算方法
相似度就是比较两个事物的相似性.一般通过计算事物的特征之间的距离,如果距离小,那么相似度大:如果距离大,那么相似度小. 问题定义:有两个对象X,Y,都包含N维特征,X=(x1,x2,x3,...,xn ...
- 相似度计算——余弦相似度
余弦相似度用向量空间中两向量夹角的余弦值作为衡量两个个体之间差异的大小.余弦值越接近1,表明两个向量的夹角越接近0度,则两个向量越相似. 我们把两个向量,向量a和向量b的夹角叫做θ,那么根据余弦定理可 ...
- mysql计算余弦相似度_余弦相似度公式及推导案例
定义 余弦相似度通过测量两个向量的夹角的余弦值来度量它们之间的相似性.0度角的余弦值是1,而其他任何角度的余弦值都不大于1:并且其最小值是-1.从而两个向量之间的角度的余弦值确定两个向量是否大致指向相 ...
- 文本相似度算法Jaccard相似度(杰卡德相似度)java实现
文本相似度算法 杰卡德相似度,指的是文本A与文本B中交集的字数除以并集的字数,公式非常简单: java代码 import java.util.HashSet; import java.util.Sca ...
最新文章
- 深入剖析HADOOP程序日志
- sata接口测试软件,方便用户,技嘉放出6系列主板SATA接口检测软件
- 【初印象】Android手机屏幕适配API:nodpi,xhdpi,hdpi,mdpi,ldpi
- linux(3):Linux MBR分区、挂载操作步骤,逻辑卷扩容操作
- 即席查询Presto
- mysql高可用架构_MySQL高可用架构对比
- myeclipse 运行servlet
- Atitit 软件 开发 与互联网发展趋势 与一些原则 潮流就是社区化 o2o 各种服务化 xaas ##--------信息化建设的理念 1.1.兼容性(不同版本与项目兼容性有利
- tcflush()用法 以及 Termios 介绍
- DNS介绍,哪个好,速度快稳定
- FlashFXP命令行
- 什么是HTML语义化标签?为什么要用H5语义化标签?HTML5语义化标签有哪些
- 【JavaWeb】Servlet系列——HttpServletRequest接口详解
- 通过浏览器响应实现excel导出
- C语言:实现三重缓冲区(附完整源码)
- 微信小程序视图控件与bindtap之间的问题的解决
- GO语言基础进阶教程:sync包——WaitGroup
- Lumerical Suite 2015a windows_linux光学设计软件
- 浅析用户角色与用户画像
- Go+ 写文件方法教程(4.15)