天天看點

基于支援向量機的幾種資料預處理的高光譜資料集分類分析

首先在這裡就不介紹支援向量機和高光譜圖像資料集了,本文将着重用實驗代碼結果來分析資料集的預處理部分和支援向量機的核函數選擇。

這裡的資料預處理有三種,分别是PCA;LDA;PCA+LDA。支援向量機的核函數也是選擇了三種,分别是線性核函數;多項式核函數;高斯核函數。

這裡先将.mat的資料轉化為python後續算法處理的csv檔案。

import matplotlib.pyplot as plt  

import numpy as np

from scipy.io import loadmat

import spectral

from sklearn import preprocessing  

import scipy.io as sio

input_image=sio.loadmat(r'F:\Python+AI_ML_DL全套\高光譜資料集\資料集\Salinas.mat')['salinas']

output_image=sio.loadmat(r'F:\Python+AI_ML_DL全套\高光譜資料集\資料集\Salinas_gt.mat')['salinas_gt']

# 除掉 0 這個非分類的類,把所有需要分類的元素提取出來

need_label = np.zeros([output_image.shape[0],output_image.shape[1]])

for i in range(output_image.shape[0]):

    for j in range(output_image.shape[1]):

        if output_image[i][j] != 0:

        #if output_image[i][j] in [1,2,3,4,5,6,7,8,9]:

            need_label[i][j] = output_image[i][j]

new_datawithlabel_list = []

for i in range(output_image.shape[0]):

    for j in range(output_image.shape[1]):

        if need_label[i][j] != 0:

            c2l = list(input_image[i][j])

            c2l.append(need_label[i][j])

            new_datawithlabel_list.append(c2l)

new_datawithlabel_array = np.array(new_datawithlabel_list)  # new_datawithlabel_array.shape (5211,177),包含了資料次元和标簽次元,資料176次元,也就是176個波段,最後177列是标簽維

data_D = preprocessing.StandardScaler().fit_transform(new_datawithlabel_array[:,:-1])

#data_D = preprocessing.MinMaxScaler().fit_transform(new_datawithlabel_array[:,:-1])

data_L = new_datawithlabel_array[:,-1]

# 将結果存檔後續處理

import pandas as pd

new = np.column_stack((data_D,data_L))

new_ = pd.DataFrame(new)

new_.to_csv(r'C:\Users\KingWH\Desktop\exp_data/salinas.csv',header=False,index=False)

生成csv檔案後,就可以直接對該檔案進行操作。

下面是訓練svm分類模型,這裡具體PCA(18)-LDA(10)-GS-SVM,讀者可以自行修改降維方式和維數,同時也可以修改網格搜素法的參數,直到找到最佳參數。

import joblib

from sklearn.model_selection import KFold

from sklearn.model_selection import train_test_split

import numpy as np

from sklearn.svm import SVC

from sklearn import metrics

from sklearn import preprocessing

from sklearn.decomposition import RandomizedPCA

import pandas as pd

from sklearn.grid_search import GridSearchCV

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

from time import time

# 導入資料集切割訓練與測試資料

data = pd.read_csv(r'C:\\Users\KingWH\Desktop\exp_data\paviaU.csv',header=None)

data = data.as_matrix()

data_D = data[:,:-1]

data_L = data[:,-1]

data_train, data_test, label_train, label_test = train_test_split(data_D,data_L,test_size=0.5)

# 模型訓練與拟合linear  rbf  poly

# clf_sig = SVC(kernel='sigmoid',gamma=0.125,C=16) 

t0 = time()

pca = RandomizedPCA(n_components = 18, whiten=True).fit(data_D)

X_train_pca = pca.transform(data_train) 

X_test_pca = pca.transform(data_test)

# # 

# # # 

lda = LinearDiscriminantAnalysis(n_components = 10).fit(X_train_pca,label_train)

X_train_ida = lda.transform(X_train_pca)

X_test_ida = lda.transform(X_test_pca)

print('ok')

# param_grid = {'C': [1e3, 5e3, 1e4, 5e4, 1e5],

#               'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1], }

# clf = GridSearchCV(SVC(kernel='rbf', class_weight='balanced'), param_grid)

# param_grid = {'C': [10, 20, 100, 500, 1e3],

#               'gamma': [0.001, 0.005, 0.01, 0.05, 0.1, 0.125], }

# clf = GridSearchCV(SVC(kernel='linear', class_weight='balanced'), param_grid)

clf = SVC(kernel = 'rbf',gamma=0.1,C=100)   # paviau:18-10 rbf 0.1  100  linear 0.125  20  poly 0.1 100  indian:80-40rbf 0.01 100  linear 0.1  20  poly 0.1 100 

clf.fit(X_train_ida,label_train)            #salinas:70-14 rbf 0.1  20    linear 0.125  10  poly 0.1 100

# clf.fit(data_train,label_train)

pred = clf.predict(X_test_ida)

accuracy = metrics.accuracy_score(label_test, pred)*100

print( accuracy)  

# print(clf.best_estimator_)

print("done in %0.3fs" % (time() - t0)) 

# 存儲結果學習模型,友善之後的調用

joblib.dump(clf, "paviaU_MODEL.m")

模型建好之後,就可以調用對高光譜圖像進行分類了,同樣要保持測試集的降維方式和降維數和訓練集一緻,下面貼出我自己的分類結果。

基于支援向量機的幾種資料預處理的高光譜資料集分類分析
基于支援向量機的幾種資料預處理的高光譜資料集分類分析
基于支援向量機的幾種資料預處理的高光譜資料集分類分析
基于支援向量機的幾種資料預處理的高光譜資料集分類分析
基于支援向量機的幾種資料預處理的高光譜資料集分類分析

我這裡隻給出了一個資料集的結果,大家可以看出PCA-LDA-RSVM效果是最好的,也可以通過實作混合核函數來提高分類精度。