日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MATLAB高光谱图像构建KNN图

發(fā)布時間:2024/7/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MATLAB高光谱图像构建KNN图 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在高光譜圖像的特征提取過程中,采用非線性降維的方式對高光譜圖像降維的過程中,采用圖自編碼器來對數(shù)據(jù)進(jìn)行降維,需要將利用高光譜圖像的結(jié)構(gòu)信息和內(nèi)容信息,則需要將高光譜圖像數(shù)據(jù)構(gòu)造為一個圖結(jié)構(gòu),圖結(jié)構(gòu)的構(gòu)建需要通過KNN算法來構(gòu)建鄰接矩陣。

文章目錄

  • 前言
  • 一、KNN圖
  • 二、鄰接矩陣A的構(gòu)建
    • 1.鄰接矩陣A
    • 2.高光譜圖像構(gòu)造KNN圖
  • 三、像素角度來構(gòu)建圖
  • 總結(jié)
  • 參考文獻(xiàn)


前言

主要介紹圖結(jié)構(gòu)的構(gòu)建方法。


對于一個M x N x B維度的高光譜圖像,構(gòu)建KNN圖可以從像素的角度,也可以從波段的角度來構(gòu)建,對于整個高光譜圖像來說,從像素的角度來構(gòu)建KNN圖的話(每一個像素作為圖節(jié)點(diǎn)),則鄰接矩陣的大小為n * n維度,其中n = M x N。而從波段的角度來構(gòu)建KNN圖的話(每一個波段作為圖節(jié)點(diǎn)),則鄰接矩陣的大小為B x B維度。

一、KNN圖

1.1 高光譜波段向量集合,X = { xi_ii?}i=1N_{i = 1}^Ni=1N? ∈ RN?B^{N * B}N?B,即 X為一個像素對應(yīng)的波段集合,N和B分別為像素數(shù)和光譜波段數(shù)。

將高光譜圖像維度變換為RN?B^{N * B}N?B形式,通過如下代碼。

load('SalinasA_corrected.mat') data = salinasA_corrected; [width,height,band] = size(data); hsi = reshape(data,width * height,band);

1.2 同時考慮光譜特征X和光譜波段的結(jié)構(gòu)信息,我們首先將帶集轉(zhuǎn)換成一個帶圖G = (V,E, A),其中光譜帶xi_ii?被視為圖上的一個節(jié)點(diǎn)vi_ii?,E是通過計算每個光譜帶的k近鄰(kNN)來構(gòu)造的。其中,鄰域矩陣A∈Rb×b_{b×b}b×b?。

1.3 通過計算歐幾里得距離得到了鄰域關(guān)系,用這種方法構(gòu)造的圖稱為kNN圖。
1.4 由于KNN算法是一個監(jiān)督算法,需要使用到數(shù)據(jù)的標(biāo)簽信息,通過如下代碼加載標(biāo)簽信息,便進(jìn)行維度變換,通常情況下,標(biāo)簽0對應(yīng)的像素我們不用來構(gòu)造KNN圖。

load('SalinasA_gt.mat') label = reshape(salinasA_gt,width * height,1);

1.5 KNN算法模型的搭建

  • 通過采用MATLAB內(nèi)置的函數(shù)fitcknn函數(shù)來構(gòu)建。fitcknn函數(shù)接受的數(shù)據(jù)為一行一條數(shù)據(jù),一列一個特征維度,因此需要主要數(shù)據(jù)的維度變換。

kNNClassifier = fitcknn(X, Y, ‘NumNeighbors’, 1)

  • X為訓(xùn)練數(shù)據(jù),Y為標(biāo)簽數(shù)據(jù);
  • X每一行為一天數(shù)據(jù),每條數(shù)據(jù)有多個特征;
  • Y每一行為一個標(biāo)簽,與X數(shù)據(jù)對應(yīng);
  • 輸出為一個KNN分類器模型;

構(gòu)造一個KNN分類器,分為5個類,默認(rèn)采用歐幾里得距離公式;

KnnClassifier = fitcknn(hsi,label,'NumNeighbors', 5);

1.6 KNN模型預(yù)測分類
采用predict函數(shù),輸出參數(shù)為分類器模型,測試數(shù)據(jù);測試數(shù)據(jù)為每一行為一條數(shù)據(jù)。

test = hsi(label ~= 0,:); % 獲取測試數(shù)據(jù),排除0標(biāo)簽的數(shù)據(jù); result = predict(KnnClassifier,test);% 預(yù)測,返回值為數(shù)據(jù)對應(yīng)的標(biāo)簽

1.7 k近鄰計算

  • 由于上述KNN算法只能用于分類任務(wù),并沒有給出k個近鄰,因此我們采用工具箱VLFeat來進(jìn)行k近鄰的計算;k近鄰的計算不需要使用標(biāo)簽數(shù)據(jù),而KNN分類器需要使用標(biāo)簽數(shù)據(jù)來分類。
    K近鄰計算參考及工具箱安裝:https://blog.csdn.net/john_bian/article/details/79424432
    VLF eat下載:https://www.vlfeat.org/index.html
load('SalinasA_gt.mat'); load('SalinasA_corrected.mat'); [width,height,band] = size(salinasA_corrected); data = reshape(salinasA_corrected,width * height,band); X = data'; Q = X(:,1); % 構(gòu)建kd樹 kdtree = vl_kdtreebuild(X); % 計算Q的k個近鄰 [index, distance] = vl_kdtreequery(kdtree, X, Q, 'NumNeighbors', 5) ;

