精华内容
参与话题
问答
  • 余弦相似度

    万次阅读 2017-09-06 10:48:01
    1余弦相似度 2理论推导 3一些特征情况分析 在机器学习算法中,有各种方式衡量用户或者物品的距离或者相似度,如曼哈顿距离、欧几里得距离、Pearson相关系数、Jaccard系数等(可参考...


    在机器学习算法中,有各种方式衡量用户或者物品的距离或者相似度,如曼哈顿距离、欧几里得距离、Pearson相关系数、Jaccard系数等(可参考http://blog.csdn.net/lin00jian/article/details/51209715),我们这里主要详细介绍一下余弦相似度。余弦相似度被广泛用于协同过滤算法中,尤其是Item-base的协同过滤。

    1、余弦相似度

    余弦相似度衡量的是2个向量间的夹角大小,通过夹角的余弦值表示结果,因此2个向量的余弦相似度为:

    cos⁡θ=A⋅B∣∣A∣∣∗∣∣B∣∣(1) \cos\theta=\frac{A\cdot B}{||A|| *||B||} \qquad(1) cosθ=ABAB(1)
    分子为向量A与向量B的点乘,分母为二者各自的L2相乘,即将所有维度值的平方相加后开方。
    余弦相似度的取值为[-1,1],值越大表示越相似。

    2、理论推导

    我们以二维向量为例,计算向量(x1,y1)(x_1,y_1)(x1,y1)与向量(x2,y2)(x_2,y_2)(x2,y2)的余弦相似度。
    先回顾一下初中的知识,一个三角形三条边的长度关系为:
    c2=a2+b2−2abcos⁡θ(2) c^2=a^2+b^2-2ab\cos\theta \qquad(2) c2=a2+b22abcosθ(2)
    其中:
    a2=x12+y12b2=x22+y22c2=(x1−x2)2+(y1−y2)2(3) \begin{aligned} a^2&=x_1^2+y_1^2 \\ b^2&=x_2^2+y_2^2 \\ c^2&=(x_1-x_2)^2+(y_1-y_2)^2 \end{aligned} \qquad(3) a2b2c2=x12+y12=x22+y22=(x1x2)2+(y1y2)2(3)
    于是,我们可以得到:
    cos⁡θ=a2+b2−c22ab=2(x1x2+y1y2)2x12+y12x22+y22=A⋅B∣∣A∣∣∗∣∣B∣∣(4) \begin{aligned} \cos\theta &=\frac{a^2+b^2-c^2}{2ab}\\ &=\frac{2(x_1x_2+y_1y_2)}{2\sqrt{x_1^2+y_1^2}\sqrt{x_2^2+y_2^2}}\\ &=\frac{A\cdot B}{||A|| *||B||} \qquad(4) \end{aligned} cosθ=2aba2+b2c2=2x12+y12x22+y222(x1x2+y1y2)=ABAB(4)
    其中A与B表达向量(x1,y1)(x_1,y_1)(x1,y1)与向量(x2,y2)(x_2,y_2)(x2,y2)
    分子为A与B的点乘,分母为二者各自的L2相乘,即将所有维度值的平方相加后开方。

    3、一些特征情况分析

    (1)夹角为0度
    此时向量A与向量B应该是最相似的,余弦相似度应该为1。按照公式(4),我们计算很容易计算出来cos⁡θ=1\cos \theta = 1cosθ=1

    (2)夹角为90度
    此时余弦相似度为0。

    (3)夹角为180度
    此时余弦相似度为-1,2个向量的方向完全相反。

    展开全文
  • 余弦相似度和调整的余弦相似度

    千次阅读 2019-06-19 10:41:49
    余弦相似度和adjust 余弦相似度 度量两个信息实体之间的相似性或距离是所有信息发现任务(无论是IR还是数据挖掘)的核心需求。采用适当的措施不仅可以提高信息选择的质量,而且有助于减少时间和处理成本。这些措施可能...

    余弦相似度和adjust 余弦相似度
    度量两个信息实体之间的相似性或距离是所有信息发现任务(无论是IR还是数据挖掘)的核心需求。采用适当的措施不仅可以提高信息选择的质量,而且有助于减少时间和处理成本。这些措施可能会被使用,例如,剽窃检测。余弦相似度是文本挖掘和信息检索中常用的基于向量的相似度度量方法。该方法将比较字符串转化为向量空间,利用欧几里德余弦规则计算相似度。这种方法通常与其他方法相结合来限制向量空间的维数。余弦相似度是内积空间中两个非零向量之间的相似度的度量,度量它们之间夹角的余弦值。例如,在信息检索和文本挖掘中,每个术语在理论上被分配一个不同的维度,而一个文档的特征是一个向量,其中每个维度的值对应于该术语在文档中出现的次数。然后,余弦相似性给出了一个有用的度量方法,来衡量两个文档在主题方面有多相似。皮尔逊相似度度量是基于一对物品的普通用户的评分与这些物品的平均评分的偏离程度。调整余弦相似度度量是基于向量的相似度的一种改进形式,我们考虑到不同的用户有不同的评分方案;换句话说,一些用户可能会对条目进行高评分,而另一些用户可能会将较低的评分作为首选。为了从基于向量的相似性中消除这个缺陷,我们从每个用户对相关项的评分中减去每个用户的平均评分。余弦方法为度量提供了一种类型的贝叶斯正则化,确保相似性不完全由两个用户共有的项的子集(可能很小)决定。这在皮尔逊相关性中并不存在(尽管它可以通过显著性加权来添加),因此,在用户个人资料中往往有非常不同的条目集的上下文中,皮尔逊(未经纠正的)的表现原则上会更差。皮尔逊相关就是减去平均值后的余弦相似度。这很重要,因为均值代表总体积。如果总体积是有实质意义的,那么您将希望使用余弦相似性(或某种保持总体积的度量)。然而,通常它并没有什么实质性的意义,删除它是可取的。“调整余弦”相似性是通过在计算余弦公式之前减去平均值来实现的。从这个意义上说,调整后的余弦函数与皮尔逊相关函数有相同的数学公式。然而,如果公式应用不同,即使用的评级集不相同,则结果将不匹配。

    展开全文
  • 余弦相似度 pythonWhat is cosine similarity?什么是余弦相似度? Cosine similarity measures the similarity between two vectors by calculating the cosine of the angle between the two vectors. 余弦相似度...

    余弦相似度 python

    What is cosine similarity?

    什么是余弦相似度?

    Cosine similarity measures the similarity between two vectors by calculating the cosine of the angle between the two vectors.

    余弦相似度通过计算两个向量之间的角度的余弦值来衡量两个向量之间的相似度。

    Cosine similarity is one of the most widely used and powerful similarity measure in Data Science. It is used in multiple applications such as finding similar documents in NLP, information retrieval, finding similar sequence to a DNA in bioinformatics, detecting plagiarism and may more.

    余弦相似度是数据科学中使用最广泛,功能最强大的相似度之一。 它可用于多种应用程序,例如在NLP中查找相似的文档,信息检索,在生物信息学中查找与DNA相似的序列,检测抄袭等等。

    Cosine similarity is calculated as follows,

    余弦相似度计算如下:

    Image for post
    Angle between two 2-D vectors A and B (Image by author)
    两个二维向量A和B之间的角度(作者提供的图片)
    Image for post
    calculation of cosine of the angle between A and B
    A和B之间的夹角余弦的计算

    Why cosine of the angle between A and B gives us the similarity?

    为什么A和B之间的夹角余弦会给我们相似性?

    If you look at the cosine function, it is 1 at theta = 0 and -1 at theta = 180, that means for two overlapping vectors cosine will be the highest and lowest for two exactly opposite vectors. You can consider 1-cosine as distance.

    如果查看余弦函数,则在theta = 0处为1,在theta = 180处为-1,这意味着对于两个重叠的向量,余弦将是两个完全相反的向量的最高和最低值。 您可以将1-cosine作为距离。

    Image for post
    cosine(Image by author)
    余弦(作者提供)
    Image for post
    values of cosine at different angles (Image by author)
    不同角度的余弦值(作者提供)

    How to calculate it in Python?

    如何在Python中计算?

    The numerator of the formula is the dot product of the two vectors and denominator is the product of L2 norm of both the vectors. Dot product of two vectors is the sum of element wise multiplication of the vectors and L2 norm is the square root of sum of squares of elements of a vector.

    公式的分子是两个向量的点积,分母是两个向量的L2范数的乘积。 两个向量的点积是向量在元素上的乘积之和,而L2范数是向量的元素平方和的平方根。

    We can either use inbuilt functions in Numpy library to calculate dot product and L2 norm of the vectors and put it in the formula or directly use the cosine_similarity from sklearn.metrics.pairwise. Consider two vectors A and B in 2-D, following code calculates the cosine similarity,

    我们可以使用Numpy库中的内置函数来计算向量的点积和L2范数并将其放入公式中,也可以直接使用sklearn.metrics.pairwise中的cosine_similarity。 考虑二维中的两个向量A和B,下面的代码计算余弦相似度,

    import numpy as np
    import matplotlib.pyplot as plt# consider two vectors A and B in 2-D
    A=np.array([7,3])
    B=np.array([3,7])ax = plt.axes()ax.arrow(0.0, 0.0, A[0], A[1], head_width=0.4, head_length=0.5)
    plt.annotate(f"A({A[0]},{A[1]})", xy=(A[0], A[1]),xytext=(A[0]+0.5, A[1]))ax.arrow(0.0, 0.0, B[0], B[1], head_width=0.4, head_length=0.5)
    plt.annotate(f"B({B[0]},{B[1]})", xy=(B[0], B[1]),xytext=(B[0]+0.5, B[1]))plt.xlim(0,10)
    plt.ylim(0,10)plt.show()
    plt.close()# cosine similarity between A and B
    cos_sim=np.dot(A,B)/(np.linalg.norm(A)*np.linalg.norm(B))
    print (f"Cosine Similarity between A and B:{cos_sim}")
    print (f"Cosine Distance between A and B:{1-cos_sim}")
    Image for post
    Code output (Image by author)
    代码输出(作者提供的图像)
    # using sklearn to calculate cosine similarity
    from sklearn.metrics.pairwise import cosine_similarity,cosine_distancescos_sim=cosine_similarity(A.reshape(1,-1),B.reshape(1,-1))
    print (f"Cosine Similarity between A and B:{cos_sim}")
    print (f"Cosine Distance between A and B:{1-cos_sim}")
    Image for post
    Code output (Image by author)
    代码输出(作者提供的图像)
    # using scipy, it calculates 1-cosine
    from scipy.spatial import distancedistance.cosine(A.reshape(1,-1),B.reshape(1,-1))
    Image for post
    Code output (Image by author)
    代码输出(作者提供的图像)

    Proof of the formula

    公式证明

    Cosine similarity formula can be proved by using Law of cosines,

    余弦相似度公式可以用余弦定律证明,

    Image for post
    Law of cosines (Image by author)
    余弦定律(作者提供图片)

    Consider two vectors A and B in 2-dimensions, such as,

    考虑二维的两个向量A和B,例如,

    Image for post
    Two 2-D vectors (Image by author)
    两个二维矢量(作者提供的图片)

    Using Law of cosines,

    利用余弦定律,

    Image for post
    Cosine similarity using Law of cosines (Image by author)
    使用余弦定律的余弦相似度(作者提供的图片)

    You can prove the same for 3-dimensions or any dimensions in general. It follows exactly same steps as above.

    通常,您可以证明3维或任何尺寸的相同。 它遵循与上述完全相同的步骤。

    Summary

    概要

    We saw how cosine similarity works, how to use it and why does it work. I hope this article helped in understanding the whole concept behind this powerful metric.

    我们了解了余弦相似度如何工作,如何使用它以及为什么起作用。 我希望本文有助于理解这一强大指标背后的整个概念。

    翻译自: https://towardsdatascience.com/cosine-similarity-how-does-it-measure-the-similarity-maths-behind-and-usage-in-python-50ad30aad7db

    余弦相似度 python

    展开全文
  • 余弦相似度简介 余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。对于两个向量,可以想象成空间中的两条线段,都是从原点([0, 0, ...])出发,指向不同的方向。两条线段之间...

    一.余弦相似度简介

    余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。对于两个向量,可以想象成空间中的两条线段,都是从原点([0, 0, ...])出发,指向不同的方向。两条线段之间形成一个夹角:如果夹角为0度,则意味着方向相同、线段重合;如果夹角为90度,意味着形成直角,方向完全不相似;如果夹角为180度,意味着方向正好相反。因此,可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。

    对n维向量A,B,假设A= [A1, A2, ..., An] ,B= [B1, B2, ..., Bn] ,则A与B的夹角θ的余弦等于:\cos\Theta =\frac{A\cdot B}{|A|\cdot |B|}=\tfrac{\sum_{n}^{i=1}(A_{i}\times B_{i})}{\sqrt{\sum_{n}^{i=1}(A_{i})^{2}}\times \sqrt{\sum_{n}^{i=1}(B_{i})^{2}}}

    余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越接近;越趋近于-1,他们的方向越相反;接近于0,表示两个向量近乎于正交。

    一般情况下,相似度都是归一化到[0,1]区间内,因此余弦相似度表示为 cosine_similarity = 0.5cosθ + 0.5

    二.余弦相似度与欧式距离的区别

    欧氏距离衡量的是空间各点的绝对距离,跟各个点所在的位置坐标直接相关;而余弦距离衡量的是空间向量的夹角,更加体现在方向上的差异,而不是位置。

    余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异。

    欧氏距离和余弦距离各自有不同的计算方式和衡量特征,因此它们适用于不同的数据分析模型:

    1.欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。

    2.余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。

    2.1调整余弦相似度:

    正因为余弦相似度在数值上的不敏感,会导致这样一种情况存在:

    用户对内容评分,按5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得到的结果是0.98,两者极为相似。但从评分上看X似乎不喜欢2这个 内容,而Y则比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性就出现了调整余弦相似度,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8,相似度为负值并且差异不小,但显然更加符合现实。

    三.余弦相似度的python实现

    方法一:

    def cosine_similarity(x, y, dim=256):
        xx = 0.0
        yy = 0.0
        xy = 0.0
        for i in range(dim):
            xx += x[i] * x[i]
            yy += y[i] * y[i]
            xy += x[i] * y[i] 
        xx_sqrt = xx ** 0.5
        yy_sqrt = yy ** 0.5
        cos = xy/(xx_sqrt*yy_sqrt)*0.5+0.5
        return cos

    方法二:

    import numpy as np
    
    def cosine_similarity(x,y):
        num = x.dot(y.T)
        denom = np.linalg.norm(x) * np.linalg.norm(y)
        return num / denom

    方法三:

    def cosine_similarity(x, y, norm=False):
        assert len(x) == len(y), "len(x) != len(y)"
        zero_list = [0] * len(x)
        if x == zero_list or y == zero_list:
            return float(1) if x == y else float(0)
    
        res = np.array([[x[i] * y[i], x[i] * x[i], y[i] * y[i]] for i in range(len(x))])
        cos = sum(res[:, 0]) / (np.sqrt(sum(res[:, 1])) * np.sqrt(sum(res[:, 2])))
    
        return 0.5 * cos + 0.5 if norm else cos 
    展开全文
  • 修正余弦相似度,指中心化(减去平均值)后再求余弦相似度。1. 从数学角度看,给定向量X和Y,Pearson相关系数和修正余弦相似度的计算是相同的,它们的关系参考下面的链接: ...
  • 看starspace的时候发现它实现了dot和cos两种similarity的度量方式,这里总结一下:余弦相似度衡量两个向量在方向上的相似性,而不care两个向量的实际长度,A和B的长度即使是一个超级短一个超级长的情况下,二者的...

空空如也

1 2 3 4 5 ... 20
收藏数 2,266
精华内容 906
关键字:

余弦相似度