您需要的是一种聚类算法,它会自动将相似的用户分组在一起。您面临的第一个困难是大多数聚类算法期望它们聚类的项目被表示为欧几里得空间中的点。在您的情况下,您没有点的坐标。相反,您可以计算它们之间的“相似性”函数的值。
这里的一个很好的可能性是使用光谱聚类,这正是你所拥有的:相似矩阵。缺点是您仍然需要为每对点计算兼容性函数,即算法为 O(n^2)。
如果您绝对需要比 O(n^2) 更快的算法,那么您可以尝试一种称为dissimilarity spaces的方法。这个想法很简单。您反转您的兼容性函数(例如,通过取其倒数)将其转换为差异或距离的度量。然后,您将每个项目(在您的情况下为用户)与一组原型项目进行比较,并将结果距离视为空间中的坐标。例如,如果您有 100 个原型,那么每个用户将由 100 个元素的向量表示,即由 100 维空间中的一个点表示。然后您可以使用任何标准的聚类算法,例如K-means。
现在的问题是你如何选择原型,你需要多少。已经尝试了各种启发式方法,但是,这里有一篇论文它认为随机选择原型可能就足够了。它显示了使用 100 或 200 个随机选择的原型的实验产生了良好的结果。在您的情况下,如果您有 1000 个用户,并且您选择其中的 200 个作为原型,那么您需要评估您的兼容性函数 200,000 次,这比比较每一对用户提高了 2.5 倍。然而,真正的优势在于,对于 1,000,000 名用户,200 个原型仍然足够,并且您需要进行 200,000,000 次比较,而不是 500,000,000,000 次改进 2500 倍。您得到的是 O(n) 算法,即比 O(n^2) 好,尽管常数因子可能很大。