1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MATLAB高光谱图像构建KNN图

MATLAB高光谱图像构建KNN图

时间:2020-08-10 03:19:30

相关推荐

MATLAB高光谱图像构建KNN图

在高光谱图像的特征提取过程中,采用非线性降维的方式对高光谱图像降维的过程中,采用图自编码器来对数据进行降维,需要将利用高光谱图像的结构信息和内容信息,则需要将高光谱图像数据构造为一个图结构,图结构的构建需要通过KNN算法来构建邻接矩阵。

文章目录

前言一、KNN图二、邻接矩阵A的构建1.邻接矩阵A2.高光谱图像构造KNN图三、像素角度来构建图总结参考文献

前言

主要介绍图结构的构建方法。


对于一个M x N x B维度的高光谱图像,构建KNN图可以从像素的角度,也可以从波段的角度来构建,对于整个高光谱图像来说,从像素的角度来构建KNN图的话(每一个像素作为图节点),则邻接矩阵的大小为n * n维度,其中n = M x N。而从波段的角度来构建KNN图的话(每一个波段作为图节点),则邻接矩阵的大小为B x B维度。

一、KNN图

1.1 高光谱波段向量集合,X = { xi_ii​}i=1N_{i = 1}^Ni=1N​ ∈ RN∗B^{N * B}N∗B,即 X为一个像素对应的波段集合,N和B分别为像素数和光谱波段数。

将高光谱图像维度变换为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和光谱波段的结构信息,我们首先将带集转换成一个带图G = (V,E, A),其中光谱带xi_ii​被视为图上的一个节点vi_ii​,E是通过计算每个光谱带的k近邻(kNN)来构造的。其中,邻域矩阵A∈Rb×b_{b×b}b×b​。

1.3 通过计算欧几里得距离得到了邻域关系,用这种方法构造的图称为kNN图

1.4 由于KNN算法是一个监督算法,需要使用到数据的标签信息,通过如下代码加载标签信息,便进行维度变换,通常情况下,标签0对应的像素我们不用来构造KNN图

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

1.5 KNN算法模型的搭建

通过采用MATLAB内置的函数fitcknn函数来构建。fitcknn函数接受的数据为一行一条数据,一列一个特征维度,因此需要主要数据的维度变换。

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

X为训练数据,Y为标签数据;X每一行为一天数据,每条数据有多个特征;Y每一行为一个标签,与X数据对应;输出为一个KNN分类器模型;

构造一个KNN分类器,分为5个类,默认采用欧几里得距离公式;

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

1.6 KNN模型预测分类

采用predict函数,输出参数为分类器模型,测试数据;测试数据为每一行为一条数据。

test = hsi(label ~= 0,:); % 获取测试数据,排除0标签的数据;result = predict(KnnClassifier,test);% 预测,返回值为数据对应的标签

1.7k近邻计算

由于上述KNN算法只能用于分类任务,并没有给出k个近邻,因此我们采用工具箱VLFeat来进行k近邻的计算;k近邻的计算不需要使用标签数据,而KNN分类器需要使用标签数据来分类。

K近邻计算参考及工具箱安装:/john_bian/article/details/79424432

VLF eat下载:/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);% 构建kd树kdtree = vl_kdtreebuild(X);% 计算Q的k个近邻[index, distance] = vl_kdtreequery(kdtree, X, Q, 'NumNeighbors', 5) ;

KNN原理介绍:/pinard/p/6061661.html

二、邻接矩阵A的构建

1.邻接矩阵A

采用如下的公式来构造链接矩阵A,其中Nk_kk​(xi_ii​)为xi_ii​的kNN。

需要保证邻接矩阵是对称矩阵。

2.高光谱图像构造KNN图

基于上述知识,来构造高光谱图像的KNN图,对于高光谱图像,我们把每个像素作为一个样本,B个波段作为特征,让后对每个像素的波段集合,计算其k近邻,让后根据公式构造邻接矩阵;

从像素角度构造邻接矩阵,A ∈ Rn×n^{n×n}n×n,确定,像素数量大,导致邻接矩阵过大。

clcclear%% 获取文件数据load('SalinasA_corrected.mat');load('SalinasA_gt.mat');% 获取数据data = salinasA_corrected;label = salinasA_gt;%% 获取数据维度以及对数据进行维度变换[width,height,band] = size(data);% 维度变换并转置矩阵N = width * height;X = reshape(data,N,band)';% 样本Y = reshape(label,N,1)'; % 标签%% 计算每个样本的k近邻,并构造邻接矩阵% 邻接矩阵,每个像素作为图中一个节点,则邻接矩阵为N * N维度A = zeros(N,N);% 构建Kd树kdtree = vl_kdtreebuild(X);% 计算样本X(:,i)的k个近邻,并构造邻接矩阵Afor i = 1 : N[index, ~] = vl_kdtreequery(kdtree, X, X(:,i), 'NumNeighbors', 6) ;% 排除样本本身index = index(index ~= i);% 构造邻接矩阵A,此处可以体会邻接矩阵为整个高光谱图的邻接矩阵A(i,index) = 1;endif A == A'disp("对称矩阵");else disp("非对称矩阵");end%%

从波段的角度来构造邻接矩阵,邻接矩阵A ∈ Rb×b^{b×b}b×b。

clcclear%% 获取文件数据load('KSC.mat');load('KSC_gt.mat');% 获取数据data = KSC;label = KSC_gt;%% 获取数据维度以及对数据进行维度变换[width,height,band] = size(data);% 维度变换N = width * height;X = reshape(data,N,band);% 样本Y = reshape(label,N,1); % 标签%% 计算每个样本的k近邻,并构造邻接矩阵% 邻接矩阵,每个波段作为图中一个节点,则邻接矩阵为B * B维度A = zeros(band,band);% 构建Kd树kdtree = vl_kdtreebuild(X);% 计算样本X(:,i)的k个近邻,并构造邻接矩阵Afor i = 1 : band[index, ~] = vl_kdtreequery(kdtree, X, X(:,i), 'NumNeighbors', 6) ;% 排除样本本身index = index(index ~= i);% 构造邻接矩阵A,此处可以体会邻接矩阵为整个高光谱图的邻接矩阵A(i,index) = 1;endif A == A'disp("对称矩阵");else disp("非对称矩阵");end%%

三、像素角度来构建图

3.1 像素作为图结构的节点,则G = (V,E,X),V = { vi=1,...,n_{i = 1,...,n}i=1,...,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 需要构造邻接矩阵A,需要知道图结构的边集;

总结

主要介绍高光谱图像利用结构信息和内容信息进行特征提取时,结构信息的构造,在这里主要就是邻接矩阵A的构造,梳理两篇论文中的方法,为自己理清思路,并做些编码记录;

参考文献

KNN 分类器://10/23/5db00bf7d8ffb/

邻接矩阵A相关资料:/pinard/p/6221564.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。