这似乎是一个典型的聚类问题,如果数据看起来像您建议的那样,来自 scikit-learn 的 KMeans 应该可以解决问题。让我们看看我们如何做到这一点。
首先我正在生成一个数据样本,它可能看起来有点像您的数据。
import numpy as np
import matplotlib.pylab as plt
np.random.seed(1) # For reproducibility
cluster_1 = np.random.normal(loc = [1,1], scale = [0.2,0.2], size = (20,2))
cluster_2 = np.random.normal(loc = [2,1], scale = [0.4,0.4], size = (5,2))
plt.scatter(cluster_1[:,0], cluster_1[:,1])
plt.scatter(cluster_2[:,0], cluster_2[:,1])
plt.show()
points = np.vstack([cluster_1, cluster_2])
这就是数据的样子。
我们将进一步进行 KMeans 聚类。
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 2).fit(points)
我们选择 n_clusters 作为 2,认为数据集中有 2 个集群。找到这些集群后,让我们看看它们。
plt.scatter(points[kmeans.labels_==0][:,0], points[kmeans.labels_==0][:,1], label='cluster_1')
plt.scatter(points[kmeans.labels_==1][:,0], points[kmeans.labels_==1][:,1], label ='cluster_2')
plt.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1], label = 'cluster_center')
plt.legend()
plt.show()
这将如下图所示。
这应该可以解决您的问题。但是有一些事情应该牢记在心。
- 不会一直完美。
- 如果您没有任何异常值,可能会出现问题。可以通过轮廓分数来解决。
- 很难知道要丢弃哪个聚类(可以通过定位聚类中心(绿色点)来完成,也可以通过找到点数较少的聚类来完成。
尾注:您可能会遗漏一些要点,但会使整个过程自动化。取决于您希望在节省的数据与节省的手动时间方面做出多少权衡。