共计 2228 个字符,预计需要花费 6 分钟才能阅读完成。
为什么需要 3D 聚类图
在数据科学项目中,我们经常需要探索数据的分布模式。传统的 2D 散点图虽然简单直观,但当数据具有三个关键维度时,2D 图就无法完整展现数据的内在结构。这时,3D 聚类图就派上了用场。

新手常遇到的几个痛点:
- 高维数据直接可视化会导致严重的 ” 维度灾难 ”,难以发现有效模式
- 不同聚类算法对参数设置非常敏感,调优过程令人困惑
- 静态的 3D 图交互性差,难以从不同角度观察数据分布
算法选型:K-means vs DBSCAN
K-means 特点
- 时间复杂度:O(nki),n 为样本数,k 为簇数,i 为迭代次数
- 假设数据呈球形分布
- 需要预先指定簇数量 k
- 对噪声和异常值敏感
DBSCAN 特点
- 时间复杂度:O(n log n)(使用空间索引时)
- 能发现任意形状的簇
- 自动确定簇数量
- 可以识别噪声点
在 3D 空间中,如果数据分布不均匀或存在噪声,DBSCAN 通常表现更好。
Python 实现全流程
数据预处理
from sklearn.preprocessing import StandardScaler
def preprocess_data(data):
"""
数据标准化处理
参数:
data: numpy 数组或类数组结构
返回:
标准化后的数据
"""
scaler = StandardScaler()
return scaler.fit_transform(data)
聚类算法实现
K-means 示例
from sklearn.cluster import KMeans
def kmeans_cluster(data, n_clusters=3):
"""
K-means 聚类实现
参数:
data: 预处理后的数据
n_clusters: 预设的簇数量
返回:
聚类标签
"""
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
return kmeans.fit_predict(data)
DBSCAN 示例
from sklearn.cluster import DBSCAN
def dbscan_cluster(data, eps=0.5, min_samples=5):
"""
DBSCAN 聚类实现
参数:
data: 预处理后的数据
eps: 邻域半径
min_samples: 核心点的最小邻域样本数
返回:
聚类标签
"""
dbscan = DBSCAN(eps=eps, min_samples=min_samples)
return dbscan.fit_predict(data)
3D 可视化
Matplotlib 基础版
import matplotlib.pyplot as plt
def plot_3d_matplotlib(data, labels):
"""
使用 Matplotlib 绘制静态 3D 聚类图
参数:
data: 三维数据
labels: 聚类标签
"""
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(data[:, 0], data[:, 1], data[:, 2],
c=labels, cmap='viridis', s=50)
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
plt.colorbar(scatter)
plt.title('3D 聚类结果(Matplotlib)')
plt.show()
Plotly 交互版
import plotly.express as px
def plot_3d_plotly(data, labels):
"""
使用 Plotly 绘制交互式 3D 聚类图
参数:
data: 三维数据
labels: 聚类标签
"""
fig = px.scatter_3d(x=data[:, 0], y=data[:, 1], z=data[:, 2],
color=labels, opacity=0.7)
fig.update_traces(marker_size=5)
fig.update_layout(title='3D 聚类结果(Plotly)')
fig.show()
性能优化:PCA 降维
当处理高维数据时,可以先使用 PCA 降维到 3D 再进行聚类和可视化:
from sklearn.decomposition import PCA
def apply_pca(data, n_components=3):
"""
应用 PCA 降维
参数:
data: 原始数据
n_components: 要保留的主成分数量
返回:
降维后的数据
"""
pca = PCA(n_components=n_components)
return pca.fit_transform(data)
常见问题与解决方案
- 欧式距离陷阱
- 问题:在 3D 空间中,欧式距离可能无法准确反映数据相似度
-
解决:尝试马氏距离或余弦相似度等其他距离度量
-
z 轴尺度扭曲
- 问题:z 轴比例不当会导致视觉失真
-
解决:使用
ax.set_box_aspect设置合适的纵横比 -
颜色映射误导
- 问题:连续颜色映射可能误导离散聚类结果
- 解决:使用离散的颜色映射或直接指定类别颜色
延伸思考
- 如何处理具有时间维度的 4D 聚类问题?
- 当数据维度远高于 3D 时,除了 PCA 还有哪些降维方法值得尝试?
- 如何评估 3D 聚类结果的质量?
通过本文的学习,你应该已经掌握了 3D 聚类图的基本实现方法。建议读者动手尝试不同的数据集和参数设置,体验不同算法在 3D 空间中的表现差异。在实际项目中,交互式可视化工具如 Plotly 往往能提供更丰富的数据洞察。
正文完
发表至: 未分类
近两天内
