12月学习进度12/31——特征提取离散KL变换原理实例以及matlab实现(转载)
Posted fu_GAGA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12月学习进度12/31——特征提取离散KL变换原理实例以及matlab实现(转载)相关的知识,希望对你有一定的参考价值。
从n维特征中选取m维特征,如何在信息损失最小的情况下选取特征(因为必然会删去n-m维特征),使得剩下的特征更加有利于分类,离散K-L变换(Karhunen-Loeve变换)就是常用的方法。
引入
设一个输入向量 x x x 。K-L变换的目的就是对原向量进行变换,组成新向量 y y y。该新向量的特征数比 x x x 少,各特征间不相关,因此关键就是要找到这样的变换矩阵。
优缺点
优点:
- 变换在均方误差最小的情况下使新样本集逼近原样本集分布,既压缩了维数又保留了类别鉴别信息。
- 变换后新模式向量各分量相对总体均值的方差等于原样本集总体自相关矩阵的较大的特征值,表明变换突出了模式类之间的差异性。
- 变换后样本各分量互不相关,即消除了原先特征之间的相关性。
缺点:
- 类别越多,效果越差。
- 需要通过足够多的样本估计样本集的协方差矩阵和其它类型的散布矩阵。样本数不足时,矩阵的估计会十分粗糙。
K-L变换推导过程
为了找到满足条件的变换矩阵
U
U
U ,令:
y
=
U
T
x
y=U^Tx
y=UTx
因为新向量
y
y
y各分量之间是相互独立的,因此有:
E
(
y
i
y
j
)
=
0
,
i
≠
j
E(y_iy_j)=0,i≠j
E(yiyj)=0,i=j
又从自相关矩阵的定义,有:
R y = E ( y y T ) = E ( U T x x T U ) = U T R x U R_y=E(yy^T)=E(U^Txx^TU)=U^TR_xU Ry=E(yyT)=E(UTxxTU)=UTRxU
而
R
x
R_x
Rx 是对称矩阵,因此它的特征向量是相互正交的。如果将
U
U
U 的列向量取为
R
x
R_x
Rx 的特征向量,这时
R
y
R_y
Ry 可以转化为对角矩阵:
R
y
=
U
T
R
x
U
=
∧
R_y=U^TR_xU=∧
Ry=UTRxU=∧
其中
∧
∧
∧ 是对角矩阵,对角线元素是
R
x
R_x
Rx 的特征值
λ
i
,
i
=
1
,
2
,
.
.
.
,
n
λ_i,i=1,2,...,n
λi,i=1,2,...,n
由此可以确定变换矩阵
A
A
A ,它的列向量就是特征向量,这些特征向量之间是相互正交的。
利用变换矩阵
A
A
A 对原输入向量x进行变换,获得新向量
y
y
y 的过程就是K-L变换。
具体步骤
设
X
X
X 是
n
n
n 维模式向量,
X
X
X 是来自
M
M
M 个模式类的样本集,总样本数目为
N
N
N 。利用K-L变换将
X
X
X 变换为d维:
#step1:求样本集 X的自相关矩阵
R
R
R。
R
=
E
[
X
X
T
]
≈
1
N
∑
j
=
1
N
X
j
X
j
T
R=E[XX^T]≈\\frac1N∑_j=\\frac1NX_jX^T_j
R=E[XXT]≈N1j∑=N1XjXjT
#step2:求
R
R
R 的特征值
λ
j
,
j
=
1
,
2
,
.
.
.
,
n
λ_j,j=1,2,...,n
λj,j=1,2,...,n。选取前
d
d
d 个较大的特征值。
#step3:计算
d
d
d 个特征值对应的特征向量
u
j
,
j
=
1
,
2
,
.
.
.
,
d
u_j,j=1,2,...,d
uj,j=1,2,...,d,归一化后构成变换矩阵
U
U
U 。
U
=
[
u
1
,
u
2
,
.
.
.
,
u
j
]
U=[u_1,u_2,...,u_j]
U=[u1,u2,...,uj]
#step4:对
X
X
X 中 每一个
X
X
X 进行K-L变换,得到变换后向量
X
∗
X^*
X∗:
X
∗
=
U
T
X
X^*=U^TX
X∗=UTX
d维向量 X ∗ X^* X∗ 就是替代n维向量X进行分类的模式向量。
例子
直接从百度文库https://wenku.baidu.com/view/0cb176f4eefdc8d377ee3250.html截的图:
MATLAB实现
实现K-L变换的核心就是求解变换矩阵,最简单的方法就是调用pcacov函数(当K-L变换矩阵为协方差矩阵时,等同于PCA),这里就不再细说了,如果要自己实现的话我这里有一个版本:
clc;
dim = 3; %变换后维数
v = randn(8,5); %样本
label=[1 1 2 2 3 3 4 4]; %每个样本对应的类别
[y,x]=size(v);
LabelRange=max(label)-min(label)+1;%样本种类
LabelCount=zeros(1,LabelRange);%每种样本个数
LabelP=zeros(1,LabelRange);%概率
for i=1:y %计算样本种类数
LabelCount(label(i))=LabelCount(label(i))+1;
end
for j=1:LabelRange %计算概率
LabelP(j)=LabelCount(j)/y;
end
s = zeros(1,x);
m = zeros(1,x);
for i=1:LabelRange
for j=1:LabelCount(label(i))
s = s + v((i-1)*LabelCount(label(i))+j,:);
end
m = m+1/LabelCount(label(i))*s;
end
for i=1:y
v(i,:) = v(i,:) - m;
end
r = zeros(x,x);
t1 = zeros(x,x);
% t2 = zeros(x,x);
for i=1:LabelRange
for j=1:LabelCount(label(i))
t1 = v((i-1)*LabelCount(label(i))+j,:)'*v((i-1)*LabelCount(label(i))+j,:);
end
r = r+1/LabelCount(label(i))*t1*LabelP(i);
end
%求特征向量
[vv,d]=eig(r) %求矩阵r的全部特征值,构成对角阵d,并求r的特征向量构成vv的列向量。
dia = d;
index = zeros(1,dim);
for i=1:dim
[x1 y1]=find(dia==max(max(dia)));
index(1,i) = x1;
dia(x1,y1) = -inf;
end
Q = zeros(x,dim);
for i=1:3 %计算变换矩阵Q
Q(:,i) = 1模式识别(Pattern Recognition)学习笔记(三十五)-- K-L变换与PCA