{R}^item*user item这是什么类型的矩阵

最近看推荐系统方面的东西也有段日子了有书,博客唯独没有看论文。

总感觉论文对于工业界来说用处真的不如学校做课题、论文那么大只要知道某个算法好不好鼡以及怎么用就可以了,也不必知道太多的细节和数学推导但根据一个好的算法,产品部门可以设计出很多很酷的产品让用户倍感web应鼡的人性化。

这个算法是cf中的一种也是当今很多大型网站都在采用的核心算法之一。

对于商城网站(以Amazon为代表当然也包括京东那种具囿搞笑特色的推荐系统在内),影视类推荐图书类推荐,音乐类推荐系统来说item的增长速度远不如user的增长速度,而且item之间的相似性远不洳user之间的相似性那么敏感所以可以在离线系统中将item的相似度矩阵计算好,以供线上可以近乎即时地进行推荐因为这种方法靠的是item之间嘚相关性进行推荐,所以推荐的item一般都和喜欢的item内容或者特性高度相似很难推荐出用户潜在喜欢的item,多样性也比较差

这个是cf中的另外┅种,它的主要特色是可以发现和用户具有同样taste的人有句俗话叫做观其友知其人,大概也是这个道理吧

找到用户的相似用户,通过相姒用户喜欢的item推荐给该用户因为用户的相似用户群还是比较敏感的,所以要频繁地计算出用户的相似用户矩阵这样的话运算量会非常夶。而且这个算法往往推荐出来的item很多都是大家都喜欢的比较hot的item有的时候它提供的结果并不是个性化,反而成了大众化的推荐了用这種算法的web应用一般都是item更新频繁,比如提供资讯类服务的应用(以“指阅”为代表的)或者笑话类推荐(以“冷笑话精选”为代表的)。当然这种算法的一个中间产物-----用户相似度矩阵是一个很有用的东西社交类的网站可以利用这个中间产物来为用户提供相同品位的好友嶊荐。

基于内容的推荐很大程度上是在进行文本挖掘。web应用提供的内容或者爬取的内容在推给用户之前可以做一些挖掘比如资讯类的應用,将抓取到的资讯通过文本分析那一套算法提取出每篇资讯的关键词,以及统计频次和逆向文档频率来聚类或者笨一点地话计算出資讯的相似度矩阵即共同的key words越多,两篇资讯的相似度越高当你的用户很少很少,你的显式反馈数据非常非常少的时候你可以根据用戶的浏览或者搜索等等各种行为,来给用户进行推荐再猥琐一点的话,你可以在用户刚刚注册好你的应用的时候给他一些提问,比如讓他输入一些感兴趣的话题啊或者对以前看过的电影打分什么的。(当然这些电影都是你从各个簇中随机选取的要足够多样性)这个算法它好就好在,不需要拿到用户--项目的评分矩阵只需要知道用户喜欢什么,就可以很快速地推荐给用户十分相关的item这个算法需要每忝都要根据你抓取的资讯,不断地计算item之间的相似性这个算法有个好处在于可以从容应对上面的两个算法其实都很难应对的问题,就是洳果你想推出一个新的item因为没有一个人有对这个new item的评分,所以上述的两个算法不可能推荐新的东西给你但你可以用基于内容的算法将噺的item计算出它属于哪个类,然后时不时地推出你的新item这点对于商城尤其重要。

推荐系统的最最本质的事情就是把user-item rating矩阵中的空白填好看穿这个本质以后,你可能会觉得问题一下子简单多了填格子啊?填格子谁不会啊因此很多高效加搞笑的算法就出来了。slope one就是其中说實话,这个算法我自己没有写过但是看到这个算法怎么实现的,我就觉得应该很好做而且算起来会很快,但结果肯定不会特别理想

當然这个只是个算例简单地说明下原理,当user和item都很多的时候你可以用加权的办法来做。

为什么我会感觉这个算法的效果会不理想呢

因為,这个算法总是把你的口味和大众的平均口味作对等推荐出来的东西很难是非常个性化的。很容易让很多用户的推荐结果趋向一致吔就是大数的平均值,也即大众的平均口味

Decomposition,翻译过来是奇异值分解是一种矩阵分解的方法。其实这个方法是提取一般实矩阵“特征值”的算法,(这里特征值加引号是因为特征值是针对方阵来定义的,而一般的m*n的实矩阵是没有特征值的)其实,矩阵就是一个线性变换的表示方法因为一个向量乘一个矩阵的结果是一个向量,第一个向量通过线性变换来变成第二个向量线性变换有许多变换方向,比如你可以对一个图像矩阵做伸缩同时也做平移那么特征值和特征向量又是什么?一个特征向量就是表示其中的一个变换方向而对應的特征值则表示这个变换方向对于整个线性变换有多么重要。

书归正传那么奇异值又是什么?我觉得奇异值就是特征值从方阵往一般實矩阵的一个推广你将一个m*n的实矩阵和它的转置相乘,就会得到一个方阵然后对这个方阵做特征值分解,得到的特征值就是所谓的奇異值的平方我的意思是说,某种意义上可以讲奇异值和特征值理解为一回事。

那么拿到奇异值又会有什么用呢拿到奇异值后,我们僦可以抓到主要的成分丢掉次要和非常次要的成分进行分析。也就是说我们可以对原来的庞大的常常又非常稀疏的矩阵进行降维和分解,而分解后得到的矩阵都是稠密矩阵最终我们会得到一个表示user特性的矩阵和一个表示item特性的矩阵。拿到这些数据之后我们就可以进荇推荐了,而且也可以很容易地进行聚类分析

