在高光谱遥感分析中,我们经常遇到高维特征空间:几百个波段的光谱向量。 之前我们介绍了 PCA,它是一种线性降维方法,能够高效去除冗余。但 PCA 的本质是寻找最大方差方向,并不能很好地捕捉 非线性流形结构。
有同学会问:
如果光谱数据其实“分布在某个非线性低维流形上”,PCA 还能找到真实的结构吗?
答案是:不一定。这就是 流形学习(Manifold Learning) 的用武之地。
往期内容和数据链接如下:
🧩 sklearn.manifold 常见方法
-
Isomap:保留流形上的测地距离,适合处理非线性嵌入问题。
-
Locally Linear Embedding (LLE):保持局部邻域的线性关系。
-
t-SNE:在二维空间中很好地展示样本之间的聚类关系(常用于可视化)。
-
MDS (多维尺度分析):通过保持样本对之间的距离关系实现降维。
-
Spectral Embedding:基于图拉普拉斯特征向量的降维方法。
这些方法常用于可视化与探索,而不是直接作为分类的预处理步骤,因为它们的映射方式通常不可逆,且计算成本较高。
💻 代码示例:KSC 数据二维流形可视化
下面的代码演示了如何用 sklearn.manifold 将 KSC 样本降到二维,并对比不同方法的效果。
# -*- coding: utf-8 -*-
"""
Sklearn案例⑮:流形学习与非线性降维(KSC 数据)
"""
import os, numpy as np, scipy.io as sio, matplotlib.pyplot as plt, matplotlib
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.manifold import Isomap, LocallyLinearEmbedding, TSNE, SpectralEmbedding
# ===== 中文显示 =====
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False
# ===== 基本参数 =====
DATA_DIR = r"your_path" # ← 修改为你的 KSC 数据路径
SAMPLE_N = 20 # 抽样数量,避免计算太慢
SEED = 42
# ===== 1. 读取数据 =====
X_cube = sio.loadmat(os.path.join(DATA_DIR, "KSC.mat"))["KSC"].astype(np.float32)
Y_map = sio.loadmat(os.path.join(DATA_DIR, "KSC_gt.mat"))["KSC_gt"].astype(int)
coords = np.argwhere(Y_map != 0)
X_all = X_cube[coords[:,0], coords[:,1]]
y_all = Y_map[coords[:,0], coords[:,1]] - 1
num_classes = y_all.max() + 1
print(f"有标签像素: {len(y_all)}, 类别数: {num_classes}")
# 抽样(避免计算量过大)
np.random.seed(SEED)
idx = np.random.choice(len(y_all), size=SAMPLE_N, replace=False)
X_sample, y_sample = X_all[idx], y_all[idx]
# 标准化
X_std = StandardScaler().fit_transform(X_sample)
# ===== 2. 定义流形学习方法 =====
methods = {
"PCA (基线)": PCA(n_components=2, random_state=SEED),
"Isomap": Isomap(n_components=2, n_neighbors=10),
"LLE": LocallyLinearEmbedding(n_components=2, n_neighbors=10, random_state=SEED),
"Spectral Embedding": SpectralEmbedding(n_components=2, n_neighbors=10, random_state=SEED),
"t-SNE": TSNE(n_components=2, random_state=SEED, init="pca", learning_rate="auto")
}
# ===== 3. 可视化结果 =====
fig, axes = plt.subplots(1, len(methods), figsize=(18, 3.5), constrained_layout=True)
cmap = plt.get_cmap("tab20")
for ax, (name, model) in zip(axes, methods.items()):
Z = model.fit_transform(X_std)
sc = ax.scatter(Z[:,0], Z[:,1], c=y_sample, cmap=cmap, s=8)
ax.set_title(name)
plt.suptitle("KSC 数据二维流形降维对比", fontsize=14)
plt.show()
🔍 结果解读
-
PCA:作为基线,保留全局最大方差方向,但聚类结构不一定明显。
-
Isomap:能展开非线性结构,常用于流形展开。
-
LLE:对局部保持较好,适合流形较复杂时。
-
Spectral Embedding:基于图方法,适合样本点分布稀疏的情况。
-
t-SNE:最常见的可视化方法,能清晰看到类别簇状分布,但计算成本高。

✅ 总结
-
sklearn.manifold提供了多种非线性降维方法,在高光谱等高维数据的探索性分析中非常有用。 -
实验表明,PCA 虽然简单高效,但流形学习方法能更好地揭示数据的潜在结构。
-
需要注意:这些方法主要用于可视化与探索,不适合直接大规模应用于整图分类(计算量太大,且映射不可逆)。
下一篇(案例⑯),我们将介绍 sklearn.cluster 聚类方法,并演示在遥感影像上的无监督分类效果。
欢迎大家关注下方公众号获取更多内容!
937

被折叠的 条评论
为什么被折叠?



