概述
原理介绍
K-L变换是模式识别中常用的一种特征提取方法,出发点是从一组特征中计算出一组按重要性从大到小排列的新特征,它们是原有特征的线性组合,并且相互之间是不相关的。K-L变化能考虑到不同的分类信息,实现监督的特征提取,本文首先讨论从数据的协方差矩阵作为产生矩阵的K-L变换,接下来讨论从类平均向量中提取判别信息的K-L变换。
K-L变换原理
K-L变换的流程基本如下,第一步,首先从维原始数据中建立一个包含分类判别信息的方阵作为K-L变换的产生矩阵,第二步,求解的特征值并从大到小排序得到和这些特征值对应的特征向量,第三步,选择前个特征值对应的特征向量组成了变换矩阵,变换后的特征可以表示为,这样就实现了K-L变换。
可以证明,新的特征所能代表的样本间的差异信息占全部差异信息的比例是。通常,选取新特征的维数可以根据上式的比例来确定。
协方差矩阵作为产生矩阵
当K-L变换的产生矩阵为数据协方差矩阵,这里的为样本的均值,这时无法考虑到分类判别信息。
从类平均向量中提取判别信息
如果要用最少的维数来保持原空间中类平均向量中的信息,则可以在使特征空间互不相关的前提下最优压缩类平均向量中包含的分类信息。算法分为两大步骤:
1、用总类内离散度矩阵做K-L变换,其中为类内离散度矩阵,、分别为第i组数据的先验概率和均值,此次K-L变换可以消除特征间的相关性。写成矩阵形式就是,令,从而使。
这一步称为为白化变化,之后再进行任何正交归一变换类内离散度矩阵都不会再改变。变换后的类间离散度矩阵成为,。
2、用再进行K-L变换,以压缩包含在类均值向量中的信息。对于一个c类问题,的秩最大为c-1,因此这一步最多有d=c-1个非零的特征值,对应的特征向量组成的变换矩阵记为。
考虑到上一步的变换,总的变换矩阵是。
基于K-L变换分类阈值选择
function [ W, Y ] = PCATransform( X, m )
%=======================================================
%function [ W ] = PCATransform( X, m ) PCA变换
%输入参数:X 原始数据(N * l)
%
m 变换后维数
%输出参数:W 变化矩阵 (N * m)
%
Y 变换的矩阵(m * l)
%编程环境:MATLAB R2017a
%Date:2018/11/1
%=======================================================
%=======================================================
% 第一步:计算产生矩阵
% 第二步:特征值和特征向量
% 第三步:返回投影矩阵和变换后的矩阵
%=======================================================
[N, l] = size(X);
E = sum(X, 2) / l;
V = (X - E) * (X - E)' / (l - 1);
% V = cov(X(1, :), X(2, :));
[t, W] = KLTransform(V, 1);
if size(W, 2) > m
W(:, m+1: end) = [];
end
Y = W' * X;
end
function [ W, Y ] = ClassAverageTransform( X, m )
%=====================================================
%function [ W, Y ] = ClassAverageTransform( X, m )
%包含在类平均向量中判别信息的最优压缩
%输入参数:X 原始数据,类型为元胞(c * N * l)
%
m 变换后维数
%输出参数:W 变化矩阵 (N * m)
%
Y 变换的矩阵(m * l)
%编程环境:MATLAB R2017a
%Date:2018/11/1
%=====================================================
%=====================================================
% 第一步:用总类内离散度矩阵做K-L变换
% 第二步:白化变化
% 第三步:用变换后的类间相似度矩阵做K-L变换
% 第四步:特征值和特征向量
% 第五步:返回投影矩阵和变换后的矩阵
%=====================================================
c = length(X);
N = size(X{1}, 1);
Sw = zeros(N, N);
Sb = zeros(N, N);
EE = zeros(N, c);
E = zeros(N, 1);
L = 0;
for i = 1 : c
EE(:, i) = sum(X{i}, 2) / size(X{i}, 2);
Sw = Sw + (X{i} - EE(:, i)) * (X{i} - EE(:, i))' / (size(X{i}, 2) -1) / c;
E = E + sum(X{i}, 2);
L = L + size(X{i}, 2);
end
E = E / L;
for i = 1 : c
Sb = Sb + (EE(:, i) - E) * (EE(:, i) - E)' / c;
end
[l1, U1] = KLTransform(Sw, 1);
B = U1 * sqrt(diag(l1) ^ -1);
Sb1 = B' * Sb * B;
[l2, U2] = KLTransform(Sb1, 1);
W = B * U2;
Y = cell(1, c);
for i = 1 : c
Y{i} = W' * X{i};
end
end
function [l, U] = KLTransform( OriginX, e )
%========================================================
% function [U, l] = KLTransform( OriginX ):K-L变换
% 输入参数:OriginX
进行K-L变化的矩阵,要为方阵
%
e
变换后特征值占据的比例
% 输出参数:l
特征值向量
%
U
特征值向量对应的特征矩阵
% 编程环境 MATLAB R2017a
% Date:2018/11/1
%========================================================
[UU, ll] = eig(OriginX);
ll = diag(ll)';
for i = 1 : length(ll)
for j = i+1 : length(ll)
if ll(i) < ll(j)
temp = ll(i);
ll(i) = ll(j);
ll(j) = temp;
temp = UU(:, i);
UU(:, i) = UU(:, j);
UU(:, j) = temp;
end
end
end
for i = 1 : length(ll)
if ~ (sum(ll(1: i)) / sum(ll) < e)
l = ll(1: i);
U = UU(:, 1: i);
break;
end
end
l = ll;
U = UU;
end
最后
以上就是包容睫毛为你收集整理的利用K-L变换进行特征提取原理介绍的全部内容,希望文章能够帮你解决利用K-L变换进行特征提取原理介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复