多元正态分布样本上的 Kmean
Posted
技术标签:
【中文标题】多元正态分布样本上的 Kmean【英文标题】:Kmean on multivariate normal distribution samples 【发布时间】:2021-07-25 04:39:44 【问题描述】:我是 Python 新手。我想对两个多元正态分布生成的样本执行 K 均值聚类。我生成了样本并执行了 K-means 聚类,但是当我想绘制聚类时出现错误。应该有一些我遗漏的尺寸问题。请在下面查看我的代码:
mean1 = [-1, -1.5]
cov1 = [[1, .2], [.2, 1]]
x1, y1 = np.random.default_rng().multivariate_normal(mean1, cov1, 100).T
mean2 = [1, 1.5]
cov2 = [[2, .1], [.1,2]]
x2, y2 = np.random.default_rng().multivariate_normal(mean2, cov2, 100).T
X = np.mat([x1,x2]).reshape(-1).transpose()
Y= np.mat([y1,y2]).reshape(-1).transpose()
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)
y_kmeans = np.array(kmeans.predict(X))
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
【问题讨论】:
您的意思是将您的数组与X = np.mat([x1,x2]).reshape(-1).transpose()
连接起来并得到一个包含200 个值的X
吗?
Y 应该是什么?
【参考方案1】:
由于不是很清楚,这是两种情况。如果您尝试生成一个X
,其中每个项目都有两个值,x1
和x2
,那么您将它们连接起来是错误的。您正在生成形状为(200, 1)
的X
而不是(100, 2)
。为此,您可以使用
X = np.stack((x1, x2)).reshape(-1, 2) # (100, 2)
or
X = np.concatenate((x1[:, None], x2[:, None]), axis=-1)
对于Y
Y = np.stack((y1, y2)).reshape(-1) # (200,)
or
Y = np.concatenate((y1, y2))
之后,您可以使用plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
毫无错误地获取您的情节。
如果您尝试对位于一条线上的样本进行聚类,即您的 X
是一维数组,您的绘图将失败,因为 X
包含样本,而您的 y
值应该只是一个零数组.在这种情况下,您的Y
与以前相同,但
X = np.stack((x1, x2)).reshape(-1, 1) # (200, 1)
or
X = np.concatenate((x1, x2), axis=0).reshape(-1, 1)
# The reshape(-1, 1) is necessary for sklearn's KMeans if the data has a single feature
然后,如果你用plt.scatter(X, np.zeros((X.shape[0],)), c=y_kmeans, s=50, cmap='viridis')
绘制你的结果,你会得到
【讨论】:
非常感谢您的回答。我发现我应该将 X 和 Y 组合在一个矩阵中,然后执行 k-means 聚类。当我这样做时,它起作用了。以上是关于多元正态分布样本上的 Kmean的主要内容,如果未能解决你的问题,请参考以下文章