确定k最近邻居的最佳k

时间:2009-11-09 14:00:53

标签: algorithm language-agnostic artificial-intelligence cluster-analysis complexity-theory

我需要对一组二维数据进行一些聚类分析(我可能会在此过程中添加额外的维度)。

分析本身将构成输入可视化数据的一部分,而不是输入到另一个过程(例如Radial Basis Function Networks)。

为此,我想找到一组主要“看起来正确”的集群,而不是阐明一些隐藏的模式。

我的直觉是k-means将是一个很好的起点,但找到合适数量的集群来运行算法会有问题。

我要解决的问题是:

如何确定 k 的“最佳”值,以便形成的群集稳定且可视化验证

问题:

  • 假设这不是NP完全的,那么找到一个好的 k 的时间复杂度是多少。 (可能以运行k-means算法的次数报告)。
  • 是k-意味着这类问题的良好起点?如果是这样,您会推荐其他方法。一个具体的例子,由轶事/经验支持将是最大化。
  • 您建议使用哪些捷径/近似来提高性能。

8 个答案:

答案 0 :(得分:5)

对于群集数量未知的问题,凝聚层次聚类通常比k均值更好。

Agglomerative clustering生成树形结构,离树干越近,簇的数量越少,因此可以轻松扫描所有簇数。该算法首先将每个点分配给它自己的簇,然后重复分组两个最接近的质心。跟踪分组序列可以为任意数量的可能群集创建即时快照。因此,当你不知道你想要多少组时,通常最好使用这种技术而不是k-means。

还有其他层次聚类方法(参见Imran评论中提出的论文)。凝聚方法的主要优点是有许多实现,可供您使用。

答案 1 :(得分:2)

为了使用k-means,你应该知道有多少个集群。您无法尝试天真的元优化,因为您要添加的群集越多(每个数据点最多1个群集),它就会越多地使您过度拟合。您可以查找一些集群验证方法并使用它来优化k超参数,但根据我的经验,它很少能够正常工作。这也是非常昂贵的。

如果我是你,我会做一个PCA,最终在多项式空间(照顾你的可用时间),这取决于你对输入的了解,并沿着大多数代表组件聚集。

您的数据集上的更多信息对于更精确的答案非常有帮助。

答案 2 :(得分:2)

这是我的近似解决方案:

  1. 从k = 2开始。
  2. 进行多次尝试:
    1. 运行k-means算法以查找 k 群集。
    2. 找到从原点到群集质心的均方距离。
  3. 重复2-3,找到距离的标准偏差。这是群集的稳定性的代理。
  4. 如果 k 的群集的稳定性 k - 1 的簇的稳定性然后返回 k - 1
  5. k 增加1。
  6. 该算法背后的论点是 k 集群的数量对于 k 的“好”值而言是小的。

    如果我们能找到这种稳定性的局部最优值,或稳定性的最佳增量,那么我们就可以找到一组好的聚类,这些聚类无法通过添加更多聚类来改进。

答案 3 :(得分:2)

previous answer中,我解释了Self-Organizing Maps (SOM)如何在视觉聚类中使用。

否则,存在称为X-Means的K-Means算法的变体,其能够通过优化贝叶斯信息准则(BIC)来找到群集的数量,此外使用 KD-trees 解决可扩展性问题 Weka包括X-Means的实现以及许多其他聚类算法,所有这些都在一个易于使用的GUI工具中。

最后,您可以参考this page讨论弯头方法以及确定数据集中群集数量的其他技术。

答案 4 :(得分:1)

您可能会查看有关群集验证的论文。 Here's one在涉及微阵列分析的论文中被引用,其涉及聚类具有相关表达水平的基因。

一种这样的技术是 Silhouette measure ,用于评估标记点与其质心的接近程度。一般的想法是,如果一个点被分配给一个质心但仍然接近其他质心,那么它可能被分配给了错误的质心。通过在训练集中计算这些事件并查看各种 k - 平均聚类,可以查找 k ,使得标记点总体上属于“最佳”或最低限度模糊布置。

应该说聚类更像是一种数据可视化和探索技术。很难确定一个聚类正确解释数据,尤其是其他聚类。最好将您的群集与其他相关信息合并。是否有关于您的数据的功能或其他信息,以便您知道某些群集是不可能的?这可以大大减少您的解决方案空间。

答案 5 :(得分:1)

从您的维基百科链接:

  

关于计算复杂性,   k均值聚类问题是:

     
      
  • NP-hard一般欧几里德   空间d甚至2个集群
  •   
  • NP-hard获得一般数量   甚至在飞机上聚集k
  •   
  • 如果k和d是固定的,问题就出在了   完全解决了时间O(ndk + 1 log n),   其中n是要实体的数量   
  •   
     

因此,通常使用各种heuristic algorithms

也就是说,找到一个好的k值通常是一个启发式过程(即你尝试一些并选择最好的)。

我认为k-means是一个很好的起点,它简单易行(或复制)。如果您遇到严重的性能问题,请进一步了解。

如果要聚类的点集非常大,则第一顺序优化将是随机选择一个小子集,使用该集来查找k-means。

答案 6 :(得分:1)

选择最佳K可视为Model Selection问题。一种可能的方法是Minimum Description Length,在此上下文中意味着:您可以存储包含所有点的表(在这种情况下K = N)。在另一个极端,你有K = 1,并且所有点都存储为距单个质心的距离。来自Manning和Schutze的信息检索简介中的This Section建议将Akaike Information Criterion最小化为最优K的启发式。

答案 7 :(得分:1)

这个问题属于"内部评估" "聚类优化问题"哪个现有技术解决方案似乎使用** Silhouette * coeficient *如所述here

https://en.wikipedia.org/wiki/Cluster_analysis#Applications

here

https://en.wikipedia.org/wiki/Silhouette_(clustering)

"剪影图和平均值可用于确定数据集中的自然簇数"

scikit-learn提供了方法的示例用法实现here http://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_silhouette_analysis.html