如何为20特征的贝叶斯高斯混合模型绘制密度估计等高线?
实现方案
因为你的原始数据是20维高维数据,无法直接在二维平面同时展示所有维度的密度分布,以下是常用的展示所有聚类结果的实现方式:
方案1:指定两个特征维度,叠加所有聚类分量的等高线
可以在你现有绘图逻辑的基础上,单独计算每个高斯混合分量在指定两个维度下的边缘密度,分别绘制等高线,同时给原始样本点按聚类归属上色,效果清晰直观,代码如下:
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LogNorm from scipy.stats import multivariate_normal # 1. 先获取所有样本的聚类标签 labels = bgmm.predict(data) # 2. 选择要可视化的两个维度,这里沿用你示例中的第0、1维,可自行修改 dim1, dim2 = 0, 1 # 3. 生成坐标网格,和你原有逻辑一致 x = np.linspace(-20.0, 30.0, 100) y = np.linspace(-20.0, 40.0, 100) X, Y = np.meshgrid(x, y) pos = np.dstack((X, Y)) # 4. 遍历每个聚类分量,单独绘制对应等高线 for i in range(bgmm.n_components): # 提取当前分量对应两个维度的均值 mean = bgmm.means_[i, [dim1, dim2]] # 根据模型协方差类型提取对应两个维度的协方差矩阵 if bgmm.covariance_type == 'full': cov = bgmm.covariances_[i][[dim1, dim2], :][:, [dim1, dim2]] elif bgmm.covariance_type == 'diag': cov = np.diag(bgmm.covariances_[i, [dim1, dim2]]) elif bgmm.covariance_type == 'tied': cov = bgmm.covariances_[[dim1, dim2], :][:, [dim1, dim2]] elif bgmm.covariance_type == 'spherical': cov = np.eye(2) * bgmm.covariances_[i] # 计算当前分量的负对数密度,和你原有计算逻辑保持一致 rv = multivariate_normal(mean, cov) Z = -rv.logpdf(pos) # 绘制当前分量的等高线,设置半透明和虚线样式避免遮挡 plt.contour(X, Y, Z, norm=LogNorm(vmin=1.0, vmax=1000.0), levels=np.logspace(0, 2, 5), alpha=0.6, linestyles='--') # 5. 绘制原始样本点,按聚类标签区分颜色 scatter = plt.scatter(data[:, dim1], data[:, dim2], s=0.8, c=labels, cmap='tab10') plt.legend(handles=scatter.legend_elements()[0], labels=[f'聚类{i+1}' for i in range(bgmm.n_components)], bbox_to_anchor=(1.2, 1)) # 6. 保留原有的整体密度等高线和色条 total_Z = -bgmm.score_samples(pos.reshape(-1, 2)).reshape(X.shape) CS = plt.contour(X, Y, total_Z, norm=LogNorm(vmin=1.0, vmax=1000.0), levels=np.logspace(0, 3, 10), alpha=0.8) plt.colorbar(CS, shrink=0.8, extend="both") plt.xlabel(f'特征{dim1}') plt.ylabel(f'特征{dim2}') plt.tight_layout() plt.show()
方案2:绘制两两特征子图矩阵
如果需要查看所有特征维度下的聚类分布情况,可以生成20×20的子图矩阵,每个子图对应一组特征维度的组合,复用方案1的绘图逻辑即可,缺点是维度较多时单张子图会比较小。
内容的提问来源于stack exchange,提问作者user1393214
相关产品推荐
相关产品推荐

