paviaU光譜資料集降維與分類
基於高光譜資料集PaviaU的資料降維與分類
一、專案問題來源
高光譜影象分類是高光譜遙感對地觀測技術的一項重要內容,在軍事及民用領域都有著重要的應用。然而,高光譜影象的高維特性、波段間高度相關性、光譜混合等使高光譜影象分類面臨巨大挑戰。一方面高光譜影象相鄰波段之間相關性較大,存在較高的資訊冗餘。另一方面,對高光譜影象蘊含的豐富的譜資訊直接進行處理所需計算量巨大,高光譜影象中存在異物同譜及同譜異物問題,導致資料結構呈高度非線性,極大增加了分類的難度。在早期的高光譜影象分類技術中,僅利用豐富的光譜資訊,沒有更深入挖掘資料內在資訊,例如距離分類器、K近鄰分類器、最大似然分類器等,這些方法大多會受到Hughes現象的影響,在訓練集有限情況下,分類的精度會隨著資料維度的增大而大幅度下降。
圖1:Hughes 現象
針對這一個問題,研究者們提出一些特徵提取的方法,例如主成分分析、線性判斷分析、獨立成分分析等,將高維資料對映到一個低維空間,同時保留類別資訊。
本篇部落格的目的在於,通過對高光譜資料集paviaU進行降維與分類,學習熟悉資料降維方法PCA、KPCA、LDA與分類方法例如KNN、SVM以及CNN等,並用Matlab實現便於比較分析。同時對高光譜影象分類有一個初步的認識。
二、高光譜資料集選擇
如上圖所示為高光譜影象分類常用資料集,綜合考慮已標記的樣本量、波段數、空間解析度、資料大小等因素,在網上可以下載到相應資源的前提下,選取Pavia University 高光譜資料集作為本次project的實驗物件。
Pavia University 資料是由德國的機載反射光學光譜成像儀(Reflective Optics Spectrographic Imaging System,ROSIS-03)在 2003 年對義大利的帕維亞城所成的像的一部分高光譜資料。該光譜成像儀對 0.43-0.86μm 波長範圍內的 115 個波段連續成像,所成影象的空間解析度為 1.3m。其中 12 個波段由於受噪聲影響被剔除,因此一般使用的是剩下 103 個光譜波段所成的影象。該資料的尺寸為 610×340,因此共包含2207400 個畫素,但是其中包含大量的背景畫素,包含地物的畫素總共只有 42776 個,這些畫素中共包含 9 類地物,包括樹、瀝青道路(Asphalt)、磚塊(Bricks)、牧場(Meadows)等。
圖2:PaviaU資料類地物類別及統計圖 圖3:視覺化圖
圖4:PaviaU場景光譜響應曲線
我在每類樣本選取200個作為訓練集,100個作為測試集,共計1800個訓練樣本與900個測試樣本。
三、資料分類演算法
3.1 K最近鄰分類演算法 KNN
3.1.1 KNN簡介
KNN(K-Nearest Neighbor)演算法即K最鄰近演算法,是實現分類器中比較簡單易懂的一種分類演算法。即人們在觀察事物,對事物進行分類的時候,人們最容易想到的就是誰離那一類最近誰就屬於哪一類,即俗話常說的“近朱者赤,近墨者黑”,人們自然而然地把這種觀察方式延伸到資料分類處理領域。K-NN演算法就是基於歐幾里得距離推斷事物類別的一種實現方法。
3.1.2 KNN Matlab實現
KNN可以按如下步驟利用Matlab實現,其函式程式碼就用六行即可實現。
①計算測試資料與各個訓練資料之間的距離;
②按照距離的遞增關係進行排序;
③選取距離最小的K個點;
④確定前K個點所在類別的出現頻率;
⑤返回前K個點中出現頻率最高的類別作為測試資料的預測分類。
3.1.3關於K值的選取
KNN簡單易懂,其演算法關鍵在於K值的選取,在本次project中,我通過KNN對Pavia原始資料集進行分類,改變K值的大小並觀察KNN分類準確度的變化,發現在K=8時,在測試集上分類準確度最高,為93.56%。
圖5:K值的選取與分類準確度的關係示意圖
k值選擇過小,得到的近鄰數過少,會降低分類精度,同時也會放大噪聲資料的干擾;而如果k值選擇過大,並且待分類樣本屬於訓練集中包含資料數較少的類,那麼在選擇k個近鄰的時候,實際上並不相似的資料亦被包含進來,造成噪聲增加而導致分類效果的降低。如何選取恰當的K值也成為KNN的研究熱點。k值通常是採用交叉檢驗來確定(以k=1為基準)。經驗規則是k一般低於訓練樣本數的平方根。
3.2 SVM支援向量機
3.2.1 SVM簡介
在機器學習中,支援向量機(support vector machine,常簡稱為SVM,又名支援向量網路)是在分類與迴歸分析中分析資料的監督式學習模型與相關的學習演算法。SVM的工作原理是將資料對映到高維特徵空間,這樣即使資料不是線性可分,也可以對該資料點進行分類。
3.2.2 SVM引數設定
由於SVM是二分分類模型,而PaviaU資料集中共有9個類別,所以在libsvm中,採用one- versus-one法進行多分類。其做法是在任意兩類樣本之間設計一個SVM,因此k個類別的樣本就需要設計k(k-1)/2個SVM。當對一個未知樣本進行分類時,最後得票最多的類別即為該未知樣本的類別。Libsvm中的多類分類就是根據這個方法實現的。
在libsvm中,對於分類問題,我們可以選擇C-SVC模型與nu-SVC模型。C-SVC中c的範圍是1到正無窮。nu-SVC中nu的範圍是0到1,代表錯分樣本所佔比例的上界,支援向量所佔比列的下界。核函式有線性核函式、多項式核函式、高斯核函式、sigmoid核函式四種可以選擇,在簡單設定相應的引數後,對比比較利用各種分類模型與核函式對PaviaU資料集進行分類,在測試集上得到的分類結果精確度如下表所示:
分類模型 |
核函式 |
測試集準確度 |
C-SVC模型 |
線性核函式 |
92.5556% |
多項式核函式 |
97.4444% |
|
高斯核函式 |
89.3333% |
|
sigmoid核函式 |
74.1111% |
|
nu-SVC模型 |
線性核函式 |
89.8889% |
多項式核函式 |
82.2222% |
|
高斯核函式 |
85.7778% |
|
sigmoid核函式 |
85.8889% |
SVM引入核函式有兩個方面的原因,一是為了更好的擬合數據,另一個重要的原因是實現資料的線性可分。吳恩達老師在coursera中提到,如果特徵數量與樣本數量差不多,可以選擇LR/線性核;如果特徵數量小,樣本數量正常,則選擇高斯核;如果特徵數量小,樣本數量大,則可以手動新增一些特徵。考慮到上述實驗結果,並且PaviaU資料集中特徵維數為103,每個樣本的訓練集數量為200,所以在接下來實驗中選擇C-SVC模型+多項式核函式的方法,其可以輕鬆達到97.4444%的分類精度。
3.3 卷積神經網路CNN
3.3.1CNN簡介
卷積神經網路是近年發展起來,並引起廣泛重視的一種高效識別方法。一般地,CNN的基本結構包括兩層,其一為特徵提取層,每個神經元的輸入與前一層的區域性接受域相連,並提取該區域性的特徵。一旦該區域性特徵被提取後,它與其它特徵間的位置關係也隨之確定下來;其二是特徵對映層,網路的每個計算層由多個特徵對映組成,每個特徵對映是一個平面,平面上所有神經元的權值相等。
與影象處理中使用的二維卷積不同,在本次PaviaU資料集中所使用的是在光譜維度上的一維卷積,因為PaviaU資料集是以每個畫素點作為一個樣本。所搭建的卷積神經網路主要由卷積層與池化層構成。
3.3.2CNN網路調參過程
由於卷積層與池化層的設定以及各種初始化引數都會對最後的精度產生影響,因此,在這裡記錄調參的過程,使訓練後的CNN卷積神經網路在測試集的精確度儘可能達到最大。主要考慮的引數如下:學習率、訓練集大小、迭代次數、樣本批量、卷積神經網路深度、每一個卷積層神經元個數。初始化引數如下,此時在測試集上獲得的準確度是94.556%
初始化網路結構 (i-6c-3s-12c-6s-o) Batchsize=5 Learningrate=1 Iteration=200 Trainingsize=200 |
輸入層i |
Inputmaps=1 |
卷積層c |
Outputmaps=6 |
|
Kernelsize=5 |
||
池化層s |
Scale=3 |
|
卷積層c |
Outputmaps=12 |
|
Kernelsize=6 |
||
池化層s |
Scale=4 |
|
輸出層o |
Outputmaps=9 |
首先從四個初始化引數進行更改,觀察在測試集上的準確度。
引數 |
初始值 |
更新值 |
引數更新後準確率 |
初始準確率 |
Batchsize |
5 |
8 |
94.444% |
94.556% |
Learningrate |
1 |
1.2 |
94.667% |
|
Iteration |
200 |
500 |
94.778% |
|
Trainingsize |
200 |
500 |
90.044% |
如上表所示,調整學習率、訓練集大小、迭代次數、樣本批量的初始化值對最後準確率的影響並不大,在調整訓練集的大小後,甚至出現測試集準確率急劇變小的跡象,這可能與CNN模型過擬合有關,有待於進一步的研究。而微調學習率與迭代次數可以一定程度上提升準確度,但是效果不太明顯。
於是我們可以改變網路結構,首先改變網路結構,增加捲積層神經元的個數。
網路結構 |
準確率 |
i-6c-3s-12c-6s-o |
94.556% |
i-6c-3s-15c-6s-o |
95.333% |
如圖所示,在增加第二層網路的神經元個數後,準確度有了明顯的提升。
然後可以嘗試,增大網路的深度。
網路結構 |
準確率 |
i-6c-3s-12c-6s-o |
94.556% |
i-6c-3s-8c-3s-12c-3s-o |
92.667% |
i-6c-2s-8c-2s-12c-2s-o |
93.667% |
i-6c-2s-9c-2s-15c-2s-o |
94.556% |
i-8c-2s-12c-2s-16c-2s-o |
95.000% |
如上表所示,首先增加了一層卷積層與池化層,準確度有一定程度下降。然後調整了池化層Scale大小,另外再增加每層網路神經元個數,準確度得到一定 程度的提升。綜上實驗,減小池化層Scale大小並且增加捲積層神經元個數提升測試集準確度效果較好。所以採用i-6c-3s-15c-6s-o的網路結構,其網路層數少,訓練時間較短,並且準確度最高。
四、資料降維方法
4.1 主成分分析PCA
4.1.1 PCA原理簡介
PCA的思想是將n維特徵對映到k維空間上k<n,這k維特徵是全新的正交特徵,是重新構造出來的k維特徵。PCA可以被定義為資料在低維線性空間上的正交投影,這個線性空間被稱為主子空間(principal subspace),使得投影資料的⽅差被最大化,即最大方差理論。等價地,它也可以被定義為使得平均投影代價最⼩的線性投影,即最小誤差理論。平均投影代價是指資料點和它們的投影之間的平均平方距離。
4.1.2PCA matlab實現步驟
①對輸入資料initialize_mat每一個特徵維度求均值,然後在每個特徵維度減去均值得meanmat
②對meanmat'*meanmat求特徵向量與特徵值
③找出最大的特徵值與特徵向量,計算投影矩陣project_mat=meanmat*max_v/sqrt(sigma) (為了使投影矩陣歸一化)
④計算降維後的矩陣 p_d_mat=project_mat'*meanmat
⑤p_d_mat L2歸一化
4.1.3關於降維後特徵數個數的選取
PCA降維後特徵數目保留多少是我們所關心的問題。我利用高光譜資料集PaviaU做了一個測試,利用PCA將103個光譜特徵降維至1~102,然後觀察在測試集上svm分類的準確度。可以發現,當pca降維至15個特徵左右時,訓練集與測試集已經達到較高的準確度。之後幾乎維持不變。所以我們選取pca降維之後的特徵數量為15。
圖6:pca降維後的特徵數與svm分類準確度的關係
4.1.4關於投影矩陣歸一化與p_d_mat L2歸一化
在本次matlab程式設計實現過程中加入了投影矩陣歸一化為單位向量並且對最後輸出矩陣進行了L2歸一化。我們可以比較歸一化與未歸一化兩種情況。進行歸一化後,準確度與降維後特徵數目關係曲線變化抖動較小,變化趨勢更加穩定。
圖7:歸一化結果 圖8:未歸一化的結果
4.2 基於核函式的主成分分析 KPCA
4.2.1 KPCA簡介
PCA是利用特徵的協方差矩陣判斷變數間的方差一致性,尋找出變數之間的最佳的線性組合,來代替特徵,從而達到降維的目的,但從其定義和計算方式中就可以看出,這是一種線性降維的方法,如果特徵之間的關係是非線性的,用線性關係去刻畫他們就會顯得低效,KPCA正是應此而生,KPCA利用核化的思想,將樣本的空間對映到更高維度的空間,再利用這個更高的維度空間進行線性降維。
KPCA可以挖掘到資料集中蘊含的非線性資訊。
4.2.2 KPCA的matlab實現步驟
①利用核函式方程計算矩陣K
②對核矩陣K進行中心化 K_n = K - unit*K - K*unit + unit*K*unit;
③對矩陣K進行特徵值分解,得到矩陣K的特徵值evaltures_1與特徵向量evectors_1
④除以特徵值的根號sqrt(evectors(:,i)))並選取主成分
⑤evecs是單位化後的特徵矩陣,K_n是訓練資料的中心化核矩陣 將訓練資料進行對映 train_kpca=K_n * evecs(:,1:index(1));
說明:核矩陣K進行中心化的目的是為了使核對映後均值為零。在本次實驗中我所採用的核函式是高斯核函式。
4.3線性判斷分析LDA
4.3.1 LDA簡介
LDA是一種監督學習的降維技術,也就是說它的資料集的每個樣本是有類別輸出的。這點和PCA不同。PCA是不考慮樣本類別輸出的無監督降維技術。LDA的思想可以用一句話概括,就是“投影后類內方差最小,類間方差最大”。什麼意思呢? 我們要將資料在低維度上進行投影,投影后希望每一種類別資料的投影點儘可能的接近,而不同類別的資料的類別中心之間的距離儘可能的大。
4.3.2 LDA的matlab實現步驟
①計算類內散度矩陣Sw
②計算類間散度矩陣Sb
③計算矩陣inv(Sw)Sb
④求inv(Sw)Sb矩陣最大的d個特徵值和對應的d個特徵向量(w1,w2,…,wd)
⑤對樣本內每一個樣本特徵xi轉化成新的樣本zi=W*xi
五、降維方法比較分析
5.1 PCA與LDA比較
共同點 |
降維時均使用了矩陣特徵分解的思想 |
|
兩者都假設資料符合高斯分佈 |
||
不同點 |
PCA |
無監督 |
無維數限制 |
||
LDA |
有監督 |
|
最後降維至類別數k-1的維度 |
||
除了用於降維,還可以用於分類 |
另外,LDA選擇分類效能最好的投影方向,而PCA選擇樣本點投影具有最大方差的方向,如下圖所示。
圖9:PCA與LDA比較
5.2 PCA與KPCA比較
KPCA與PCA具有本質上的區別:PCA是基於指標的,而KPCA是基於樣本的。KPCA不僅適合於解決非線性特徵提取問題,而且它還能比PCA提供更多的特徵數目和更多的特徵質量,因為前者可提供的特徵數目與輸入樣本的數目是相等的,而後者的特徵數目僅為輸入樣本的維數。KPCA的優勢是可以最大限度地抽取指標的資訊;但是KPCA抽取指標的實際意義不是很明確,計算也比PCA複雜。
六、實驗測試結果
我在分別實現每一個演算法之後,最後進行了綜合,將三種資料降維方法pca、kpca、lda與三種分類方法svm、knn、cnn編寫在一個程式中,以便於比較分析各自組合的速度與準確率。程式採用matlab命令列選擇資料降維方式與分類方式。具體操作如下圖所示:
圖10:maltab命令列使用示例
得到的測試結果如下表所示:
資料降維方式 |
資料分類方式 |
分類所用時間(s) |
測試集準確度 |
不進行資料降維 |
CNN |
0.127945 |
95.889% |
KNN |
0.742317 |
93.556% |
|
SVM |
0.158921 |
97.444% |
|
LDA |
KNN |
0.187326 |
96.222% |
SVM |
0.034417 |
96.000% |
|
KPCA |
KNN |
1.574710 |
92.778% |
SVM |
0.673148 |
94.889% |
|
PCA |
KNN |
0.183935 |
91.333% |
SVM |
0.077221 |
96.444% |
七、總結
如上表所示,展示了在不同資料降維方式以及分類方法下所需要的時間以及相應測試集的準確度。分類所用時間是統計對900個測試樣本總共所需要的時間。可以發現KNN在三種分類分類方式中,計算時間最長,同時其分類效果也是最差的。通過選取合適的降維方法並設定合適的引數,可以大大加快分類速度,並且保持較高的測試集準確度。在上表所展示的方法中,LDA+SVM擁有最快的分類速度,並且保持著較高的分類準確度。PCA+SVM也有著較為出色的表現。相對而言,卷積神經網路CNN在經過反覆調參之後,其測試集準確度仍不如SVM,分類演算法中SVM在高光譜資料集Paviau分類中有著優秀的表現,而資料降維演算法LDA相比於與PCA與KPCA而言,對Paviau降維效果更好。本文主要通過對Paviau高光譜資料集進行分類學習了pca、kpca、lda三種資料降維方法以及svm、knn、cnn三種資料分類演算法。通過matlab程式設計熟悉瞭解了演算法的實現以及原理。
八、程式碼下載