通过MATLAB来实现图自编码器,用于高光谱图像特征的提取。
前言
算法输入数据:
- 图节点属性矩阵;
- 邻接矩阵;
- 概率p;
W为自编码器的隐藏表示,即训练参数矩阵,Z为输入数据的重构表示。
算法伪代码:
一、MATLAB相关知识
1.1 创建单位矩阵I N _N N = eye(5,5),主对角线元素为1;
I = eye(5,5)
1.2 计算图的度矩阵D
采用sum函数,可以按行求和也可以按列求和;
- sum(A,1):对矩阵A按照列求和;
- sum(A,2):对矩阵A按照行求和;
N = 5
% A为邻接矩阵
A = [1,2,3,4,5;2,3,4,5,6;3,4,5,6,7;4,5,6,7,8;5,6,7,8,9]
% 将A转化为对称矩阵,即邻接矩阵
I = eye(N,N)
A(I == 1) = 0
D = zeros(N,N)
% D为度矩阵
D(I == 1) = sum(A)
1.3 对称归一化拉普拉斯矩阵 L = I - D − 1 / 2 ^{- 1 / 2} −1/2AD − 1 / 2 ^{- 1 / 2} −1/2
- 点乘(.*):两矩阵对应位置的元素相乘;
- 矩阵乘法(*) : 遵循矩阵运算法则;
- 矩阵乘以一个数值时,两种乘法不区分,效果一样;
1.3 矩阵元素指数运算
% 对矩阵S的每个元素进行指数运算,即相同矩阵的点乘
S^2
1.4 计算矩阵的特征向量和特征值
采用eig()函数计算矩阵的特征向量和特征值;
[x,y] = eig(A)
- x矩阵为特征向量矩阵,每一列为一个特征向量;
- y矩阵主对角线元素为特征值;
采用diag()函数获取对角线元素。
diag(y)
1.5 MATLAB函数定义
定义一个函数,以下是简单的规则:
- 函数代码块以 function关键词开头,后接输出变量和函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以end结束。
函数需要定义在脚本文件(*.m)中运行,不可以在命令窗口中临时创建。
有多个返回值时,默认返回第一个值,若想获取其他值,可以使用 ~过滤不需要的值;
function output = AddFunc(a,b)
output = a + b;
end
二、编写算法
1.图自编码器搭建
使用MATLAB内置的函数搭建一个自编码器。
1.1 matlab 对数据集的默认按列存储,因此数据的存储方式为X∈R d × N ^{d×N} d×N ,其中d为特征向量的长度,x为样本数量;
1.2 可以采用 trainAutoencoder() 函数或者 train_autoencoder() 来搭建自编码器。
- 通过trainAutoencoder()函数来搭建自编码器,通过predict()函数来预测,对于自编码器来说就是重构X;
ae = trainAutoencoder(X);
X_ = predict(ae, X);
% 损失函数
mse_loss = mse(X-X_);
1.3 对于高光谱图像,对数据进行预处理;
load('SalinasA_gt.mat')
load('SalinasA_corrected.mat')
[width,height,band] = size(salinasA_corrected);
X = reshape(salinasA_corrected,width * height ,band);
X_ = X';
plot(X(1,:));
hold on;
plot(X_(:,1));
hold off;
1.4 trainAutoencoder函数相关参数设置
-
第一个参数 X:训练数据;
-
第二个参数 size:隐含层神经元数量;
-
键值对参数
- ”EncoderTransferFunction” :“logsig”,为编码器传递函数;
- “MaxEpochs” : 100,最大训练次数;
- “LossFunction” :“msesparse”,为均方差损失函数 (默认)
- “ShowProgressWindow” : false, 显示训练窗口,默认为显示;
-
输出为一个编码器模型;
参数设置:https://www.mathworks.com/help/deeplearning/ref/trainautoencoder.html
1.5 采用drtoolbox工具箱中的函数train_autoencoder来训练一个简单的自编码器,用于数据降维。drtoolbox是一个用于数据降维的工具箱,包含很多数据降维的方法。
drtoolbox:https://blog.csdn.net/uncle_ll/article/details/60465797
train_autoencoder函数介绍:
[network, mappedX, reconX] = train_autoencoder(X, layers, noise, max_iter)
- X:输入数据,每行为一个样本,每列为一个特征;
- layers:降维后特征数;
- noise:噪声,默认为0;
- mat_iter:迭代次数;
输出参数:
- network:包含降维的权重矩阵和重构的矩阵;
- mappedX:降维后的数据;
- reconX:重构的X;
2.可视化相关参数
2.1 可视化矩阵可以使用 imagesc() 函数;