如何基于标签对用户进行聚类

yebdmbv4  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(482)

我想根据用户观看的节目的类别或标签对用户进行分类。最简单/最好的算法是什么?
假设我有大约20000个标签和几百万个可以用作信号的watch事件,有没有一个算法可以用pig/hadoop/mortar或者neo4j来实现?
就数据而言,我有用户,他们看过的节目,以及一个节目的标签(通常每个节目有10个左右的标签)。
我希望在最后k个集群(可能有十几个?)或广泛的bucket,我可以使用它们将用户分类和分组到bucket中,并获得一些关于如何划分用户的见解—用一组表示每个集群的标记。
我看到一些帖子建议采用分层算法,但不确定在这种情况下如何计算“距离”。是两个用户之间的距离,还是一个用户和一组标签之间的距离,等等。。

xvw2m8pv

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,找出哪些标记包含有关集群的更多信息。

z6psavjg

z6psavjg2#

你应该考虑使用 neo4j . 可以使用以下节点标签和关系类型为数据建模。
如果你不熟悉neo4j的cypher语言符号, (:Foo) 表示带有标签的节点 Foo ,和 [:BAR] 表示与类型的关系 BAR . 关系周围的箭头表示其方向性。neo4j有效地在两个方向上遍历关系。

(:Cluster) -[:INCLUDES_TAG]-> (:Tag) <-[:HAS_TAG]- (:Program) <-[:WATCHED]- (:User)

你会的
k Cluster 节点,20k Tag 节点,以及几百万个 WATCHED 关系。
在这个模型中,从任何给定的 Cluster 节点,您可以高效地查找其所有相关的标记、程序和用户。

相关问题