求助:基于颜色展示高斯混合模型(GMM)软分配的绘图实现
GMM软分配可视化实现方案
我希望基于高斯混合模型(GMM)的概率值实现软分配可视化,展示数据点在两个(或更多)聚类间的隶属关系。
我尝试使用predict_proba(X)的最大值作为概率值,通过labels*probability的方式实现,但该方法对labels=0的情况无效,相关代码如下:
ax.scatter(X[:, 0], X[:, 1], c=labels*probability)
解决思路与代码示例
双聚类场景
直接用样本对某一类的隶属概率作为颜色映射依据,搭配过渡色阶的colormap,就能直观体现每个点的软分配关系:
import matplotlib.pyplot as plt from sklearn.mixture import GaussianMixture import numpy as np # 生成模拟数据 np.random.seed(42) X = np.concatenate([np.random.normal(0, 1, (100, 2)), np.random.normal(3, 1, (100, 2))]) # 拟合GMM模型 gmm = GaussianMixture(n_components=2, random_state=42) gmm.fit(X) # 获取每个样本对两类的隶属概率 probs = gmm.predict_proba(X) # 绘制软分配可视化 fig, ax = plt.subplots() # 用聚类0的隶属概率作为颜色值,coolwarm色阶体现从聚类0到聚类1的过渡 scatter = ax.scatter(X[:, 0], X[:, 1], c=probs[:, 0], cmap='coolwarm', alpha=0.7) # 添加颜色条说明概率对应关系 plt.colorbar(scatter, label='隶属聚类0的概率') ax.set_title('GMM双聚类软分配可视化') plt.show()
多聚类场景
给每个聚类定义基础颜色,通过隶属概率加权混合颜色,让样本颜色直观反映对各聚类的隶属程度:
# 生成三类模拟数据 X = np.concatenate([np.random.normal(0, 1, (100, 2)), np.random.normal(3, 1, (100, 2)), np.random.normal(1.5, 1, (100, 2))]) # 拟合3聚类GMM gmm = GaussianMixture(n_components=3, random_state=42) gmm.fit(X) probs = gmm.predict_proba(X) # 定义每个聚类的基础RGB颜色 base_colors = np.array([[1, 0, 0], # 聚类0:红色 [0, 1, 0], # 聚类1:绿色 [0, 0, 1]]) # 聚类2:蓝色 # 计算每个样本的混合颜色(概率加权求和) sample_colors = probs @ base_colors # 绘制可视化 fig, ax = plt.subplots() ax.scatter(X[:, 0], X[:, 1], c=sample_colors, alpha=0.7) ax.set_title('GMM多聚类软分配可视化') plt.show()
原方法无效原因
labels*probability的方式中,当labels=0时,计算结果全为0,无法区分这些点对聚类0的具体隶属概率(比如是0.6还是0.9),丢失了软分配的核心信息。而上面的方法直接利用完整的隶属概率数据,能准确展示每个样本在聚类间的归属关系。
内容的提问来源于stack exchange,提问作者karas87
相关产品推荐
相关产品推荐

