Mahout in Action 学习---基于物品的分布式推荐算法(Wikipedia数据集)

文字总结自《Mahout in Action》中文版第六章的内容

1.1 数据集介绍

Wikipedia数据集:一篇文章到另外一篇文章的链接。

可以将文章看作是用户,将该文章指向的文章视为该源文章所喜欢的物品

类型:单向布尔型偏好。

相似性评估算法:LogLikelihoodSimilarity

关于LogLikelihoodSimilarity具体算法思想见:

对数似然比相似度 - xidianycy - 博客频道 - CSDN.NET http://blog.csdn.net/u014374284/article/details/49823557

1.2 设计一个基于物品的分布式推荐算法

1.2.1 构建共现矩阵

回顾在计算物品之间相似度的方法,要计算出每个物品对之间的相似性,并将其结果倒入一个巨大的矩阵。矩阵应该是一个方阵,其行和列的数目等于数据模型中的物品数。表达一个物品和其他物品之间的相似性。该矩阵式沿对角线对称的,因为物品X和Y之间的相似性与物品Y和X之间的相似性是一样的。(注意,此举矩阵式物品-物品矩阵,在本例中,即为文章指向的文章 和文章指向的文章的共现矩阵)

共现矩阵(co-occurrence matrix):不是计算每个物品对之间的相似性,而是计算在某些用户偏好值列表中每个物品对共同出现的次数。例如:如果有9个用户都对物品X和Y表达了偏好,那么X和Y共同出现了9次。两个在任何用户偏好中均为同时出现的物品,其共现次数为0。注意,每当用户给出对某个物品的偏好,就代表物品与自身共生了一次,不过这个计数并没有什么用处。

共现关系可以看成是一种相似性:两个物品同时出现的次数越多,它们越有可能相关或者相似。共现矩阵的作用类似于物品的ItemSimilarity。

表1给出了一个小的偏好值样本集生成的共现矩阵,

可以看出,该矩阵是对角线对称的。因为有7个物品,所以矩阵式7*7的方阵。对角线上的数值对于算法没有意义。

1.2.2 计算用户向量

将一个用户的偏好视为一个向量。在一个有n个物品的数据模型中,用户偏好就像一个N维向量,每个维度代表一个物品,用户对于物品的偏好值就是这个向量中的值。若用户没有表达过偏好,则为0。这是一个典型的稀疏矩阵,大多数为0,因为用户通常仅对一小部分物品表达过偏好。例如,在这个小型样本数据集中,用户3的偏好对应向量[2.0,0.0,0.0,4.0,4.5,0.0,5.0]。意思为用户3对于101-107的偏好值分别为2.0,0.0,0.0,4.0,4.5,0.0,5.0。要生成推荐结果,每个用户都需要这样一个向量。

1.2.3 生成推荐结果

将每个用户的向量和共现矩阵相乘,即可得到最终推荐结果。这里还是仅仅以用户U3为例。

可以从结果向量R中直接得到推荐结果:在R中最大值对应于最佳的推荐。

仍然以用户3为例,忽略物品101,104,105和107的值,因为用户已经表达过偏好,就不需要再推荐。剩下的,物品103最高,所以是最佳推荐。其次是102和106。

1.2.4 结果分析

直观而言,如果物品103和那些用户3表达过偏好的物品存在共现关系,说明物品103和用户3喜欢的物品很相似,最终的结果包含了大的偏好值和大的共现值之间的乘积,这就是R中较大的值会对应较好推荐的原因。

注意,R中的值并不代表一个估计偏好值,在理想情况下,应该利用一些额外的信息将它们归一化为估计偏好值。

时间: 2024-08-27 02:30:46

Mahout in Action 学习---基于物品的分布式推荐算法(Wikipedia数据集)的相关文章

基于请求的分布式互斥算法

一个悲剧的文章,研究的东西确实比较老,但是因为这些研究,让我对分布式的底层的关系有了更加清晰的认识,也算是不枉此功. 下面贴出来核心的部分. 引言 分布式系统中的一组进程可能会同时访问一个资源或者同时执行一个给定的函数,我们称这些资源或者函数为临界区(Critical Section),若不加控制的话,会造成资源或者环境的不一致的现象.保证任何给定时刻只允许一个进程或者给定的进程去执行临界区的算法称为互斥算法.互斥也可以称为并发控制. 这个问题最早由Dijkstra[1]在1965年提出.互斥可

推荐算法之基于物品的协同过滤算法