KNN原理介紹:https://www.cnblogs.com/pinard/p/6061661.html

二、鄰接矩陣A的構(gòu)建

1.鄰接矩陣A

采用如下的公式來構(gòu)造鏈接矩陣A,其中Nk_kk?(xi_ii?)為xi_ii?的kNN。


需要保證鄰接矩陣是對稱矩陣。

2.高光譜圖像構(gòu)造KNN圖

基于上述知識,來構(gòu)造高光譜圖像的KNN圖,對于高光譜圖像,我們把每個像素作為一個樣本,B個波段作為特征,讓后對每個像素的波段集合,計算其k近鄰,讓后根據(jù)公式構(gòu)造鄰接矩陣;

  • 從像素角度構(gòu)造鄰接矩陣,A ∈ Rn×n^{n×n}n×n,確定,像素數(shù)量大,導(dǎo)致鄰接矩陣過大。
clc clear %% 獲取文件數(shù)據(jù) load('SalinasA_corrected.mat'); load('SalinasA_gt.mat'); % 獲取數(shù)據(jù) data = salinasA_corrected; label = salinasA_gt;%% 獲取數(shù)據(jù)維度以及對數(shù)據(jù)進(jìn)行維度變換 [width,height,band] = size(data); % 維度變換并轉(zhuǎn)置矩陣 N = width * height; X = reshape(data,N,band)';% 樣本 Y = reshape(label,N,1)'; % 標(biāo)簽%% 計算每個樣本的k近鄰,并構(gòu)造鄰接矩陣 % 鄰接矩陣,每個像素作為圖中一個節(jié)點(diǎn),則鄰接矩陣為N * N維度 A = zeros(N,N); % 構(gòu)建Kd樹 kdtree = vl_kdtreebuild(X); % 計算樣本X(:,i)的k個近鄰,并構(gòu)造鄰接矩陣A for i = 1 : N[index, ~] = vl_kdtreequery(kdtree, X, X(:,i), 'NumNeighbors', 6) ;% 排除樣本本身index = index(index ~= i);% 構(gòu)造鄰接矩陣A,此處可以體會鄰接矩陣為整個高光譜圖的鄰接矩陣A(i,index) = 1; end if A == A'disp("對稱矩陣"); else disp("非對稱矩陣"); end %%
  • 從波段的角度來構(gòu)造鄰接矩陣,鄰接矩陣A ∈ Rb×b^{b×b}b×b。
clc clear %% 獲取文件數(shù)據(jù) load('KSC.mat'); load('KSC_gt.mat'); % 獲取數(shù)據(jù) data = KSC; label = KSC_gt;%% 獲取數(shù)據(jù)維度以及對數(shù)據(jù)進(jìn)行維度變換 [width,height,band] = size(data); % 維度變換 N = width * height; X = reshape(data,N,band);% 樣本 Y = reshape(label,N,1); % 標(biāo)簽%% 計算每個樣本的k近鄰,并構(gòu)造鄰接矩陣 % 鄰接矩陣,每個波段作為圖中一個節(jié)點(diǎn),則鄰接矩陣為B * B維度 A = zeros(band,band); % 構(gòu)建Kd樹 kdtree = vl_kdtreebuild(X); % 計算樣本X(:,i)的k個近鄰,并構(gòu)造鄰接矩陣A for i = 1 : band[index, ~] = vl_kdtreequery(kdtree, X, X(:,i), 'NumNeighbors', 6) ;% 排除樣本本身index = index(index ~= i);% 構(gòu)造鄰接矩陣A,此處可以體會鄰接矩陣為整個高光譜圖的鄰接矩陣A(i,index) = 1; end if A == A'disp("對稱矩陣"); else disp("非對稱矩陣"); end %%

三、像素角度來構(gòu)建圖

3.1 像素作為圖結(jié)構(gòu)的節(jié)點(diǎn),則G = (V,E,X),V = { vi=1,...,n_{i = 1,...,n}i=1,...,n?}是頂點(diǎn)集合,E = { eij_{ij}ij?}是邊集合,X = { xi_ii?;…;xn_nn?}是屬性值。

  • X ∈ Rn×d^{n×d}n×d
  • 鄰接矩陣 A∈Rn×n^{n×n}n×n,如果eij_{ij}ij? ∈E,則Aij_{ij}ij? = 1,否則為0;

3.2 需要構(gòu)造鄰接矩陣A,需要知道圖結(jié)構(gòu)的邊集;

總結(jié)

主要介紹高光譜圖像利用結(jié)構(gòu)信息和內(nèi)容信息進(jìn)行特征提取時,結(jié)構(gòu)信息的構(gòu)造,在這里主要就是鄰接矩陣A的構(gòu)造,梳理兩篇論文中的方法,為自己理清思路,并做些編碼記錄;

參考文獻(xiàn)

KNN 分類器:https://www.dazhuanlan.com/2019/10/23/5db00bf7d8ffb/
鄰接矩陣A相關(guān)資料:https://www.cnblogs.com/pinard/p/6221564.html

總結(jié)

以上是生活随笔為你收集整理的MATLAB高光谱图像构建KNN图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。