@
snowhere 昨天有个朋友问了一个挺有意思的问题,“珍爱网的相似度匹配分析是怎么做的?”。不是内部员工,只能简单猜测下他们的实现方法,珍爱网的匹配分析就是比较两个人的“我的心灵视界”中各个维度的相似度,也就是图中两个曲线的相似度,包括但不仅限于性格、追求、独立程度等维度。一个直观的想法是首先把每个人的“我的心灵视界”数据抽象成一个高维的向量,向量的每一维就对应了数据中的一项。为了简化问题,我们假设只有两个维度,性格和追求。每一维最正向的值设为 1 ,最反向的值设为 0 。现在来了一个小赵,他性格是极端外向,追求是极端知足,那么代表他的向量就是[1,0]。又来了一个小钱,她性格是极端内向,追求是极端追求,那么她的向量就是[0,1]。之后我们只需要比较这两个向量的相似度就好了,一个先想到的做法是利用余弦定理来计算,回忆一下,对应向量 a 和 b ,cosθ=a*b/|a||b|,*是向量点击运算,cos 值在[0,π]内是一个 0 到 1 之间的数,正好可以换算成百分数作为相似度。以上面的虚拟人物为例,可以得到 cosθ=0 ,也就是他们相似度为 0%。如果又来了一个小孙,她的向量是[1,0],那么她和小赵的 cosθ=1 ,也就是 100%,符合认知。那么这种做法有问题吗,其实是有的。现在又来了一个小李,她的向量是[0.5,0],表示她中等外向,然后极端知足,这时候利用余弦定理也会得到 100%的相似度,这其实是不太符合直觉的。这是因为余弦定理只是比较两个向量的夹角,并没有考虑两个向量的量级(magnitude),而在珍爱网匹配分析中,其实量级是有比较大的影响的。因此一个更好更简单的做法是直接比较两个向量的 L1 距离,那么对于[0.5,0]和[1,0],L1 距离就是|0.5-1|+|0-0|=0.5 ,然后再除以最大可能的 L1 距离 2 ,可以得到相似度 25%。这样得到的值比较低 ,珍爱网里面肯定会加一个正向偏移量,让值不会太难看。那么什么时候适合用余弦相似度呢,在对向量的量级不是特别敏感的时候可以使用,比如计算两个文档的相似度,比如文档 A 里面“单身狗”,“孤独”,“悲惨”分别出现了 666 ,233 ,88 次,文档 B 中这三词分别出现了 333 ,116 ,44 次,我们其实可以知道这两篇文章都是讲述感情的,只是篇幅长短不同而已,所以相似度应该是 90%以上的,如果用 L1 、L2 距离就会得到一个不恰当的相似度值。
有一种算法叫 simhash ,基本原理就是傅里叶变换处理声波的形状,向上用 1 表示,向下用 0 表示,然后所有的形状就可以用 64 位的 long 表示,再根据海明距离,算出相似度,这种算法速度很快,几百万的歌曲才用几十毫秒。
目标数=1000 从集合中直接找和目标数相等的数;有的话直接返回;集合排序,截取小于目标数的部分出来=新集合
新集合中 找到目标数 /2 的数的插入位置,取此位置前后的两个数
我找到了这些,和你说的好像差不多,看起来网上没有明确的算法或者公式