4.3 离散K-L变换

  • 前面讨论的特征选择是在一定准则下,从n个特征中选出k个来反映原有模式

  • 这种简单删掉某n-k个特征的做法并不十分理想,因为一般来说,原来的n个数据各自在不同程度上反映了识别对象的某些特征,简单地删去某些特征可能会丢失较多的有用信息

  • 如果将原来的特征做正交变换,获得的每个数据都是原来n个数据的线性组合,然后从新的数据中选出少数几个,使其尽可能多地反映各类模式之间的差异,而这些特征间又尽可能相互独立,则比单纯的选择方法更灵活、更有效

K-L变换(Karhunen-Loeve变换)就是一种适用于任意概率密度函数的正交变换

4.3.1 离散的有限K-L展开

一、展开式的推导

写成向量形式,则有:

二、K-L展开式的性质

三、变换矩阵和系数的计算

则自相关矩阵可以写成:

总结而言,计算l K-L展开式系数可以分为以下三步:

4.3.2 按照K-L展开式选择特征

  • K-L展开式用于特征选择相当于一种线性变换

推导

则产生的误差为:

从而

因此

由此可以看出,特征值越小,误差也越小

结论

若首先采用前面的m个特征向量,便可使变换误差最小。此时的变换矩阵为:

K-L变换是在均方误差最小的意义下获得数据压缩(降维)的最佳变换,且不受模式分布的限制。对于一种类别的模式特征提取,它不存在特征分类问题,只是实现用低维的m个特征来表示原来高维的n个特征,使其误差最小,亦即使其整个模式分布结构尽可能保持不变。

通过K-L变换能获得互不相关的新特征。若采用较大特征值对应的特征向量组成变换矩阵,则能对应地保留原模式中方差最大的特征成分,所以K-L变换起到了减小相关性、突出差异性的效果。在此情况下, K-L变换也称为主成分变换PCA变换

需要指出的是,采用K-L变换作为模式分类的特征提取时,要特别注意保留不同类别的模式分类鉴别信息,仅单纯考虑尽可能代表原来模式的主成分,有时并不一定有利于分类的鉴别。

K-L变换的一般步骤

给定两类模式,其分布如图所示,试用K-L变换实现一维的特征提取(假定两类模式出现的概率相等)

这符合K-L变换进行特征压缩的最佳条件。

上面的例子中可以看到

绘图代码

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()

最后更新于