← 返回Book 2目录
第13章

三维可视化

3D Visualization · 探索三维数据空间

从三维散点图到概率分布,掌握5种立体可视化技法

🎲 章节概览

三维可视化是数据科学和统计学习中的重要工具,能够展示三个或更多维度的数据关系。 本章系统讲解三维散点图、多项式分布、多元高斯分布、Dirichlet分布等5种三维可视化技法。 通过立体视角观察数据,揭示隐藏在高维空间中的模式和结构。 特别是在概率论和贝叶斯统计中,三维可视化是理解多元分布的关键手段。

📊
三维散点图
3D空间数据可视化
🎲
多项式分布
离散概率可视化
🔔
多元高斯
连续概率密度
🎨
Dirichlet分布
单纯形上的分布
13.1

三维散点

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' 等
13.2

展示更多特征

通过散点大小、颜色和标记样式可视化多维特征

🎨 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' 来展示
13.3

可视化三元概率分布

多项分布与三元高斯分布的可视化方法

📊 至此,多种可视化技法

  • • 多项分布:用三维散点可视化多项分布(图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-μ),考虑协方差的距离度量
  • • 等高线椭圆:马氏距离相等的点构成椭圆,反映协方差矩阵的结构
13.4

Dirichlet分布概率密度

单纯形上的Dirichlet分布可视化

13.5

Dirichlet分布随机数

Dirichlet分布随机采样可视化

📊 概率分布动画器(Distribution Animator)

观察概率分布的样本逐步生成过程

多元高斯分布 (μ₁=0, μ₂=0, σ=1)
0/100
速度1x

👀 观察要点

  • • 样本点聚集在均值(μ₁, μ₂)周围
  • • 标准差σ控制分散程度
  • • 颜色编码概率密度

📈 分布类型

均值 μ₁0.0
均值 μ₂0.0
标准差 σ1.0

📊 统计信息

样本数:0

📚 分布特性

多元高斯分布
• 由均值向量μ和协方差矩阵Σ确定
• 等高线为椭圆形
• 中心极限定理的基础

🎓 概率分布理论

🔔
多元高斯分布
概率密度函数呈钟形曲面,由均值向量μ和协方差矩阵Σ完全确定。 广泛应用于统计推断、机器学习、信号处理等领域。
🎨
Dirichlet分布
单纯形上的分布,是多项分布的共轭先验。 在贝叶斯统计和主题模型(LDA)中起核心作用。
🎯 学习目标:通过观察样本逐步生成,理解概率分布的随机性和规律性。 调整参数观察分布形态变化,建立参数与分布的直觉联系。
📚 Python绘图代码(基于Ch13原文)
# ===== 示例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)和贝叶斯统计。 通过旋转、缩放等交互操作,可以从不同角度观察数据,发现隐藏的模式。

🎓核心概念解析

三维坐标系

• x轴:水平方向(左右)
• y轴:深度方向(前后)
• z轴:垂直方向(上下)
• 右手坐标系:拇指x、食指y、中指z

多项式分布

• 二项分布的推广(k个类别)
• P(X₁=n₁, X₂=n₂, ..., Xₖ=nₖ)
• 约束条件:Σnᵢ = n
• 应用:骰子投掷、文本分类

多元高斯分布

• μ:均值向量
• Σ:协方差矩阵
• 概率密度:钟形曲面
• 等高线:椭圆或圆

Dirichlet分布

• 参数:α = (α₁, α₂, ..., αₖ)
• 定义域:单纯形 Σxᵢ = 1, xᵢ ≥ 0
• 多项分布的共轭先验
• LDA主题模型的核心

视角控制

• elev:仰角(垂直旋转)
• azim:方位角(水平旋转)
• dist:距离(缩放)
• 交互:鼠标拖动旋转

单纯形(Simplex)

• 2维单纯形:三角形边界
• 3维单纯形:四面体
• 概率单纯形:Σpᵢ = 1
• 三元图:展示三组分数据

💻关键函数速查表

三维绘图

from mpl_toolkits.mplot3d import Axes3D
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(x, y, z)
ax.plot_surface(X, Y, Z)

概率分布

scipy.stats.multinomial
scipy.stats.multivariate_normal
scipy.stats.dirichlet
.pdf() / .rvs()

视角与样式

ax.view_init(elev=30, azim=45)
ax.set_xlabel('X')
cmap='viridis'

📐 核心数学公式

多元高斯分布
f(x) = (2π)^(-k/2) |Σ|^(-1/2)
× exp(-1/2 (x-μ)ᵀ Σ⁻¹ (x-μ))
μ: 均值向量, Σ: 协方差矩阵
Dirichlet分布
f(x₁,...,xₖ) = Γ(Σαᵢ) / ∏Γ(αᵢ)
× ∏xᵢ^(αᵢ-1)
约束: Σxᵢ = 1, xᵢ ≥ 0
多项式分布
P(X₁=n₁,...,Xₖ=nₖ)
= n! / (n₁!...nₖ!) × ∏pᵢ^nᵢ
约束: Σnᵢ = n, Σpᵢ = 1
单纯形
Δₖ = {x ∈ ℝᵏ⁺¹ : Σxᵢ = 1, xᵢ ≥ 0}
k维单纯形

📂Python代码文件

本章内容对应以下Jupyter Notebook代码文件:

BK_2_Ch13_01.ipynb小节 13.1
BK_2_Ch13_02.ipynb小节 13.2
BK_2_Ch13_03.ipynb小节 13.3
BK_2_Ch13_04.ipynb小节 13.4
BK_2_Ch13_05.ipynb小节 13.5
📁 代码位置:books/Book2_Beauty-of-Data-Visualization/Book2_Ch13_Python_Codes/

📖 延伸阅读

理论基础

  • • 多元统计:协方差矩阵、马氏距离
  • • 概率论:多元分布、条件分布、边缘分布
  • • 贝叶斯统计:共轭先验、后验更新
  • • 线性代数:特征值分解、正定矩阵

实际应用

  • • 主题模型:LDA(Latent Dirichlet Allocation)
  • • 聚类分析:高斯混合模型(GMM)
  • • 降维可视化:PCA、t-SNE的三维展示
  • • 地球科学:三维地质数据可视化