【问题标题】:Determining the best k for a k nearest neighbour为 k 个最近邻确定最佳 k
【发布时间】:2016-10-18 19:57:48
【问题描述】:

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

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

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

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

我遇到的问题是这样的:

如何确定 k 的“最佳”值,以使形成的集群稳定且可直观验证

问题:

  • 假设这不是 NP 完全的,那么找到一个好的 k 的时间复杂度是多少。 (可能报告了运行 k-means 算法的次数)。
  • k-means 是解决此类问题的良好起点吗?如果是这样,您会推荐哪些其他方法。一个由轶事/经验支持的具体示例是 maxi-bon。
  • 您会推荐哪些捷径/近似值来提高性能。

【问题讨论】:

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


    【解决方案1】:

    对于聚类数量未知的问题,凝聚层次聚类通常比 k-means 更好。

    Agglomerative clustering 生成树形结构,越靠近树干,簇的数量越少,因此很容易扫描所有数量的簇。该算法首先将每个点分配给自己的集群,然后重复对两个最近的质心进行分组。跟踪分组序列允许对任意数量的可能集群进行即时快照。因此,当您不知道需要多少组时,通常最好使用这种技术而不是 k-means。

    还有其他层次聚类方法(参见 Imran 的 cmets 中建议的论文)。凝聚式方法的主要优点是有许多现成的实现供您使用。

    【讨论】:

    【解决方案2】:

    为了使用 k-means,您应该知道有多少簇。您不能尝试简单的元优化,因为您要添加的集群越多(每个数据点最多 1 个集群),就越会导致过度拟合。您可能会寻找一些集群验证方法并用它优化 k 超参数,但根据我的经验,它很少能很好地工作。也很贵。

    如果我是你,我会做一个 PCA,最终在多项式空间上(注意你的可用时间),具体取决于你对输入的了解,并沿着最具代表性的组件进行聚类。

    有关您的数据集的更多信息将非常有助于获得更准确的答案。

    【讨论】:

      【解决方案3】:

      这是我的大致解决方案:

      1. 从 k=2 开始。
      2. 对于多次尝试:
        1. 运行 k-means 算法以查找 k 个聚类。
        2. 求从原点到聚类质心的均方距离。
      3. 重复 2-3,找到距离的标准偏差。这是集群稳定性的代理。
      4. 如果 k 的集群稳定性 k - 1 的集群稳定性,则返回 k - 1
      5. k 增加 1。

      这个算法背后的论点是 k 簇的集合数量对于 k 的“好”值来说是很小的。

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

      【讨论】:

      • 我会将问题提供给遗传算法,而不是任意增量,您可以将类似的逻辑应用于适应度函数的实现 - 在这种情况下,您不会陷入局部最优
      • 对于这么小的搜索空间,GA 似乎有点紧张。两个全局最优值在 k=1 和 k=n 处(为什么我从 k=2 开始),并且 k=n 的方法可能是相当渐近的。
      【解决方案4】:

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

      否则,存在称为 X-Means 的 K-Means 算法的变体,除了解决使用 KD-trees 解决可扩展性问题。
      Weka 包括 X-Means 的实现以及许多其他聚类算法,所有这些都在一个易于使用的 GUI 工具中。

      最后,您可以参考this page,其中讨论了肘部方法以及其他确定数据集中聚类数量的技术。

      【讨论】:

        【解决方案5】:

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

        一种这样的技术是剪影测量,它评估标记点与其质心的接近程度。一般的想法是,如果一个点被分配给一个质心但仍然靠近其他质心,那么它可能被分配给了错误的质心。通过跨训练集计算这些事件并查看各种 k 均值聚类,可以寻找 k 使得标记点总体上落入“最佳”或最低限度的模糊安排。

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

        【讨论】:

        • 平面是一个地理的,即连续的表面。
        【解决方案6】:

        来自您的维基百科链接:

        关于计算复杂度, k-means 聚类问题是:

        • NP-hard 一般欧几里得 空间 d 甚至 2 个集群
        • NP-hard 用于一般号码 即使在平面上也能聚集 k
        • 如果 k 和 d 是固定的,问题可能是 在时间 O(ndk+1 log n) 中精确求解, 其中 n 是实体的数量 集群化

        因此,一般使用各种heuristic algorithms

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

        我认为 k-means 是一个很好的起点,它简单且易于实现(或复制)。仅当您遇到严重的性能问题时才进一步查看。

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

        【讨论】:

        • 我得到了 WP 链接,谢谢你的剪辑。我不确定我是否理解你的最后一段。
        • 我最后一段的意思是:如果您的数据集非常大,例如 1,000,000 个点,您可以随机选择 10,000 个子集并使用它来查找您的 k-means。这将减少您的计算时间,并对您的 k-means 的准确性产生很小的负面影响
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          这个问题属于“聚类优化问题”的“内部评估”类,目前最先进的解决方案似乎使用 **Silhouette* 系数*,如 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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-04-12
            • 2018-04-08
            • 2014-05-14
            • 2012-07-19
            • 2013-03-21
            • 2014-05-12
            • 1970-01-01
            相关资源
            最近更新 更多