散点图中的聚类和等高线
Posted
技术标签:
【中文标题】散点图中的聚类和等高线【英文标题】:Clustering and Contours in a Scatter Plot 【发布时间】:2021-05-01 07:07:03 【问题描述】:我有一个数据框的散点图。正如您在附图中看到的那样,在特定部分的特定颜色类型上存在聚类。有没有一种简单的方法可以对颜色图值进行聚类,然后绘制轮廓。即说选择 0 到 5 之间的值(用于颜色图)并绘制轮廓。
在 df 上绘制附加图的示例代码:
df.plot.scatter(x='length',
y='width',
c='species',
colormap='viridis')
【问题讨论】:
【参考方案1】:聚类是一种无监督程序,对标签/响应视而不见。您遇到问题的标签是您没有的集群组。所有其他信息(宽度、长度和甚至物种/颜色)都应被视为您的数据的特征,可用于无监督聚类。
不应该对地块进行操作的原因: 绘图/颜色图只是我们人类用我们的小大脑理解数据的一种方式。然而,复杂的算法不需要它——这些算法可以直接作用于您的数据特征(长度、宽度……)。当然,规则中也有例外,例如将音频数据显示为 2d 图像并运行卷积神经网络以使用其图像分类强度。但让我们专注于您手头的标准案例:
您想在数据中找到聚类,因此您应该直接对数据进行操作 让我们重现一个像你这样的例子(下次如果可能,请提供代码):
X = np.linspace(1,100,1000)
Y = np.random.normal(50,10,1000) # 1 series with randomized data
T = np.random.randint(1,30,1000) # respective species
Y2 = np.random.normal(70,2,1000) # 1 clustered band as second series
T2 = np.random.randint(1,15,1000)# respective species for second series
# combine series
X = np.r_[X,X]
Y = np.r_[Y,Y2]
T = np.r_[T,T2]
data = np.column_stack((X,Y,T))
#shuffle data so ML algorithms cannot take advantage of the order
np.random.shuffle(data)
# let's scale and cluster on the scaled data as this is common procedure
from sklearn.preprocessing import StandardScaler
s = StandardScaler()
data_s = s.fit_transform(data)
让我们集群:
from sklearn import mixture
clf = mixture.GaussianMixture(n_components=2, covariance_type='full', random_state=1)
pred = clf.fit_predict(data_s)
fig, axes = plt.subplots(1,2, figsize=(15,8))
axes = axes.ravel()
axes[0].scatter(data[:,0],data[:,1], c=data[:,2], cmap="jet", vmin=1, vmax=30, alpha=0.7, s=3)
axes[1].scatter(data_s[:,0],data_s[:,1], c=pred, cmap="jet", alpha=0.7, s=3)
plt.show()
利用所有给定的信息(宽度、长度和颜色),聚类算法可以很好地将波段与其他数据分开。 PS:关于不同聚类算法的信息:sklearn clustering
【讨论】:
以上是关于散点图中的聚类和等高线的主要内容,如果未能解决你的问题,请参考以下文章