前几天在一场报告中和同事聊到了高维向量的距离度量,大家讨论的点是:欧氏距离在高维下效果会非常差,那有没有其他更有效的方法?
当时第一时间想到了余弦相似度,印象中在文本相似度(文本匹配)度量中就是用的余弦相似度。而且在深度学习中,也经常通过计算两个向量的内积来表示相似程度。
然后同事说,余弦相似度只是欧氏距离的归一化表示,本质没有区别。当场懵逼:)
高维相似度量的讨论结果不重要了,最后再说,先说欧氏和余弦的问题。
闻道有先后,能发现问题令人兴奋;既然遇到了不懂的,慢慢搞懂就好了。
下面分享一下探索过程,来看看两者的“前世今缘”
part1: 前世
这部分是耳熟能详的
欧氏距离:
欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在N维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。
这个公式简单,很合理,很符合直觉,实践中被大量使用。
它还可以再推广一下,然后被称为闵可夫斯基距离
当p=2时,即为欧氏距离。(for fun,也许该叫毕氏距离,因为毕达哥拉斯定理 )
这个就不上图了,因为太简单了。
余弦相似度:
余弦相似度说着顺口,余弦距离只是做了个减法转化。
柿(式)子要从最简单的捏起。
余弦:
定义域是整个实数集,值域是[-1, 1]。它是周期函数,其最小正周期为 2π。在自变量为2kπ (k 为整数)时,该函数有极大值1;在自变量为(2k+1)π时,该函数有极小值-1。余弦函数是偶函数,其图像关于y轴对称。
余弦值:
两个向量间的余弦值可以通过使用欧几里得(是的,又有我)点积公式求出
余弦相似度:
OK,让我们假设向量a和向量b的长度均大于0,上面的式子请挪动一下
so,余弦相似度就是两个向量之间夹角的余弦值,取值范围自然是[-1,1]。
对于文本匹配,属性向量A和B通常是文档中的词频向量。余弦相似性,可以被看作是在比较过程中把文件长度正规化的方法。
由于一个词的频率(TF-IDF权)不能为负数(都在第一象限),所以这两个文档的余弦相似性范围是[0,1]。并且,两个词的频率向量之间的角度不能大于90°。
上个盗来的图:(from: https://www.cnblogs.com/lzhu/p/10405091.html)
余弦距离: dist(a, b) = 1 - similarity
如前面说的,只是减法的转换。为啥不直接取负,前面要用1减?
因为,这样的取值范围是[0,2],而直接取负,取值范围还是[-1,1],我距离和你相似度一样的取值范围,岂不是很没面子(距离非负性的要求)。
part2: 今缘
这部分是我之前不知道的
之前都没想过欧氏距离和余弦距离能有什么联系,因为物理意义上两者感觉毫无关系(一个是描述直线,一个是描述角度)。
这时候就是数学展现它美丽的时候了,一个复杂的问题,经过数学的洗礼,总是那么优美动人。(感动到出了双下巴:))
下面是大象装冰箱的三步:
1. 归一化:现在a,b的模长都经过了归一化处理(ok, 余弦距离的分母没了)
2. 一通推导:
过程改天补,先描述一下:
从左往右推到=》累计里的括号展开=》平方项放一块=》已归一化,所以平方部分累加值是1=》高等数学(1+1=2)=》交叉乘刚好可以写成内积(or余弦)=》提出系数=》OK
3. 关门:欧氏距离和余弦距离正相关。
终于,这三生三世的缘分,单靠直觉是无法got到的了。我还以为两者是一个人呢,原来只是一对情侣:你虽然拥有了我的肉体,但灵魂上只是一半(1/2次方)
最后说高维向量距离度量的讨论结果:
没好办法
降维?embedding?别闹,你的问题是啥来。