多元正态分布样本上的 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,其中每个项目都有两个值,x1x2,那么您将它们连接起来是错误的。您正在生成形状为(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的主要内容,如果未能解决你的问题,请参考以下文章

再多元线性回归分析中,t检验与F检验有何不同

异常检测: 应用多元高斯分布进行异常检测

np.random.multivariate_normal方法浅析

混合模型初探

Hotelling T2检验和多元方差分析

numpy.random.multivariate_normal()函数解析