mahout中的大多数推荐算法都需要用户项首选项。但我想找到给定项目的类似项目。我的系统没有用户输入。即对于任何电影,这些可以是可用于查找相似系数的属性
演员
将来可以修改属性列表以构建更高效的系统。但是为了在mahout数据模型中找到项目相似性,需要每个项目的用户偏好。这些电影可以聚集在一起,并在给定项目的集群中获得最接近的项目。 稍后在介绍基于用户的推荐之后,可以使用上述结果来提升结果。
如果product属性有一些像Genre这样的修复值。我是否必须将这些值转换为数值。如果是,系统将如何计算genre-1和genre-2之间没有任何数字关系的两个项目之间的距离。
修改
我在命令行中找到了一些示例,但我想在java中执行此操作并保存预先计算的值以供以后使用。
答案 0 :(得分:1)
我认为在特征向量的情况下,最佳相似性度量是具有精确匹配的度量,例如jaccard相似度。
在jaccard中,两个项目向量之间的相似度计算如下:
交叉点中的要素数量/联合中的要素数量。
因此,将类型转换为数值不会产生差异,因为完全匹配(用于查找交集)在非数值中将是相同的。
看一下这个问题,看看如何在mahout中做到这一点:
答案 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。他将此类相似性称为内容或元数据相似性。