聚类一维数据并在 matplotlib 直方图上表示聚类

Posted

技术标签:

【中文标题】聚类一维数据并在 matplotlib 直方图上表示聚类【英文标题】:clustering 1D data and representing clusters on matplotlib histogram 【发布时间】:2021-05-25 07:32:52 【问题描述】:

我有以下格式的一维数据:

areas = ...
plt.figure(figsize=(10, 10))
plt.hist(areas, bins=80)
plt.show()

这个情节看起来有点像这样:

现在我希望能够对这些数据进行聚类。我知道我可以选择Kernel Density Estimation 或 K-Means。但是一旦我有了这些值,我如何在直方图上表示这些集群?

【问题讨论】:

你想在histogram上绘制KDE,对吗? @JayPatel 我想要如上所示的直方图,但颜色表示它们来自这些数据点的集群。显示每种颜色的聚类中心的图例也非常好。 【参考方案1】:

您只需要弄清楚您的集群分配,然后分别绘制数据的每个子集,同时注意每次的 bin 都相同。

import numpy as np
import matplotlib.pyplot as plt

from sklearn.cluster import KMeans

import matplotlib as mpl
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.right'] = False

# simulate some fake data
n = 10000
mu1, sigma1 = 0, 1
mu2, sigma2 = 6, 2
a = mu1 + sigma1 * np.random.randn(n)
b = mu2 + sigma2 * np.random.randn(n)
data = np.concatenate([a, b])

# determine which K-Means cluster each point belongs to
cluster_id = KMeans(2).fit_predict(data.reshape(-1, 1))

# determine densities by cluster assignment and plot
fig, ax = plt.subplots()
bins = np.linspace(data.min(), data.max(), 40)
for ii in np.unique(cluster_id):
    subset = data[cluster_id==ii]
    ax.hist(subset, bins=bins, alpha=0.5, label=f"Cluster ii")
ax.legend()
plt.show()

【讨论】:

以上是关于聚类一维数据并在 matplotlib 直方图上表示聚类的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制直方图的密度而非计数? (Matplotlib)

Matplotlib 绘制直方图、散点图

python opencv实现绘制图像的灰度直方图

根据 Matplotlib 中的预计数数据绘制直方图

Matplotlib学习---用matplotlib画直方图/密度图(histogram, density plot)

在我的直方图 Python/Matplotlib 上添加数据标签