基于物品的协同过滤算法(ItemCF)是业界应用最多的算法,主要思想是利用用户之前有过的行为,给用户推荐和之前物品类似的物品. 基于物品的协同过滤算法主要分为两步: 1)计算物品之间的相似度. 2)依据物品的相似度和用户的历史行为给用户生成推荐列表. 第一步的关键点在于计算物品之间的相似度,这里并不採用基于内容的相似性,而是去计算在喜欢物品i的用户中有多少是喜欢物品j的,这样计算的前提是用户的兴趣爱好通常是比較确定的,不easy变,那么当一个用户对两个物品都喜欢的时候,我们往往能够觉得这两个物品

基于用户和基于物品的协同过滤算法的比较

首先回顾一下,协同过滤算法主要有两种,一种是基于用户的协同过滤算法(UserCF),另一种是基于物品的协同过滤算法(ItemCF). 基于用户的协同过滤算法主要有两步: 1)找到和目标用户兴趣相似的用户集合 2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户. 基于物品的协同过滤算法主要有两步: 1)计算物品之间的相似度. 2)根据物品的相似度和用户的历史行为给用户生成推荐列表. 由此可以看出UserCF是推荐用户所在兴趣小组中的热点,更注重社会化,而ItemCF则是根据用

基于物品的协同过滤算法ItemCF算法实现

基于物品的协同过滤算法(ItemCF)的基本思想是:给用户推荐那些和他们之前喜欢的物品相似的物品. 比如,该算法会因为你购买过<Java从入门到精通>而给你推荐<Java并发编程实战>.不过,基于物品的协同过滤算法并不利用物品的内容属性计算物品之间的相似度,二是通过分析用户的行为数据计算物品之间的相似度.该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B. 实现代码: # -*- coding=utf-8 -*- from operator impor

(转) 基于MapReduce的ItemBase推荐算法的共现矩阵实现(一)

  转自:http://zengzhaozheng.blog.51cto.com/8219051/1557054 一.概述 这2个月研究根据用户标签情况对用户的相似度进行评估,其中涉及一些推荐算法知识,在这段时间研究了一遍<推荐算法实践>和<Mahout in action>,在这里主要是根据这两本书的一些思想和自己的一些理解对分布式基于ItemBase的推荐算法进行实现.其中分两部分,第一部分是根据共现矩阵的方式来简单的推算出用户的推荐项,第二部分则是通过传统的相似度矩阵的方法来

mahout之旅---分布式推荐算法ALS-MR

Mahout分布式推荐系统--基于矩阵分解的协同过滤系统 1.实例环境 Mahout版本:mahout-0.9: Hadoop版本:hadoop-1.2.1: Jdk版本:java1.7.0_13 分布式系统:centos: 集群规模:master .slavex.slavey.slavez 2.实例脚本 目前技术博文对mahout0.9版本的简介的也是不忍直视.这里系列博客对mahout0.9版本自带的基于矩阵分解的协同过滤系统算法的讲解.一个首先不管怎么样,先把程序跑起来,mahout自带了

基于物品的协调过滤算法(ItemCF)

学习自:<推荐系统实战> 理念: 给用户推荐一些与他们之前喜欢的物品相似的物品 (不通过物品的内容属性计算物品的相似度,主要通过分析用户行为,例如喜欢A的大部分也喜欢B) 计算物品相似度 生成推荐列表 1.计算物品相似度:

简单的基于矩阵分解的推荐算法-PMF, NMF

介绍: 推荐系统中最为主流与经典的技术之一是协同过滤技术(Collaborative Filtering),它是基于这样的假设:用户如果在过去对某些项目产生过兴趣,那么将来他很可能依然对其保持热忱.其中协同过滤技术又可根据是否采用了机器学习思想建模的不同划分为基于内存的协同过滤(Memory-based CF)与基于模型的协同过滤技术(Model-based CF).其中基于模型的协同过滤技术中尤为矩阵分解(Matrix Factorization)技术最为普遍和流行,因为它的可扩展性极好并且易

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情.简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口:困难是因为我们不了解算法细节,很难去根据业务的场景进行算法配置和调优. 本文将深入算法API去解释Mahout推荐算法底层的一些事. 1. Mahout推荐算法介绍 Mahoutt推荐算法,从数据处理能力上,可以划分为2类: 单机内存算法实现 基于Hadoop的分步式算法实现 1). 单机内存算法实现 单机内存算法实现:就是在单机下运行的算法