我尝试使用KMeansClustering方法对一些文档进行聚类,并成功创建了聚类。我保存了与特定文档对应的聚类ID,用于推荐。因此,每当我想推荐与特定文档相似的文档时,我会查询特定聚类中的所有文档,并从该聚类中返回n个随机文档。然而,从聚类中返回任何随机文档似乎并不合适,我在某处读到我们应该返回与所讨论文档最接近的文档。
因此,我开始寻找计算文档之间距离的方法,并发现了RowSimilarity方法,该方法返回与每个文档最相似的10个文档,按距离排序。现在这种方法依赖于相似性度量,如LogLikelihood等来计算文档之间的距离。
现在我的问题是,考虑到这两种方法都使用相似性距离度量来计算文档之间的距离,聚类与RowSimilarity相比,哪个更好或更差?
我试图实现的是根据产品的标题和其他文本属性对产品进行聚类,以推荐相似的产品。任何帮助都将不胜感激。
回答:
聚类不仅仅是分类或推荐的另一种变体。它是一个不同的学科。
当你进行聚类分析时,你希望发现数据中的结构。但接下来,你实际上应该分析你发现的结构。
现在,k-means并不是真正为文档设计的。它试图将数据集近乎最优地划分为k个Voronoi单元。除非你有充分的理由相信Voronoi单元是你的数据的良好划分,否则该算法可能几乎毫无用处。仅仅因为它返回了一个结果,并不表示这个结果是有用的。
对于文档,欧几里得距离(k-means实际上是在优化欧几里得距离)通常几乎毫无意义。这些向量非常稀疏,k-means聚类中心通常会类似于不可能的(因此是无意义的)“平均文档”。
我还没有开始讨论需要找到合适的k值,Mahout实现可能只是Lloyds k-means近似的近似,等等。你甚至检查过聚类的大小吗?在这种情况下,k-means通常会产生退化的结果。例如,几乎所有聚类包含1个或0个元素,而一个超大聚类包含其余的。在这种情况下,你实际上可能只是从你的数据库中返回随机文档…
仅仅因为你可以使用它,并不意味着它是有帮助的。请确保验证你的方法的各个步骤,例如聚类是否在任何方面有用和合理!