Mahout推荐算法基础

Mahout推荐算法分为以下几大类

GenericUserBasedRecommender

算法:

1.基于用户的相似度

2.相近的用户定义与数量

特点:

1.易于理解

2.用户数较少时计算速度快

 

GenericItemBasedRecommender

算法:

1.基于item的相似度

特点:

1.item较少时就算速度更快

2.item的外部概念易于理解和获得是非常有用

 

SlopeOneRecommenderitemBased

算法:

1基于SlopeOne算法(打分差异规则)

特点

速度快

需要预先计算

item数目十分少了也很有效

需要限制diffs的存储数目否则内存增长太快

 

 

SVDRecommender item-based

算法

基于支持向量机(item的特征以向量表示,每个维度的评价值)

特点

需要预计算

推荐效果佳

 

KnnItemBasedRecommender item-based

类似于GenericUserBasedRecommender 中基于相似用户的实现(基于相似的item

GenericItemBasedRecommender 的主要区别是权重方式计算的不同(but, the weights are not the results of some similarity metric. Instead, the algorithm calculates the optimal set of weights to use between all pairs of items=>看的费劲

 

TreeClusteringRecommender

算法

基于树形聚类的推荐算法

特点

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

计算速度快

需要预先计算

 

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

 

Mahout中的数据输入

DataModel

以下包含

GenericDataModel

数据接口类 基于内存

内部使用FastByIDMap 保存PreferenceArray,在PreferenceArray内保存用户->Item的评价值

 

GenericBooleanPrefDataModel.

基于内存的数据接口类

但是无用户偏好值

使用FastByIDMap<FastIDSet>为用户或者Item保存相关的Item或者用户。

 

 

FileDataModel

基于文件的数据接口内,内部使用GenericDataModel 保存实际的用户评价数据

增加了压缩文件(.zip .gz)等文件类型的支持

支持动态更新(更新文件文件名必须保存为一定的格式 例如 foo.txt.gz 后续更新文件必须为foo.1.txt.gz

查了以下代码 好像是自定义时间间隔后可以更新,但是好像是全部更新(以后看代码)

 

JDBCDataModel

基于数据库的数据接口 目前已经实现MySQLJDBCDataModel(支持MySQL 5.x)可以使用MysqlDataSource生成MySQLJDBCDataModel

注:0.7版本里面没有找到MySQLJDBCDataModel类多了一个MySQLJDBCIDMigrator

不知道关系如何

 

PlusAnonymousUserDataModel.

用于匿名用户推荐的数据类 将全部匿名用户视为一个用户(内部包装其他的DataModel类型)

 

Mahout中的相似度计算

主要按照基于User,基于Item

GenericItemSimilarity包含内部类GenericItemSimilarity.ItemItemSimilarity

GenericUserSimilarity包含内部类GenericUserSimilarity.UserUserSimilarity

以内存方式保存相似度计算结果 使用FastByIDMap<FastByIDMap<Double>>保存计算结果

 

CachingItemSimilarity

CachingUserSimilarity

cache方式保存相似度计算结果防止每次请求是重复计算

内部使用 Cache<LongPair,Double> similarityCache保存相似度

GenericUserSimilarity用法和区别暂时看不懂

 

Mathout中实现的基于不同算法相似度度量的:

PearsonCorrelationSimilarity 皮尔逊距离

EuclideanDistanceSimilarity 欧几里德距离

CosineMeasureSimilarity   余弦距离(0.7变成了UncenteredCosineSimilarity

SpearmanCorrelationSimilarity 斯皮尔曼等级相关

TanimotoCoefficientSimilarity 谷本相关系数

LogLikelihoodSimilarity 一般好于TanimotoCoefficientSimilarity(不懂)

CityBlockSimilarity基于曼哈顿距离

 

相似度使用的典型用法

UserSimilarity similarity = new CachingUserSimilarity(

new SpearmanCorrelationSimilarity(model), model);

 

对缺失数据的处理

PreferenceInferrer 数据丢失或者数据太少时可能用到 具体实现有 AveragingPreferenceInferrer 以平均值填充缺失数据

一般来说PreferenceInferrer除了增加计算量对推荐结果无任何影响(缺失值根据已有数据得出)所以一般只用于研究领域。

 

聚类的相似度

ClusterSimilarity

聚类的相似度用于两个不同的聚类之间的距离(类似坐标系内的距离)

目前聚类之间的距离计算只包含以下两个实现(暂时没有更好的实现算法)

NearestNeighborClusterSimilarity  计算两个聚类中所有项距离中的最小距离

FarthestNeighborClusterSimilarity  计算两个聚类中所有项距离中的最大距离

posted @ 2013-03-04 19:52  subsir  阅读(697)  评论(0编辑  收藏  举报