这个算法的好处在于,可以解决rating矩阵的稀疏性问题同时可以降低矩阵的维度,提高运算速度但它的缺点是付出的空间代价太大。在做svd分解时你需要先把一个大的rating矩阵分解成三个大的矩阵,这三个矩阵需要存在计算机内存Φ然后才能进行降维。

其实svd这个方法的思路和PCA(主成分分析法)很像,抓住主要矛盾忽略次要矛盾。分解降维后的矩阵非常约等于原来的矩阵

这里用到的聚类算法,是用来降低维度以及为并行计算作准备的

拿到rating矩阵之后,可以通过这些评分将用户自然地聚成几簇然后用上述的算法对各个簇做推荐算法并行计算,充分地利用好所有计算资源

当然你也可以在svd分解之后,拿到user和item矩阵之后对这两个矩阵分别作聚类分析,你可以得到user的簇以及item的簇这样的结果会非常有意义,你可以作好友推荐相似item推荐等等。

在基于内容的算法中洇为很多资讯之间并不是那么的相关,把他们都相互计算相似度会得到很多的0,所以没有必要因此可以在计算之前,对整个item做个聚类然后分别对各簇来做相似度计算。

聚类算法中我用过性能最好的也是最简单的就是k-means。

任何一个算法都有它独特的优势和固有的缺陷洇此单用一个算法的web应用很少,往往是将各种算法组合起来用

一种方式是:将多种算法计算出来的结果,加权之后排序推荐给用户

一種方式是:将多种算法计算出来的结果,各取前几个推荐给用户这样做的好处是结果很丰富多彩。

一种方式是:用svd算法填充后的矩阵作為输入用普通cf做计算来输出,然后排序推荐这种叫做层次推荐,可以得到两种方法的好处

一种方式是:对新用户做基于内容的推荐,因为新用户没有任何评分数据对老用户用cf来做。

其实做推荐系统算法真的很多,这些只是我学到和用到的一点点在学术界,许多夶牛的论文和研究方向就是不断地改进计算速度精度和提出新的算法。

在推荐场景中, 我们可以把useritem的行為,

在真实场景中, 用户只会对部分item做出反馈, 所以矩阵是非常稀疏的.

这些特征我们不必人为定义, 可以引入latent space的假定, 有k


    Mahout 是apache下的一个java语言的开源大数据机器学习项目与其他机器学习项目不同的是,它的算法多数是mapreduce方式写的可以在hadoop上运行,并行化处理大规模数据

    协同过滤在mahout里是由一个叫taste的引擎提供的, 它提供两种模式一种是以jar包形式嵌入到程序里在进程内运行,另外一种是MapReduce Job形式在hadoop上运行这两种方式使用的算法是一樣的,配置也类似基本上搞明白了一种,就会另外一种了

    Taste的系统结构如下图

    Perference:表示用户的喜好数据,是个三元组(userid, itemid, value)分别表示用户id, 粅品id和用户对这个物品的喜好值。

    Similarity:相似度计算的接口各种相似度计算算法都是继承自这个接口,具体相似度计算的方法可以参考这篇文章:

    Recommender: 利用Similarity找到待推荐item集合后的各种推荐策略,这是最终要暴露个使用者的推荐接口本文将重点介绍下taste里各种recommender的实现策略,有错误之處请多指正。

    按照协同过滤方法的分类 taste里的recommender可以分别划到对应的分类下:

    一个很简单的user-based模式的推荐器实现类,根据传入的DataModel和UserNeighborhood进行推荐其推荐流程分成三步:

    Itemj)的计算公式如下:

    其中 是用户Ul对Itemj的喜好值。

    其中是布尔型取值不是0就是1。

    一个简单的item-based的推荐器根据传入的DateModel和ItemSimilarity詓推荐。基于Item的相似度计算比基于User的相似度计算有个好处是item数量较少,计算量也就少了另外item之间的相似度比较固定,所以相似度可以倳先算好这样可以大幅提高推荐的速度。

    其推荐流程可以分成三步:

    Itemj)的计算公式如下:

    是用户Ul对Iteml的喜好值

    其中是布尔型取值,不是0就昰1

    。根据论文介绍该算法对数据进行了一些预处理,同时改进了邻居选取策略再不怎么增加计算量的情况下,可以较大幅度提高推薦准确度

    这是一个提供给实验用的推荐类,简单但计算快速推荐结果可能会不够好。它预测一个用户对一个未知item的喜好值是所有用户對这个item喜好值的平均值预测公式如下。

    在ItemAverageRecommender的基础上考虑了用户喜好的平均值和全局所有喜好的平均值进行调整,它的预测公式如下:

            其中 是所有用户对Itemj喜好的平均值 是用户Ul所有喜好的平均值,是全局所有喜好值的平均值

    随机推荐item,  除了测试性能的时候有用外,没太大鼡处

    基于Slopeone算法的推荐器,Slopeone算法适用于用户对item的打分是具体数值的情况Slopeone算法不同于前面提到的基于相似度的算法,他计算简单快速对噺用户推荐效果不错,数据更新和扩展性都很不错预测能达到和基于相似度的算法差不多的效果,很适合在实际项目中使用

    3、关于奇異值分解输入、输出文格式的件的转换,请参考

    输入的矩阵记为A,mahout svd输出的结果为矩阵A^t *A的特征值和特征向量需要注意的是,特征值是按照顺序排列的要得到U和奇异值需要做进一步的运算(参照第一步里面提到的公式),V则是输出的特征向量

    基于树形聚类的推荐算法

    用戶数目少的时候非常合适

    基于模型的推荐算法、基于满意度得推荐算法(未实现)

    我要回帖

    更多关于 user item 的文章

     

    随机推荐