转载请注明出处:http://www.cnblogs.com/zz-boy/p/3648878.html

更多精彩文章在:http://www.cnblogs.com/zz-boy/

最近看了Google在 WWW2007上发表的Scaling Up All Pairs Similarity Search,觉得还不错,分享一下作者的思路。

在基于用户协同过滤方法的推荐系统中,用户相似度的计算是最终推荐的基础步骤;用户向量是用户的行为向量,其每一维度是物品,值是用户对该物品的喜爱程度,这种场景尤其多见于电商网站,电商网站中的用户数据量是很大的,物品数量也很多,这就导致用户向量数量很大,如果不加优化的计算用户相似度,其时间开销是很大的。

我们给出相似度计算问题的定义:

有一个实数值向量集合U,x(v1,…,vn)是一个实数值向量且x属于U,相似度计算公式为sim(x,y),最终我们要得到的是(x,y,sim(x,y))的集合,其中x,y都属于U,并且sim(x,y)>=t.

可能刚开始看到这个问题,我们的直观的想法都是下面的这种蛮力的求解方法:

上面的方法没有经过任何的优化,t的作用仅仅体现在计算完成的相似度是否满足约束,其实仔细思考这个问题,t的作用不应该仅仅局限于此,我们在将x放入I时,或许可以考虑x是否会和余下的向量相似。基于这样的想法于是便有了下面改进的算法:

可以看到在上面的算法中,很关键的一行是

maxweighti(V)的含义是向量集合V中第i列的最大值,如果遍历完x,b的值仍然小于t,那么x就不可能和余下的向量相似,所以x就不应该被加入倒排表I。另外该算法开头部分对向量维度的重排,在该算法中看似没有什么效果,也就是说即使不重排,也不会影响算法的效率,要让开头语句起作用,上面的算法还要做一些小的改动,在循环

中,一旦判断出b>=t,那么式子

就不要再计算了,这样的改进如果能够提高效率是因为数据满足假设:

一个向量所有维的最大值出现在向量集合密集维度的可能性相对出现在稀疏维度更大。

这个假设不总是成立的,取决于数据集。

下面的算法对数据又加了一步预处理,将V集合按照maxweight(x)的降序排列。

上面算法精彩的几点如下:

  1. 后续将加入倒排表I的向量,所有维度的最大值必然小于maxweight(x),因为数据预处理中的排序步骤。

  2. 推导步骤:

    如果|y|*maxweight(x)<t那么y必然不可能再和后续的要加入倒排表中的向量相似。

    这里还要解释一下的是既然All-PAIRS-2中已经对能否加入倒排表中的向量进行了更加严格的限制,这里为什么还要对I进行筛除,这主要是因为对y进行处理时,是针对余下的所有x,当到对x进行处理,和y相似的所有向量都在y至x的处理序列之间,即y不可能再和x之后的向量相似了,所以当处理时对y进行的一个粗的筛选。

  3. remscore的作用主要体现在和语句

    的配合上,试想如果遍历到某一个i时,A[y]=0但是此时remscore却是小于t,那么必然有x不可能和y相似,所以也就没必要计算A[y]了。

  4. 此条语句是降序的原因:向量x的维度序列经过重排,当i降序时,维度稀疏性的变化为稀疏到密集,再结合语句

    便能做到最大限度的减少在密集维度中的计算次数。

更多精彩文章在:http://www.cnblogs.com/zz-boy/

