我想根据用户观看的节目的类别或标签对用户进行分类。最简单/最好的算法是什么?
假设我有大约20000个标签和几百万个可以用作信号的watch事件,有没有一个算法可以用pig/hadoop/mortar或者neo4j来实现?
就数据而言,我有用户,他们看过的节目,以及一个节目的标签(通常每个节目有10个左右的标签)。
我希望在最后k个集群(可能有十几个?)或广泛的bucket,我可以使用它们将用户分类和分组到bucket中,并获得一些关于如何划分用户的见解—用一组表示每个集群的标记。
我看到一些帖子建议采用分层算法,但不确定在这种情况下如何计算“距离”。是两个用户之间的距离,还是一个用户和一组标签之间的距离,等等。。
2条答案
按热度按时间xvw2m8pv1#
您基本上希望根据用户的标签对其进行集群。
为了简单起见,假设您只有10个标签(而不是20000个)。假设一个用户,比如说用户\34,有第二个和第七个标签。对于该聚类任务,用户\u 34可以表示为10维空间中的一个点,其对应的坐标为:[0,1,0,0,0,0,1,0,0,0]。
在您自己的例子中,每个用户可以类似地表示为20000维空间中的一个点。您可以使用apachemahout,它包含许多有效的聚类算法,例如k-means。
因为一切都在数学坐标系中定义得很好,所以计算任意两个用户之间的距离都很容易!它可以用任何距离函数计算,但欧几里德距离是事实上的标准。
注:mahout和许多其他数据挖掘程序支持许多适合稀疏特征的格式,即不需要插入…,0,0,0,0,。。。但只需要指定选择了哪些标记(请参见mahout中的randomaccesssparsevector。)
注意:我假设您只想对用户进行集群。从集群中提取具有代表性的信息有些棘手。例如,对于每个集群,您可以选择在集群用户之间更常见的标记。或者,您可以使用信息理论中的概念,例如informationgain,找出哪些标记包含有关集群的更多信息。
z6psavjg2#
你应该考虑使用
neo4j
. 可以使用以下节点标签和关系类型为数据建模。如果你不熟悉neo4j的cypher语言符号,
(:Foo)
表示带有标签的节点Foo
,和[:BAR]
表示与类型的关系BAR
. 关系周围的箭头表示其方向性。neo4j有效地在两个方向上遍历关系。你会的
k
Cluster
节点,20kTag
节点,以及几百万个WATCHED
关系。在这个模型中,从任何给定的
Cluster
节点,您可以高效地查找其所有相关的标记、程序和用户。