我在一个大的、非常密集的数据集上进行一些kmeans集群,我试图找出实现集群可视化的最佳方法。
在2d中,看起来hexbin会做得很好,但我不能在同一个图上过度绘制集群。我想分别在每个集群上使用hexbin,为每个集群使用不同的颜色映射,但出于某种原因,这似乎不起作用。
图片显示了当我试图绘制第二和第三组数据时得到的结果。
关于如何解决这个问题有什么建议吗?
在做了一些小动作之后,我可以用Seaborn's kdeplot
最佳答案
我个人认为kdeplot的解决方案相当不错(尽管我会在集群拦截部分做一些工作)。在任何情况下,作为对问题的响应,您都可以为hexbin提供最小计数(使所有空单元格保持透明)。下面是一个小函数,可以为任何想做一些实验的人生成随机集群(在评论中,您的问题似乎引起了用户的极大兴趣,可以自由使用它):
import numpy as np
import matplotlib.pyplot as plt
# Building random clusters
def cluster(number):
def clusterAroundX(a,b,number):
x = np.random.normal(size=(number,))
return (x-x.min())*(b-a)/(x.max()-x.min())+a
def clusterAroundY(x,m,b):
y = x.copy()
half = (x.max()-x.min())/2
middle = half+x.min()
for i in range(x.shape[0]):
std = (x.max()-x.min())/(2+10*(np.abs(middle-x[i])/half))
y[i] = np.random.normal(x[i]*m+b,std)
return y + np.abs(y.min())
m,b = np.random.randint(-700,700)/100,np.random.randint(0,50)
print(m,b)
f = np.random.randint(0,30)
l = f + np.random.randint(10,50)
x = clusterAroundX(f,l,number)
y = clusterAroundY(x,m,b)
return x,y
,使用这段代码,我生成了一些用散点图绘制的集群A(我通常将其用于自己的集群分析,但我想我应该看看Seaborn)、Hexbin、imshow(更改pcolormesh以获得更多控制权)和Contourf:
clusters = 5
samples = 300
xs,ys = [],[]
for i in range(clusters):
x,y = cluster(samples)
xs.append(x)
ys.append(y)
# SCATTERPLOT
alpha = 1
for i in range(clusters):
x,y = xs[i],ys[i]
color = (np.random.randint(0,255)/255,np.random.randint(0,255)/255,np.random.randint(0,255)/255)
plt.scatter(x,y,c = color,s=90,alpha=alpha)
plt.show()
# HEXBIN
# Hexbin seems a bad choice because I think you cant control the size of the hexagons.
alpha = 1
cmaps = ['Reds','Blues','Purples','Oranges','Greys']
for i in range(clusters):
x,y = xs[i],ys[i]
plt.hexbin(x,y,gridsize=20,cmap=cmaps.pop(),mincnt=1)
plt.show()
# IMSHOW
alpha = 1
cmaps = ['Reds','Blues','Purples','Oranges','Greys']
xmin,xmax = min([i.min() for i in xs]), max([i.max() for i in xs])
ymin,ymax = min([i.min() for i in ys]), max([i.max() for i in ys])
nums = 30
xsize,ysize = (xmax-xmin)/nums,(ymax-ymin)/nums
im = [np.zeros((nums+1,nums+1)) for i in range(len(xs))]
def addIm(im,x,y):
for i,j in zip(x,y):
im[i,j] = im[i,j]+1
return im
for i in range(len(xs)):
xo,yo = np.int_((xs[i]-xmin)/xsize),np.int_((ys[i]-ymin)/ysize)
#im[i][xo,yo] = im[i][xo,yo]+1
im[i] = addIm(im[i],xo,yo)
im[i] = np.ma.masked_array(im[i],mask=(im[i]==0))
for i in range(clusters):
# REPLACE BY pcolormesh if you need more control over image locations.
plt.imshow(im[i].T,origin='lower',interpolation='nearest',cmap=cmaps.pop())
plt.show()
# CONTOURF
cmaps = ['Reds','Blues','Purples','Oranges','Greys']
for i in range(clusters):
# REPLACE BY pcolormesh if you need more control over image locations.
plt.contourf(im[i].T,origin='lower',interpolation='nearest',cmap=cmaps.pop())
plt.show()
结果如下: