🎲 章节概览
三维可视化是数据科学和统计学习中的重要工具,能够展示三个或更多维度的数据关系。 本章系统讲解三维散点图、多项式分布、多元高斯分布、Dirichlet分布等5种三维可视化技法。 通过立体视角观察数据,揭示隐藏在高维空间中的模式和结构。 特别是在概率论和贝叶斯统计中,三维可视化是理解多元分布的关键手段。
三维散点
scatter3D 在三维空间中展示数据点
📊 各种样式的三维散点
- • 基本三维散点图:使用scatter3D可视化鸢尾花数据(图1)
- • 在不同平面上的投影:z=1平面、x₂=5平面、x₁=8平面投影(图2-3)
- • 绘制三维散点图:使用zdir参数控制投影方向
三维散点图探索
使用scatter3D在三维空间中可视化鸢尾花数据
💡 各种样式的三维散点:使用scatter3D可视化三维数据。 x轴代表花萼长度,y轴代表花萼宽度,z轴代表花瓣长度。
图1. 基本三维散点图
图2. 按类别着色
📝 关键技术
- • ax.scatter3D(x1, x2, x3):绘制三维散点图
- • zdir 参数:指定投影方向,'z'、'y' 或 'x'
- • s 参数:控制散点大小,可映射数据特征
- • c 参数:控制散点颜色,可用于分类或连续值映射
- • marker 参数:控制标记形状,如 'o'、'x' 等
展示更多特征
通过散点大小、颜色和标记样式可视化多维特征
🎨 Matplotlib 更多特征展示
- • 散点大小:用散点大小可视化鸢尾花类度(图4)
- • 用颜色区分类别:用颜色可视化鸢尾花类别(图5-6)
- • 同时可视化差尾花类美别:结合颜色和分标记样式
- • 用连续颜色映射:rainbow colormap 展示类型度(图7-8)
- • 用标记区类别展示特征:不同标记符号区分类别
展示更多特征
通过散点大小、颜色、标记样式展示更多维度的信息
📊 用散点大小和颜色可视化花萼花瓣尺寸度
散点大小由 x₄ (花瓣长度) 决定,使用 s=x4*20 控制。 通过不同大小,20进行缩放。
📝 Matplotlib 关键技术
- • s=x4*20:控制散点大小,s 决定每个散点的大小,通过 x4 决定,并且通过以 20 进行缩放
- • c=labels:表示使用 labels 数据的值来确定每个散点的颜色
- • cmap=rainbow:指定了颜色映射,从蓝到红的映射关系
- • marker 参数:满足 x4 > 1 的用 marker='o' 来展示数点,满足 x4<=1 的数据用 marker='x' 来展示
可视化三元概率分布
多项分布与三元高斯分布的可视化方法
📊 至此,多种可视化技法
- • 多项分布:用三维散点可视化多项分布(图15)
- • 高斯分布:三种不同方向切豆腐(图10),分层散点图或切片可视化三元高斯分布(图16)
- • 标准化数据的椭圆等高线:等高线为马氏距离(图11)
- • 马氏距离:计算单一点马氏距离平方(图12-14),对一组坐标点的元素矩阵运算过程
可视化三元概率分布
多项分布、三元高斯分布的多种可视化方法
📊 多项分布 (Multinomial Distribution)
图15展示用三维散点可视化多项分布。多项分布是一种离散概率分布, 用于描述在多项试验中各个可能结果出现次数的概率分布。 x₁, x₂, x₃ 的取值范围为 [0, 20] 区间内的整数,颜色代表多项分布的概率质量值。
p = [0.33, 0.33, 0.34]
p = [0.60, 0.30, 0.10]
p = [0.20, 0.20, 0.60]
p = [0.10, 0.80, 0.10]
📝 关键概念
- • 多项分布:离散随机变量,用于描述多项试验结果出现次数
- • 三元高斯分布:概率密度在数据空间是四维数据,分层散点或切片可视化三元高斯分布
- • 马氏距离:d² = (x-μ)ᵀ Σ⁻¹ (x-μ),考虑协方差的距离度量
- • 等高线椭圆:马氏距离相等的点构成椭圆,反映协方差矩阵的结构
Dirichlet分布概率密度
单纯形上的Dirichlet分布可视化
Dirichlet分布随机数
Dirichlet分布随机采样可视化
📊 概率分布动画器(Distribution Animator)
观察概率分布的样本逐步生成过程
👀 观察要点
- • 样本点聚集在均值(μ₁, μ₂)周围
- • 标准差σ控制分散程度
- • 颜色编码概率密度
📈 分布类型
📊 统计信息
📚 分布特性
🎓 概率分布理论
# ===== 示例1:多项式分布可视化 =====
from scipy.stats import multinomial
import numpy as np
import matplotlib.pyplot as plt
def visualize_multinomial(p_array, num=20):
# 生成网格
x1_array = np.arange(num + 1)
x2_array = np.arange(num + 1)
xx1, xx2 = np.meshgrid(x1_array, x2_array)
# 计算第三维(x1 + x2 + x3 = num)
xx3 = num - xx1 - xx2
xx3 = np.where(xx3 >= 0.0, xx3, np.nan)
# 计算PMF
PMF_ff = multinomial.pmf(
x=np.array(([xx1.ravel(), xx2.ravel(), xx3.ravel()])).T,
n=num, p=p_array
)
PMF_ff = np.where(PMF_ff > 0.0, PMF_ff, np.nan)
PMF_ff = np.reshape(PMF_ff, xx1.shape)
# 三维散点图
fig = plt.figure(figsize=(5, 5))
ax = plt.axes(projection="3d")
scatter_plot = ax.scatter3D(
xx1.ravel(), xx2.ravel(), xx3.ravel(),
s=50, marker='.',
alpha=1,
c=PMF_ff.ravel(),
cmap='RdYlBu_r'
)
ax.set_proj_type('ortho')
ax.set_xlabel('$x_1$')
ax.set_ylabel('$x_2$')
ax.set_zlabel('$x_3$')
ax.set_xlim(0, num)
ax.set_ylim(0, num)
ax.set_zlim3d(0, num)
ax.view_init(azim=30, elev=30)
ax.grid()
plt.show()
# 示例:均匀概率
p_array = [1/3, 1/3, 1/3]
visualize_multinomial(p_array)
# 示例:不均匀概率
p_array = [0.2, 0.2, 0.6]
visualize_multinomial(p_array)
# ===== 示例2:三维高斯分布概率密度 =====
def Mahal_d(Mu, Sigma, x):
# 计算马哈距离
x_demeaned = x - Mu # 中心化
inv_covmat = np.linalg.inv(Sigma) # 协方差矩阵求逆
mahal_sq = x_demeaned @ inv_covmat @ x_demeaned.T
mahal_sq = np.diag(mahal_sq) # 对角线元素
mahal_d = np.sqrt(mahal_sq) # 开平方
return mahal_d
def Mahal_d_2_pdf(d, Sigma):
# 将马氏距离转化为概率密度
scale_1 = np.sqrt(np.linalg.det(Sigma))
scale_2 = (2*np.pi)**(3/2)
gaussian = np.exp(-d**2/2)
pdf = gaussian/scale_1/scale_2
return pdf
# 生成三维网格
x1 = np.linspace(-2, 2, 31)
x2 = np.linspace(-2, 2, 31)
x3 = np.linspace(-2, 2, 31)
xxx1, xxx2, xxx3 = np.meshgrid(x1, x2, x3)
# 定义参数
Mu = np.array([[0, 0, 0]])
Sigma = np.array([[1, 0.6, -0.4],
[0.6, 1.5, 1],
[-0.4, 1, 2]])
x_array = np.vstack([xxx1.ravel(), xxx2.ravel(), xxx3.ravel()]).T
# 计算马氏距离和概率密度
d_array = Mahal_d(Mu, Sigma, x_array)
d_array = d_array.reshape(xxx1.shape)
pdf_zz = Mahal_d_2_pdf(d_array, Sigma)
# 可视化切片(沿x3轴)
fig = plt.figure(figsize=(6, 6))
ax = fig.add_subplot(projection='3d')
x3_slice_idx = 15 # 选择x3 = 0的切片
ax.scatter(xxx1[:, :, x3_slice_idx].ravel(),
xxx2[:, :, x3_slice_idx].ravel(),
xxx3[:, :, x3_slice_idx].ravel(),
c=pdf_zz[:, :, x3_slice_idx].ravel(),
cmap='turbo', s=4)
ax.view_init(azim=-120, elev=30)
ax.set_proj_type('ortho')
ax.set_xlabel('$x_1$')
ax.set_ylabel('$x_2$')
ax.set_zlabel('$x_3$')
plt.show()
# 💡 关键学习点:
# 1. multinomial.pmf():计算多项式分布概率
# 2. x1 + x2 + x3 = n:多项式分布约束
# 3. 马哈距离:考虑协方差的距离度量
# 4. 三维散点图:c参数映射颜色
# 5. 切片可视化:观察高维分布的局部结构📚 章节总结
三维绘图基础
- ✓ scatter3D:三维散点图
- ✓ plot_surface:三维曲面
- ✓ 视角控制:elev、azim参数
- ✓ 颜色映射:cmap编码
概率分布可视化
- ✓ 多项式分布:离散概率
- ✓ 多元高斯:连续概率密度
- ✓ Dirichlet:单纯形分布
- ✓ 等高线:投影到平面
应用场景
- ✓ 多元统计:理解多维分布
- ✓ 机器学习:特征空间可视化
- ✓ 贝叶斯:先验后验分布
- ✓ 主题模型:LDA可视化
💡 核心洞察: 三维可视化突破了平面的限制,让我们能够观察高维数据的真实结构。 在概率论中,多元分布的概率密度曲面直观展示了不同变量组合的可能性。 Dirichlet分布是单纯形上的分布,广泛应用于主题模型(如LDA)和贝叶斯统计。 通过旋转、缩放等交互操作,可以从不同角度观察数据,发现隐藏的模式。
🎓核心概念解析
三维坐标系
多项式分布
多元高斯分布
Dirichlet分布
视角控制
单纯形(Simplex)
💻关键函数速查表
三维绘图
概率分布
视角与样式
📐 核心数学公式
× exp(-1/2 (x-μ)ᵀ Σ⁻¹ (x-μ))
× ∏xᵢ^(αᵢ-1)
= n! / (n₁!...nₖ!) × ∏pᵢ^nᵢ
📂Python代码文件
本章内容对应以下Jupyter Notebook代码文件:
BK_2_Ch13_01.ipynb小节 13.1BK_2_Ch13_02.ipynb小节 13.2BK_2_Ch13_03.ipynb小节 13.3BK_2_Ch13_04.ipynb小节 13.4BK_2_Ch13_05.ipynb小节 13.5books/Book2_Beauty-of-Data-Visualization/Book2_Ch13_Python_Codes/📖 延伸阅读
理论基础
- • 多元统计:协方差矩阵、马氏距离
- • 概率论:多元分布、条件分布、边缘分布
- • 贝叶斯统计:共轭先验、后验更新
- • 线性代数:特征值分解、正定矩阵
实际应用
- • 主题模型:LDA(Latent Dirichlet Allocation)
- • 聚类分析:高斯混合模型(GMM)
- • 降维可视化:PCA、t-SNE的三维展示
- • 地球科学:三维地质数据可视化