根据商品属性查找类似商品

时间:2015-11-17 06:47:35

标签: mahout recommendation-engine mahout-recommender

mahout中的大多数推荐算法都需要用户项首选项。但我想找到给定项目的类似项目。我的系统没有用户输入。即对于任何电影,这些可以是可用于查找相似系数的属性

  • 类型
  • 演员

    将来可以修改属性列表以构建更高效的系统。但是为了在mahout数据模型中找到项目相似性,需要每个项目的用户偏好。这些电影可以聚集在一起,并在给定项目的集群中获得最接近的项目。 稍后在介绍基于用户的推荐之后,可以使用上述结果来提升结果。

    如果product属性有一些像Genre这样的修复值。我是否必须将这些值转换为数值。如果是,系统将如何计算genre-1和genre-2之间没有任何数字关系的两个项目之间的距离。

修改

我在命令行中找到了一些示例,但我想在java中执行此操作并保存预先计算的值以供以后使用。

2 个答案:

答案 0 :(得分:1)

我认为在特征向量的情况下,最佳相似性度量是具有精确匹配的度量,例如jaccard相似度。

在jaccard中,两个项目向量之间的相似度计算如下:

交叉点中的要素数量/联合中的要素数量。

因此,将类型转换为数值不会产生差异,因为完全匹配(用于查找交集)在非数值中将是相同的。

看一下这个问题,看看如何在mahout中做到这一点:

Does Mahout provide a way to determine similarity between content (for content-based recommendations)?

答案 1 :(得分:0)

听起来像Mahout的library(dplyr) library(lazyeval) adjacency = function(data) { adjacency_table = function(data, larger_name, smaller_name) lazy(data %>% select(larger_name, smaller_name) %>% distinct %>% filter(smaller_name %>% is.na %>% `!`) ) %>% interp(larger_name = larger_name %>% as.name, smaller_name = smaller_name %>% as.name) %>% lazy_eval %>% setNames(c("larger", "smaller")) data_frame(smaller_name = data %>% names) %>% mutate(larger_name = smaller_name %>% lag) %>% slice(-1) %>% group_by(larger_name, smaller_name) %>% do(adjacency_table(data, .$larger_name, .$smaller_name) ) } result = test_data %>% select(-cat_id) %>% adjacency 算法,从版本0.10.0开始提供,将是您问题的完美解决方案。它比较给定矩阵的(即:表示电影及其属性的行向量),寻找跨这些行的值的同时发生 - 或者在您的情况下:类型,导演和演员的同时发生。无需用户历史记录或项目交互。最终结果是另一个矩阵将您的每部电影映射到您的收藏中的前n个最相似的其他电影,基于流派,导演或演员的共同发生。

Apache Mahout site对于如何从命令行执行此操作有一个很好的说明,但如果您想要深入了解幕后的内容,请阅读Pat Ferrel'机器学习博客Occam's Machete。他将此类相似性称为内容或元数据相似性