如何将新数据分配给现有聚类

机器算法验证 聚类 k-均值 无监督学习
2022-04-15 15:19:43

我有以下情况。

假设我有一组 100 个名人,我使用 k-means 形成 4 个集群。让我们假设这 4 个集群是音乐、体育、政治、电影。

现在说如果我想包含 2 个新数据,聚类会起作用吗?如果是这样,如何将数据包含到适当的集群中......我的意思是我是否必须从头开始与 102(100 + 2 个新)名人进行集群,或者是否可以将 2 个新名人单独包含到现有集群中。

2个回答

为聚类算法分配新点总是有点令人困惑,因为聚类算法的结果是不完美的;它们代表当前数据的(希望是好的)分段的快照。它们对新数据的推广效果如何以及良好的实际定义是什么都是悬而未决的问题。也许我们基于某种聚类稳定性方法推导出该聚类,也许我们使用一些信息标准推导出它,也许我们使用一些启发式方法,例如GAP 统计量Davies-Bouldin 指数它们有很多方法。然而,尽管一个好的集群是模棱两可的,但一旦我们有了集群,一切都不会丢失,我们有类。

给定一个特定的聚类分割,我们可以训练一个健壮的分类器,我们将之前在聚类过程中分配的标签视为类。通过这种方式,我们可以更直观地解释聚类标签的非鲁棒性。让我强调一下,这并不完美,因为我们的初始数据并不完美,但它可以让我们自然地解释一定程度的不确定性。此外,正如我们期望的那样,我们必须反映“某种结构”的聚类,这是一种封装该结构的廉价且直接的方法。按照这个原理,当新点出现时,我们可以使用我们使用最初聚类的数据训练的分类器来预测新数据的类别(即它们所在的聚类)。不仅如此,我们还能够在某种程度上解释,

正如评论中提到的,在某些时候我们应该重做这个聚类分类过程,因为在我们积累了足够的新数据之后,聚类很可能会发展。这种“进化”将首先在靠近两个集群边界的点上被注意到。在这种情况下,一个新的点可能会“拉”一个集群的中心远离那个边界点,足以导致集群成员的变化,即。使我们原来的集群/类分配过时。我们什么时候应该重新训练也没有很好的定义;我建议一旦我们有计算时间,或者我们认为我们数据的底层结构应该已经发生了重大变化(即我们有概念漂移)。

我想只有 2 分不会把它弄得那么糟糕,但是对于超过 10%(说一个数字)来说,重新计算质心可能会更好(只是一个意见)

def Labs( dataset,centroids ):    
l = []
for i in range(len(dataset)):
    m = []
    for j in range(n):        
        p = np.linalg.norm(dataset[(i),:]-centroids[(j),:])
        m.append(p)
    po = np.argmin(m)
    l.append(po)
return pd.DataFrame(np.array(l) + 1,columns =['Lab'])