繁体   English   中英

在kmeans中绘制二维聚类

[英]plotting 2 dimensional clusters in kmeans

我编写了一个函数,它可以在正态分布上进行kmeans聚类。 该函数可用于一维和二维正态分布。 绘制1d kmeans聚类非常简单,可以使用以下方法完成:

    plot(data[idx==0,0],data[idx==0,1],'ob',
         data[idx==1,0],data[idx==1,1],'or',
         data[idx==2,0],data[idx==2,1],'og',
         data[idx==3,0],data[idx==3,1],'oy',
         data[idx==4,0],data[idx==4,1],'oc')

    plot(centroids[:,0],centroids[:,1],'sg',markersize=8)
    show()

这将给出这样的情节:

1-d正态分布的kmeans

2d正态分布图如下所示:

二维正态分布

2-D正态分布具有mean = [ab]var = [[pq],[rs]]用于聚类2d分布的质心也具有与点的均值和变量相同的形状(显然)。 我面临的问题是绘制这些数据。 如何使用python和matplotlib可视化。 因此,1-d情况下的点将被椭圆替换,质心也将是椭圆。 群集应该类似于: 结果的例子

其中黑色椭圆是2d分布,红色椭圆是2d质心。

我用来绘制单个2d分布的绘图函数是:

def plot2DND(mean, variance):
    mean1 = mean.flatten()
    cov1 = variance

    nobs = 2500
    rvs1 = np.random.multivariate_normal(mean1, cov1, size=nobs)

    plt.plot(rvs1[:, 0], rvs1[:, 1], '.')
    plt.axis('equal')
    plt.show()

下图更好地显示了需求(来自: http//www.lix.polytechnique.fr/~nielsen/pdf/2008-C-ClusteringNormal-ETVC.pdf

更好地显示所需的图

是否可以使用python和matplotlib(或其他库)实现类似的功能。 或者这种类型的数据可以更好地进行可视化?

您需要做的第一件事是更改绘图功能,以便绘制单个轮廓而不是所有点。 您可以使用Ellipse执行此操作,并使用方差矩阵的特征值和特征向量来查找角度(我希望我做得对,它可能需要方差对称)。

from matplotlib.patches import Ellipse

def plot_ellipse(mean, var, ec='k', alpha=1):
    evals, evecs = np.linalg.eig(var)
    ang = np.degrees(np.arctan2(*evecs[1]))
    ell = Ellipse(mean, *np.abs(evals), angle=ang, fc='None', ec=ec, alpha=alpha)
    plt.gca().add_artist(ell)

所以,假设你已经完成了数据所需的任何操作,最终得到了像mean_centroidsvariance_centroids这样的形状(k, 2)(k, 2, 2)

colors = ['r', 'g', 'b'] # length of this should be `k`

for i, (m, v) in enumerate(zip(mean_centroids, variance_centroids)):
    plot_ellipse(m, v, ec=colors[i])

你可能有一个包含大量均值和方差的数据数组,所以你可以循环遍历它,通过标签着色,你可以从centroids, labels = kmeans2(data, k)

for i, m, v in zip(labels, means, variances):
    plot_ellipse(m, v, ec=colors[i], alpha=.5)

顺便说一下,您可以用以下内容替换第一个散点图示例:

colors = ['b', 'r', 'g', 'y', 'c']
plt.scatter(*data.T, c=np.choose(ids, colors))

plt.plot(centroids[:,0],centroids[:,1],'sg',markersize=8)
show()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM