有没有一种聚类算法可以使n个簇和n+1个“其他”簇?

人工智能 无监督学习 数据科学 聚类
2021-10-19 09:48:15

据我所知,所有聚类算法都假设所有交付的数据点都必须找到它的聚类。

我的问题是,是否有一种算法可以只关注 n 个集群(用户声明的数量)并尝试忽略(根据算法)不属于 n 个集群的其余点,如下图所示?例如,我们知道有 2 个类需要聚类(红色和绿色),其余的(蓝色)在任何聚类中都不需要,因此算法不会尝试将它们分配给任何聚类?

例如,如果我们有 1000 张动物图片,其中 200 张是狗,200 张是猫,其余的都是人类已知的所有其他动物,我们想要为猫制作 1 个集群,为狗制作 1 个集群,并且可能为所有人制作另一个集群其他与狗或猫不匹配的。

在此处输入图像描述

1个回答

所以,我准备了一些类似于你的草图的数据:

n , u = np.random.normal , np.random.uniform
x = np.concatenate([ n(1.0,0.2,100), n(3.0,0.3,100), u(0,10.0,100)])
y = np.concatenate([ n(7.0,0.4,100), n(5.0,0.3,100), u(0,10.0,100)])
# lets shuffle it a bit
idx = np.arange(x.shape[0])
np.random.shuffle(idx)
data = np.array([x,y])[:,idx]

在此处输入图像描述

然后我只是尝试使用sklearn.mixture.GaussianMixturen+1 = 3 个组件和默认参数:

gmm = GaussianMixture(n_components=3).fit(data.T)
cls = gmm.predict_proba(data.T).argmax(axis=1)

# Plotting
color = [['r','k','g'][i] for i in cls]
scatter(data[0],data[1],c=color, marker='.')
scatter(gmm.means_[:,0],gmm.means_[:,1],c='b',marker='o')

在此处输入图像描述

这看起来非常像你画的东西。