散点图中的聚类和等高线

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

【讨论】:

以上是关于散点图中的聚类和等高线的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib 在散点图中不显示图例

Matplotlib:等高线图顶部的前景散点图

python 可视化 散点图。柱状图等高线

使用树状图可视化聚类

为啥 k-means 聚类散点图显示不同的结果?

[散点图][Plotly][Python] 如何在散点图中标记心形