k-means聚类可以做分类吗?
Posted
技术标签:
【中文标题】k-means聚类可以做分类吗?【英文标题】:Can k-means clustering do classification? 【发布时间】:2014-04-13 14:17:21 【问题描述】:我想知道k-means聚类算法能不能做分类?
如果我做了一个简单的 k-means 聚类。
假设我有很多数据,我使用k-means聚类,然后得到2个聚类A,B。质心计算方法是欧几里得距离。
左侧的集群 A。
右侧的集群 B。
所以,如果我有一个新数据。我该怎么办?
再次运行k-means聚类算法,可以得到新数据属于哪个簇?
记录最后一个质心,用欧几里得距离计算确定新数据属于什么?
其他方法?
【问题讨论】:
【参考方案1】:是的,我们可以进行分类。
我不会说算法本身(如 #1)特别适合对点进行分类,因为将要分类的数据合并到您的训练数据中往往不受欢迎(除非您有一个实时系统,但我认为详细说明这一点会有点远)。
要对新点进行分类,只需计算到每个聚类质心的欧几里德距离以确定最近的点,然后将其分类到该聚类下。
有一些数据结构可以让您更有效地确定最近的质心(如kd-tree),但以上是基本思想。
【讨论】:
那么,我的选择(2)对吗?我需要记录最后一个簇质心以确定新数据所属的壁橱簇? 如果通过记录最后一个集群质心,您的意思是您会记住 each 集群的最新质心,那么是的,#2 是正确的。 你不会从 kd-tree 中获得太多好处,除非你有一个非常大的 k - 你只存储质心,而不是完整的数据集。 @Anony-Mousse 不只是当你有一个非常大的 k 时,还只是当你有很多要分类的点时(当然,假设 k 相当很大)。 【参考方案2】:如果您已经对数据进行了 k-means 聚类以获得两个聚类,那么您可以在新数据点上使用 k Nearest Neighbors 来找出它属于哪个类。
【讨论】:
我同意杜克林的观点。 k-means Clustering算法收敛后,可用于分类,标注样本较少。在找到离待分类的新点/样本最近的质心后,你只知道它属于哪个簇。在这里,您需要一个监督步骤来标记每个集群。例如,假设您将每个集群标记为 C1、C2 和 C3。这需要来自这些集群的具有已知标签的少量样本。完成此操作后,closet 簇标签将成为新点/样本的标签,因此它被分类为 C1、C2 或 C3。【参考方案3】:最简单的方法当然是 2.,将每个对象分配给最近的质心(从技术上讲,使用平方和,而不是欧几里德距离;这对于 k-means 更正确,并为您节省了 sqrt 计算)。
方法 1. 是脆弱的,因为 k-means 可能会给你一个完全不同的解决方案;特别是如果它一开始就不能很好地适合您的数据(例如,维度太高、集群大小差异太大、集群太多……)
但是,下面的方法可能更合理:
3.训练一个实际的分类器。
是的,您可以使用 k-means 生成初始分区,然后假设 k-means 分区可能是合理的类(您真的应该在某个时候验证这一点),然后如果数据已被用户标记,则继续。
即运行 k-means,在生成的集群上训练 SVM。然后使用 SVM 进行分类。
k-NN 分类,甚至将每个对象分配到最近的聚类中心(选项 1)可以看作是非常简单的分类器。后者是一个 1NN 分类器,仅在集群质心上“训练”。
【讨论】:
为什么平方和比欧几里得距离更正确?正如您所提到的,差异不只是平方根吗? k-means 找到的最小二乘最优不是最小非二乘解。所以为了与 k-means 优化问题形式上一致,请使用正方形。【参考方案4】:如果您要在使用过程中识别新条件(或适应不断变化的系统)进行实时分析,那么您可以选择质心周围的一些半径来决定新点是否启动新集群或应该包含在现有的中。 (这是监控工厂数据的常见需求,例如,安装后可能需要数年时间才会出现某些操作条件。)如果您需要实时监控,请检查 RTEFC 或 RTMAC,它们是高效、简单的实时K-means 的变体。特别是 RTEFC,它是非迭代的。见http://gregstanleyandassociates.com/whitepapers/BDAC/Clustering/clustering.htm
是的,您可以将其用于分类。如果您已决定为所有可能的情况收集了足够的数据,则可以停止更新集群,并根据最近的质心对新点进行分类。与任何实时方法一样,会对异常值敏感 - 例如,在使用传感器数据时由传感器错误或故障引起。如果您创建新集群,如果集群的一个目的是识别传感器中的故障,则异常值可能被认为是合法的,尽管当您可以对集群进行一些标记时这是最有用的。
【讨论】:
【参考方案5】:这里有另一种方法:
我在“统计学习的要素”上看到了它。我会稍微改变一下符号。令 C 为类数,K 为聚类数。现在,请按照以下步骤操作:
-
对每个类中的训练数据分别应用 K-means 聚类,每个类使用 K 个聚类。
为每个 C*K 集群分配一个类标签。
将观测 x 分类到最近的集群的类别。
这似乎是一种不错的分类方法,通过使用集群来减少数据观察。
【讨论】:
但是我们怎么知道簇的标签呢?【参考方案6】:您混淆了聚类和分类的概念。标记数据后,您就已经知道数据是如何根据标签进行聚类的,除非您想了解您的特征在区分类别方面的能力,否则对数据进行聚类是没有意义的。
如果您运行 k-means 算法来找到每个类的质心,然后使用与质心的距离来对新数据点进行分类,那么您实际上实现了一种形式的线性判别分析算法,假设相同的多重-所有类的同一性协方差矩阵。
【讨论】:
【参考方案7】:k-means Clustering 算法收敛后,可用于分类,标记样本/训练数据很少。 当标签的训练实例(数据)的数量由于标签成本高昂而非常有限时,这是一种非常常见的方法。
【讨论】:
以上是关于k-means聚类可以做分类吗?的主要内容,如果未能解决你的问题,请参考以下文章