遥感&机器学习入门实战教程|Sklearn案例⑮:流形学习与非线性降维(manifold)

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

在高光谱遥感分析中,我们经常遇到高维特征空间:几百个波段的光谱向量。 之前我们介绍了 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 聚类方法,并演示在遥感影像上的无监督分类效果。

欢迎大家关注下方公众号获取更多内容!

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遥感AI实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值