遥感&深度学习入门实战教程|案例①:感知机原理与实现
本文总结了《Sklearn入门实战教程》系列内容,介绍了传统机器学习在遥感领域的完整应用流程,包括预处理、分类器、特征选择等环节。随着数据复杂度提升,传统方法面临高维非线性特征、空间关系建模等挑战,引出了深度学习技术的优势。通过两个案例展示了感知机原理及实现:在二维线性可分数据上成功分类,但在真实KSC高光谱数据中表现有限,为后续多层感知机(MLP)等更复杂模型奠定基础。文章预告将介绍如何通过隐藏
在过去的二十篇《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,在遥感数据上跑一个真正的神经网络分类器。
欢迎大家关注下方公众号获取更多内容!!
更多推荐
所有评论(0)