K-means 预测?

Posted

技术标签:

【中文标题】K-means 预测?【英文标题】:K-means for prediction? 【发布时间】:2016-01-07 20:25:30 【问题描述】:

我正在使用 K-means 算法从二维数据中创建 k 个集群。

我打算使用集群来预测传入数据点属于哪个集群。我应该如何使用 k-means 算法进行预测?

注意:我正在使用来自here 的 k-means JS 实现

【问题讨论】:

看起来您想使用概率 k-means 进行聚类预测。 Simple approach to assigning clusters for new data after k-means clustering的可能重复 【参考方案1】:

也将每个新对象分配给最近的簇中心。就是这样。

k-means 为您的数据找到一个 Voronoi 单元 分区。与此模型唯一一致的集群分配(除非您想根据新数据更新模型,这可能会导致重新标记 old 点)是将每个点分配给它所在的 Voronoi 单元in. 使用上述规则很容易做到这一点。

请注意,聚类不是分类。很少有聚类算法允许您将他们的模型应用于分类新实例。它们不应该以这种方式使用!聚类的目的是更好地理解您的数据。工作流程是聚类,然后研究结果,然后可能构建一些新的/不同于你所学的东西。能够将新对象分类为“应该去集群 3”通常是没有帮助的,因为这假设 A)集群是有意义/有用的(通常它们不是)和 B)它们是干净的(通常,一些对象不在集群中,它们将被人类分类)。

这个问题已经被问过好几次了(使用搜索!):

Simple approach to assigning clusters for new data after k-means clustering https://***.com/questions/32864103/apply-culstering-result-to-out-of-sample-data?lq=1 How to know which cluster do the new data belongs to after finishing cluster analysis How to Score on a new Data Set Assign new data point to cluster in kernel k-means (kernlab package in R)?

【讨论】:

我假设您的意思是集群每个质心的最近中心?这将给出一个不错但不完全准确的预测,因为异常值有一个很好的变化,会进入错误的集群(基本上它必然会导致集群生成错误)。 k-means 构建数据集的 Voronoi 分区。我不会尝试在这里修复 k-means 的限制。通过这种方式很容易识别合适的 Voronoi 单元。【参考方案2】:

你使用所谓的概率k-means算法。在相同的输入数据点上多次运行 k-means。在每次运行时,跟踪哪个点最终在哪个集群中。随着通过 k-means 的运行次数增加,您可以更好地预测某个点属于某个集群的概率。因此,对于某些数据点 Pi,您可以通过 P(Pi in Ci) = (# of times in Ci)/(# of times not in Ci) 找到某个集群 Ci 的概率。这将针对每个集群进行,概率最高的集群将是您对数据点 Pi 的预测。或者,您可以简单地计算一个点在每个集群中碰撞的次数,然后简单地选择最高计数。

注意:通过每次执行 k-means 来确保每个集群的标注是一致的。这是通过将迭代中使用的集群的质心 i 用作迭代中生成的下一个集群的种子(更接近最后一个质心的概率略有增加)来完成的i+1,或者新的迭代可以完全随机化。

使用概率 k-means 是因为标准 k-means 的聚类逼近可能很差。尽管一个主要问题是为了准确性而计算量很大。因此,仅真正适用于 1D 或 2D 数据,并且可能对现实世界的数据过于繁重。处理此问题的类似方法是k-means++。


一种更简单且更常见的方法是简单地执行一次 k-means,然后对于新数据点 Pi 只需获取该点与集群所有质心之间的距离并选择最低的一个。该集群将用作该点的预测。这种方法要快得多,但会导致生成的集群不准确和逼近不佳,尤其是当该点是异常值并且两个最小集群之间的差异很接近时。


如果您想要一个示例,我已经在灰度颜色数据 for an old class assignment 的一维数据集上实现了概率 k 均值。可以对您的数据集执行相同的操作(请注意,数据集的维度越高,运行速度越慢)话虽如此,它是在不久前完成的(基本上代码有点混乱),代码的重要部分开始于:for(var q=0;q<numOfComputes;q++)

【讨论】:

您在 k-means 中没有“一致”标签(除了您的 1d 玩具箱,您不需要 k-means)。这种方法行不通。 @Anony-Mousse 它的计算量很大,但该方法确实有效并用于提供更准确的结果。在 k-means 中放置标签并不难,这就是算法的工作原理。不要仅仅因为你不知道,就认为这种方法行不通。 我知道 k-means,结果往往到处都是,尤其是在真实数据上。请在您的方法中定义“确保标签一致”;以及如果集群变化很大怎么办...... @Anony-Mousse 我已经更新了我的问题,这个算法的目的是因为结果可以无处不在。 但是因为如果那样的话,Ci 是没有意义的。如果您将装置回收再运行一次,您将获得相同的结果。您的“注释”没有意义。如果均值已经收敛,它们将在下一次运行中产生完全相同的聚类;那么这种方法也行不通。

以上是关于K-means 预测?的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 的 k-means:预测方法的真正作用是啥?

使用经过训练的 K-Means 模型为未见数据预测正确的集群

使用 k-Means 聚类算法预测值

在 scikit-learn k-means 集群中预测文档时出现 ValueError

解释 K-means 的结果

聚类算法(K-Means)