You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:06:07