我想根据用户观看的节目的类别或标签对用户进行聚类。有什么最简单/最好的算法可以做到这一点吗?
假设我有大约20,000个标签和数百万个观看事件可以用作信号,是否有我可以使用pig/hadoop/mortar或在neo4j上实现的算法?
就数据而言,我有用户、他们观看的节目以及节目的标签(通常每个节目有大约10个标签)。
我希望最终得到k个聚类(可能是十几个?)或广泛的分类,我可以用这些分类来对用户进行分类和分组,并从中获得一些关于他们如何被划分的见解 – 每个聚类都有一组代表性的标签。
我看到一些帖子建议使用层次算法,但不确定在这种情况下如何计算“距离”。那将是两个用户之间的距离,还是用户与一组标签之间的距离,等等?
回答:
你基本上是想根据他们的标签来聚类用户。
为了简单起见,假设你只有10个标签(而不是20,000个)。假设一个用户,比如user_34,拥有第2个和第7个标签。对于这个聚类任务,user_34可以被表示为点在10维空间中,他的相应坐标是:[0,1,0,0,0,0,1,0,0,0]。
在你自己的情况下,每个用户同样可以被表示为20,000维空间中的一个点。你可以使用Apache Mahout,它包含许多有效的聚类算法,比如K-means。
由于一切都在数学坐标系统中得到了很好的定义,计算任意两个用户之间的距离很容易!可以使用任何距离函数来计算,但欧几里得距离是事实上的标准。
注意: Mahout和许多其他数据挖掘程序支持许多适合稀疏特征的格式,即你不需要在文件中插入…,0,0,0,0,…,只需指定哪些标签被选中即可。(参见Mahout中的RandomAccessSparseVector)
注意: 我假设你只想聚类你的用户。从聚类中提取代表性信息有些棘手。例如,对于每个聚类,你可以选择在聚类用户之间更常见的标签。或者,你可以使用来自信息论的概念,比如信息增益,来找出哪些标签包含更多关于聚类的信息。