在Python中实现多元核密度估计(KDE)并进行3D可视化是一项强大的数据分析技术,它能够帮助我们更好地理解多维数据的空间分布特征。以下是两种不同的方法来实现这一目标。
首先,我们可以直接在生成高斯KDE的点上评估其密度值,并根据这些值对点进行着色以直观地显示密度分布:
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
mu = np.array([1, 10, 20])
sigma = np.matrix([[4, 10, 0], [10, 25, 0], [0, 0, 100]])
data = np.random.multivariate_normal(mu, sigma, 1000)
values = data.T
kde = stats.gaussian_kde(values)
density = kde(values)
fig, ax = plt.subplots(subplot_kw=dict(projection='3d'))
x, y, z = values
ax.scatter(x, y, z, c=density, cmap='viridis')
plt.show()
对于更加复杂的数据分布,尤其是当数据点不在同一平面时,可以在一个规则的三维网格上计算KDE,并使用等值面(即三维轮廓)来可视化体积。这里推荐使用`mayavi`库来进行这种高级的3D可视化:
from mayavi import mlab
mu = np.array([1, 10, 20])
sigma = np.matrix([[20, 10, 10], [10, 25, 1], [10, 1, 50]])
data = np.random.multivariate_normal(mu, sigma, 1000)
values = data.T
kde = stats.gaussian_kde(values)
# 创建一个50x50x50的规则3D网格
xmin, ymin, zmin = data.min(axis=0)
xmax, ymax, zmax = data.max(axis=0)
xi, yi, zi = np.mgrid[xmin:xmax:50j, ymin:ymax:50j, zmin:zmax:50j]
# 在规则网格上评估KDE
coords = np.vstack([item.ravel() for item in [xi, yi, zi]])
density = kde(coords).reshape(xi.shape)
# 使用等值面绘制密度估计
mlab.contour3d(xi, yi, zi, density, cOntours=4, opacity=0.5)
mlab.axes()
mlab.show()
以上代码不仅展示了如何计算多元核密度估计,还提供了两种不同的方式来可视化这些估计结果,适用于不同场景下的数据分析需求。