前面讨论的特征选择是在一定准则下,从n个特征中选出k个来反映原有模式
这种简单删掉某n-k个特征的做法并不十分理想,因为一般来说,原来的n个数据各自在不同程度上反映了识别对象的某些特征,简单地删去某些特征可能会丢失较多的有用信息
如果将原来的特征做正交变换,获得的每个数据都是原来n个数据的线性组合,然后从新的数据中选出少数几个,使其尽可能多地反映各类模式之间的差异,而这些特征间又尽可能相互独立,则比单纯的选择方法更灵活、更有效
K-L变换(Karhunen-Loeve变换)就是一种适用于任意概率密度函数的正交变换
4.3.1 离散的有限K-L展开
一、展开式的推导
设有一连续的随机实函数x(t),T1≤t≤T2,则x(t)可用已知的正交函数集{φj(t), j=1,2,…}的线性组合展开,即:
x(t)=a1φ1(t)+a2φ2(t)+⋯+ajφj(t)+⋯=j=1∑∞ajφj(t), T1≤t≤T2 其中aj为展开式的随即系数,φj(t)为一连续的正交函数,满足:
∫T1T2φn(t)φ~m(t)dt={10m=nm=n 其中,φ~m(t)为φm(t)的共轭复数形式
将上式写成离散的正交函数形式,使得连续随机函数x(t)和连续正交函数φj(t)在区间T1≤t≤T2内被等间隔采样为n个离散点,即:
x(t)→{x(1),x(2),⋯,x(n)}φj(t)→{φj(1),φj(2),⋯,φj(n)} 写成向量形式,则有:
x=(x(1),x(2),⋯,x(n))Tφj=(φj(1),φj(2),⋯,φj(n))T 则可以对公式(1)取n项近似,并写成离散展开形式:
x=j=1∑najφj=φa, T1≤t≤T2 其中,a为展开式中的随即系数的向量形式,φ为一n×n矩阵,即:
a=(a1,a2,…,aj,…,an)Tφ=φ1(1)φ1(2)⋮φ1(n)φ2(1)φ2(2)⋮φ2(n)⋯⋯⋱⋯φn(1)φn(2)⋮φn(n) 可以看出,φ本质上是一个正交变换矩阵,它将x变换成a。
二、K-L展开式的性质
如果对c种模式类别{ωi}i=1,…,c做离散正交展开,则对每一模式可分别写成:xi=φai,其中矩阵φ取决于所选用的正交函数
对各个模式类别,正交函数都是相同的,但其展开系数向量ai则因类别的不同模式分布而异
K-L展开式的根本性质是将随机向量x展开为另一组正交向量φj的线性和,且其展开式系数aj(即系数向量a的各个分量)具有不同的性质。
三、变换矩阵和系数的计算
设随机向量x的总体自相关矩阵为R=E{xxT},由:
x=j=1∑najφj=φa, T1≤t≤T2(2) 将X=φa带入自相关矩阵,可得:
R=E{φaaTφT}=φ(E{aaT})φT 要求系数向量a的各个不同分量应独立,即应使(a1,a2,…,aj,…,an)满足如下关系:
E(ajak)={λj0j=kj=k 写成矩阵形式,应使:E{aaT}=Dλ,其中Dλ为对角形矩阵,其互相关成分均为0,即:
Dλ=λ100000⋱⋯⋯⋯⋯0λj0⋯⋯0⋯⋯⋱0000λn 则自相关矩阵可以写成:
R=φDλφT 由于φ中各个向量都相互归一正交,因此有:
Rφ=φDλφTφ=φDλ 其中,φj向量对应为:
Rφj=λjφj 可以看出,λj是x的自相关矩阵R的特征值,φj是对应的特征向量。因为R是实对称矩阵,其不同特征值对应的特征向量应正交,即:
φjTφk={10j=kj=k 带入式(2),K-L展开式的系数为:
总结而言,计算l K-L展开式系数可以分为以下三步:
求随机向量x的自相关矩阵:R=E{xxT}
求R的特征值和特征向量,得到矩阵φ=(φ1,φ2,…,φn)
求展开式系数:a=φTx
4.3.2 按照K-L展开式选择特征
若从n个特征向量中取出m个组成变换矩阵φ,即:
φ=(φ1 φ2 … φm), m<n 此时,φ是一个n*m维矩阵,x是n维向量,经过φTx变换,即得到降维为m的新向量
推导
问题:选取变换矩阵φ,使得降维后的新向量在最小均方差条件下接近原来的向量x
对于x=j=1∑n,现在仅仅取m项,对略去的系数项用预先选定的常数b代替,此时对x的估计值为:
x^=j=1∑maiφi+j=m+1∑nbφj 则产生的误差为:
Δx=x−x^=j=m+1∑n(aj−b)φj 此时Δx的均方差为:
ε2=E{∥Δx∥}2=j=m+1∑n{E(aj−b)2} 要使得ε2最小,则对b的选择应满足:
∂b∂[E(aj−b)2]=∂b∂[E(aj2−2ajb+b2)]=−2[E(aj)−b]=0 因此,b=E[aj],即对省略掉的a中的分量,应使用它们的数学期望来代替,此时的误差为:
ε2=j=m+1∑nE[(aj−E{aj})2]=j=m+1∑nφjTE[(x−E{x})(x−E{x})T]φj=j=m+1∑nφjTCxφj 其中,Cx为x的协方差矩阵
设λj为Cx的第j个特征值,φj是与λj对应的特征向量,则:
Cxφj=λjφj 由于φj是一个正交阵,因此有:
φjTφj=1 从而
φjTCxφj=λj 因此
ε2=j=m+1∑nφjTCxφj=j=m+1∑nλj 由此可以看出,特征值越小,误差也越小
结论
从K-L展开式的性质和按最小均方差的准则来选择特征,应使E[aj]=0。由于E[a]=E[φTx]=φTE[x],故应使E[x]=0。基于这一条件,在将整体模式进行K-L变换之前,应先将其均值作为新坐标轴的原点,采用协方差矩阵C或自相关矩阵R来计算特征值。如果E[x]=0,则只能得到“次最佳”的结果。
将K-L展开式系数aj(亦即变换后的特征)用yj表示,写成向量形式:y=φTx。此时变换矩阵φ用m个特征向量组成。为使误差最小,不采用的特征向量,其对应的特征值应尽可能小。因此,将特征值按大小次序标号,即
λ1>λ2>⋯>λm>⋯>λn≥0 若首先采用前面的m个特征向量,便可使变换误差最小。此时的变换矩阵为:
φT=φ1Tφ2T⋮φmT K-L变换是在均方误差最小的意义下获得数据压缩(降维)的最佳变换,且不受模式分布的限制。对于一种类别的模式特征提取,它不存在特征分类问题,只是实现用低维的m个特征来表示原来高维的n个特征,使其误差最小,亦即使其整个模式分布结构尽可能保持不变。
通过K-L变换能获得互不相关的新特征。若采用较大特征值对应的特征向量组成变换矩阵,则能对应地保留原模式中方差最大的特征成分,所以K-L变换起到了减小相关性、突出差异性的效果。在此情况下, K-L变换也称为主成分变换(PCA变换)。
需要指出的是,采用K-L变换作为模式分类的特征提取时,要特别注意保留不同类别的模式分类鉴别信息,仅单纯考虑尽可能代表原来模式的主成分,有时并不一定有利于分类的鉴别。
K-L变换的一般步骤
给定N个样本x1,…,xN,利用KL变换将其降至m维的步骤:
计算样本均值:m=E(x)
平移样本:z=x−m
计算z的自相关矩阵:R(z)=i=1∑Np(ωi)E(z zT)=Cx
求协方差矩阵Cx的特征向量,取最大的m个特征值对应的m个特征向量构成变换矩阵Φ
上面的例子中可以看到
绘图代码
import matplotlib.pyplot as plt
import numpy as np
x = [4, 5, 5, 5, 6, -4, -5, -5, -5, -6]
y = [5, 4, 5, 6, 5, -5, -4, -5, -6, -5]
plt.plot([5, -5], [5, -5], color='red', linestyle='--')
plt.arrow(0, 0, 2, 2, head_width=0.2, head_length=0.5, fc='black', ec='black', zorder=2)
plt.arrow(0, 0, 2, -2, head_width=0.2, head_length=0.5, fc='black', ec='black')
plt.plot(x[0:5], y[0:5], 'o', color='white', markeredgecolor='blue')
plt.plot(x[5:10], y[5:10], 'o', color='blue')
plt.annotate('$\\phi_1$', xy=(2, 1.2), xytext=(2, 1.2), fontsize=12)
plt.annotate('$\\phi_2$', xy=(2, -3), xytext=(2, -3), fontsize=12)
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.gca().set_aspect('equal', adjustable='box')
plt.grid(True)
plt.show()