在过去的二十篇《Sklearn 入门实战教程》中,我们已经完整体验了传统机器学习方法在遥感中的应用: 从 预处理、分类器、集成学习、特征选择、指标评价,到 半监督、SVM 终章,一步步搭建了一个完整的遥感机器学习知识体系。

但是—— 随着遥感数据的不断增长与应用需求的提升,传统方法逐渐遇到瓶颈:

  • 高光谱数据的高维非线性特征,难以用简单的线性分类器处理;

  • 海量影像的空间上下文关系,需要更复杂的网络去建模;

  • 样本稀缺与分布复杂,让模型的泛化成为新的挑战。

这些,正是 深度学习 发挥优势的地方。

往期内容:遥感&机器学习入门实战教程深度学习与遥感数据集分享

📂 感知机能做什么?

  • 如果两类数据 线性可分,感知机一定能找到一条分界线;

  • 如果数据 非线性可分(如 XOR),单层感知机无能为力;

  • 但它是 深度学习的起点,后续的多层感知机(MLP)、CNN 都是在它的基础上发展而来。

💻 案例一:二维点的感知机分类(Numpy实现)

# -*- coding: utf-8 -*-
"""
深度学习案例①:感知机原理与实现(基础二维点)
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False

# ===== 1. 生成数据 =====
np.random.seed(42)
N = 100
X = np.random.randn(N,2)
y = (X[:,0] + X[:,1] > 0).astype(int)  # 分界线: x1+x2=0

# ===== 2. 初始化参数 =====
w = np.zeros(2); b = 0; lr = 0.1

# ===== 3. 训练 =====
for epoch in range(20):
    for i in range(N):
        xi, yi = X[i], y[i]
        y_hat = 1if np.dot(w, xi) + b >= 0else0
        update = lr * (yi - y_hat)
        w += update * xi
        b += update

print("训练后参数: w =", w, " b =", b)

# ===== 4. 可视化结果 =====
plt.scatter(X[:,0], X[:,1], c=y, cmap=plt.cm.Set1, edgecolors='k')
xx = np.linspace(-3,3,100)
yy = -(w[0]*xx + b)/w[1]
plt.plot(xx,yy,'b-',label='感知机分界线')
plt.legend(); plt.title("二维点的感知机分类结果")
plt.show()

👉 结果:你会看到一条直线,把红点和蓝点分开。

图片

💻 案例二:KSC 遥感数据上的感知机分类

上面我们用二维点做了启蒙,现在换成 真实的高光谱遥感数据(KSC 数据集)。 由于感知机只能线性分类,这里我们用 sklearn 的 Perceptron 实现

# -*- coding: utf-8 -*-
"""
深度学习案例①:感知机在KSC高光谱数据上的应用
"""
import os, numpy as np, scipy.io as sio, matplotlib.pyplot as plt, matplotlib
from matplotlib.colors import ListedColormap, BoundaryNorm
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Perceptron
from sklearn.metrics import accuracy_score, cohen_kappa_score, confusion_matrix, classification_report

matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False

# ===== 1. 读取 KSC 数据 =====
DATA_DIR = r"your_path"   # ←修改为你的路径,含 KSC.mat / KSC_gt.mat
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)
h,w,b = X_cube.shape

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 = int(y_all.max()+1)

# ===== 2. 划分数据集 =====
X_tr, X_te, y_tr, y_te = train_test_split(
    X_all, y_all, train_size=0.3, stratify=y_all, random_state=42
)

# ===== 3. 预处理:标准化 =====
scaler = StandardScaler().fit(X_tr)
X_train = scaler.transform(X_tr)
X_test  = scaler.transform(X_te)

# ===== 4. 感知机模型 =====
clf = Perceptron(max_iter=1000, eta0=0.01, random_state=42)
clf.fit(X_train, y_tr)
y_pred = clf.predict(X_test)

# ===== 5. 评估 =====
oa    = accuracy_score(y_te, y_pred)
kappa = cohen_kappa_score(y_te, y_pred)
cm    = confusion_matrix(y_te, y_pred, labels=np.arange(num_classes))

print(f"[KSC 感知机] OA={oa*100:.2f}%  Kappa={kappa:.4f}")
print(classification_report(y_te, y_pred, digits=4, zero_division=0))

# ===== 6. 整图预测 =====
X_flat = X_cube.reshape(-1, b)
X_flat_std = scaler.transform(X_flat)
pred_map = clf.predict(X_flat_std).reshape(h, w) + 1

base_cmap  = plt.get_cmap('tab20')
colors     = [base_cmap(i % 20) for i in range(num_classes)]
cmap       = ListedColormap(colors)
boundaries = np.arange(0.5, num_classes+1.5, 1)
norm       = BoundaryNorm(boundaries, cmap.N)

plt.figure(figsize=(8.6,6.4))
im = plt.imshow(pred_map, cmap=cmap, norm=norm)
plt.title("KSC 感知机整图预测结果")
plt.axis("off")
cbar = plt.colorbar(im, boundaries=boundaries,
                    ticks=np.arange(1,num_classes+1,max(1,num_classes//12)),
                    fraction=0.046, pad=0.04)
cbar.set_label("类别ID", rotation=90)
plt.show()

👉 结果:

  • OA/Kappa 会打印在控制台(通常比 SVM/随机森林差很多);

图片

  • 整图预测

图片

🔍 总结

  • 感知机是深度学习的起点,虽然表达能力有限,但帮助我们理解了神经元、权重、偏置的概念。

  • 在二维点案例中,感知机能找到一条直线;

  • 在 KSC 高光谱数据中,感知机能跑通,但效果有限,为后续更强的模型(MLP、SVM、CNN)打下基础。

🔗 下一篇预告

案例②,我们将介绍 多层感知机(MLP)

  • 为什么要加隐藏层?

  • 激活函数如何让网络具备非线性能力?

  • 如何用 PyTorch 构建 MLP,在遥感数据上跑一个真正的神经网络分类器。

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