大规模向量相似度计算方法(Google在07年发表的文章)的更多相关文章

  1. hadoop Mahout中相似度计算方法介绍(转)

    来自:http://blog.csdn.net/samxx8/article/details/7691868 相似距离(距离越小值越大) 优点 缺点 取值范围 PearsonCorrelation 类 ...

  2. Mahout实战---编写自己的相似度计算方法

    Mahout本身提供了很多的相似度计算方法,如PCC,COS等.但是当需要验证自己想出来的相似度计算公式是否是好的,这时候需要自己实现相似度类.研究了Mahout-core-0.9.jar的源码后,自 ...

  3. Mahout的taste里的几种相似度计算方法

    欧几里德相似度(Euclidean Distance) 最初用于计算欧几里德空间中两个点的距离,以两个用户x和y为例子,看成是n维空间的两个向量x和y,  xi表示用户x对itemi的喜好值,yi表示 ...

  4. McCabe环路复杂度计算方法

    环路复杂度用来定量度量程序的逻辑复杂度.以McCabe方法来表示. 在程序控制流程图中,节点是程序中代码的最小单元,边代表节点间的程序流.一个有e条边和n个节点的流程图F,可以用下述3种方法中的任何一 ...

  5. google在nature上发表的关于量子计算机的论文(Quantum supremacy using a programmable superconducting processor 译)— 附论文

    Google 2019年10月23号发表在Nature(<自然><科学>及<细胞>杂志都是国际顶级期刊,貌似在上面发文两篇,就可以评院士了)上,关于量子计算(基于 ...

  6. 自动下载google reader里面的星标文章

    1. google reader马上就要关闭了,最后一次看看俺的浏览记录吧 最近 30 天的统计信息 全部订阅: 367 已读条目: 151 已点击的条目:41 个 加星标条目: 16 已发电子邮件条 ...

  7. Google+团队如何测试移动应用 - from Google Testing Blog

    How the Google+ Team Tests Mobile Apps by Eduardo Bravo Ortiz “移动第一”在当下已成为很多公司的口头禅.但是能够用一种合理的方法来测试移动 ...

  8. Spark MLlib 之 大规模数据集的相似度计算原理探索

    无论是ICF基于物品的协同过滤.UCF基于用户的协同过滤.基于内容的推荐,最基本的环节都是计算相似度.如果样本特征维度很高或者<user, item, score>的维度很大,都会导致无法 ...

  9. 从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论

    1. 引言 - 近似近邻搜索被提出所在的时代背景和挑战 0x1:从NN(Neighbor Search)说起 ANN的前身技术是NN(Neighbor Search),简单地说,最近邻检索就是根据数据 ...

随机推荐

  1. RunLoop Note

    I. Begin from Apple Document Apple describes the priciples of runloop in Threading Programming Guide ...

  2. Python基础笔记系列十三:socket网络编程

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!!使用python编写一个简易的服务端程序和客户端程序,启动服务端和客户端(监 ...

  3. SPSS 分布类型的检验

    假设检验的标准步骤: 1.建立假设:根据问题的需要提出原假设H0,以及其对立面备择假设H1. 2.确立检验水准:即设立小概率事件的界值α. 3.进行试验:得到用于统计分析的样本,以该试验的结果作为假设 ...

  4. Outlook 配置qq邮箱账号

    最近想用Outlook 2013管理QQ邮件,配置好久都没有成功,结果最后发现第三方登陆QQ邮箱不使用QQ密码,而是使用一个叫”授权码”的东西.(用户名自动生成的,授权码就填这,报错后填会测试不通过) ...

  5. 【转发】Linux中设置服务自启动的三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

  6. 【nginx】一台nginx服务器多域名配置

    Nginx 多域名配置 nginx绑定多个域名可又把多个域名规则写一个配置文件里,也可又分别建立多个域名配置文件,我一般为了管理方便,每个域名建一个文件,有些同类域名也可又写在一个总的配置文件里.一. ...

  7. 数据库建表char(10)和VARCHAR(10)

    1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHA ...

  8. delphi ScriptGate 调用JS

    在 FireMonkey 使用 TWebBrowser 调用 Javascript函数并获取返回值以及 JavaScript 中调 Delphi 的函数/过程,普遍都在使用老掉牙的URL重定的方法,还 ...

  9. 19.并发容器之BlockingQueue

    1. BlockingQueue简介 在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除 ...

  10. idea maven install时,打包找不到微服务common中公用的包

    如题:其实很简单,在打包之前要先使项目通过编译,编译通过之后再打包就可以了. 附idea编译键: