用python实现支持向量机高光谱图像分类并可视化
时间: 2023-09-11 07:11:11 浏览: 107
matlab方差分析代码-Dimensionality-reduction-and-classification-on-Hyperspectr
支持向量机(SVM)是一种常用的分类算法,它在高光谱图像分类中也有广泛的应用。本文将介绍如何使用Python实现高光谱图像分类,并通过可视化展示分类结果。
首先,我们需要准备数据集。这里以PaviaU数据集为例,该数据集包括103个波段,每个像素点有3个类别。我们可以使用Spectral库来读取数据:
```python
import spectral
# 读取数据
img = spectral.open_image('paviaU.hdr')
data = img.load()
```
接着,我们需要对数据进行预处理,包括去除噪声、降维等。这里我们使用PCA来进行降维:
```python
from sklearn.decomposition import PCA
# 对数据进行降维
data = data.reshape(-1, data.shape[-1])
pca = PCA(n_components=30)
data_pca = pca.fit_transform(data)
```
接着,我们需要将数据集分为训练集和测试集:
```python
from sklearn.model_selection import train_test_split
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data_pca, img.labels, test_size=0.3, random_state=42)
```
然后,我们可以使用SVM来进行分类:
```python
from sklearn.svm import SVC
# 使用SVM进行分类
svm = SVC(kernel='linear')
svm.fit(X_train, y_train)
```
最后,我们可以通过可视化来展示分类结果。这里我们使用Matplotlib库来进行可视化:
```python
import numpy as np
import matplotlib.pyplot as plt
# 将预测结果可视化
pred = svm.predict(X_test)
pred_img = np.zeros_like(img)
pred_img[np.where(pred == 1)] = [255, 0, 0] # 类别1显示为红色
pred_img[np.where(pred == 2)] = [0, 255, 0] # 类别2显示为绿色
pred_img[np.where(pred == 3)] = [0, 0, 255] # 类别3显示为蓝色
plt.figure(figsize=(10, 10))
plt.imshow(spectral.imshow(pred_img, (30, 20, 10)))
plt.axis('off')
plt.show()
```
这样就完成了高光谱图像分类的实现和可视化。完整的代码如下:
```python
import spectral
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
# 读取数据
img = spectral.open_image('paviaU.hdr')
data = img.load()
# 对数据进行降维
data = data.reshape(-1, data.shape[-1])
pca = PCA(n_components=30)
data_pca = pca.fit_transform(data)
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data_pca, img.labels, test_size=0.3, random_state=42)
# 使用SVM进行分类
svm = SVC(kernel='linear')
svm.fit(X_train, y_train)
# 将预测结果可视化
pred = svm.predict(X_test)
pred_img = np.zeros_like(img)
pred_img[np.where(pred == 1)] = [255, 0, 0] # 类别1显示为红色
pred_img[np.where(pred == 2)] = [0, 255, 0] # 类别2显示为绿色
pred_img[np.where(pred == 3)] = [0, 0, 255] # 类别3显示为蓝色
plt.figure(figsize=(10, 10))
plt.imshow(spectral.imshow(pred_img, (30, 20, 10)))
plt.axis('off')
plt.show()
```
阅读全文