模式识别(Pattern Recognition)学习笔记(三十五)-- K-L变换与PCA

K-L变换的理论知识

K-L变换是除了PCA外的另一种常用的特征提取方法,它有很多种形式,最基本的形式跟PCA类似,它跟PCA的不同在于,PCA是一种无监督的特征变换,而K-L变换能够考虑到不同的分类信息,实现有监督的特征提取。

根据随机过程中的KL展开理论,将随机过程描述为无数个正交函数的线性组合,而在模式识别问题中,通常可以将一个样本看成是随机向量的某一次实现结果,所以假设有一d维随机向量x,可以写成一组正交基的线性组合,且它们的模为1:

对上式变形得到:

 
                         (初见K-L变换,通常需要先对样本进行零均值化或平移

假设有用信息就集中在其中的q维上,那么现在我们来尝试用着q维去近似x:

近似前后样本向量的差向量为:

考查上述差向量的均方误差(MSE)为:

其中,变换矩阵是原样本向量x的二阶矩阵(注意,这里还可以是其他矩阵,如协方差矩阵),可以与PCA中比较一下,形式大致相同,但在PCA中使用的变换矩阵是协方差矩阵;

我们的目的是最小化上述MSE,同PCA中的求解方法,得到下面拉格朗日目标函数:

对sigma求导并令其等于零,有:

看到熟悉的面孔了,哈哈,就是的特征值,所以上面要求的均方误差就解开了神秘的面纱:

分析到这里,应该不难看出,简直跟PCA就是一对双胞胎啊,太像了有木有,其实当K-L变换的变换矩阵为协方差矩阵时,K-L变换就变成了PCA。

回到使用q维逼近样本向量x的问题上来,通过上面的分析我们知道了,如果想用q维来表示样本向量并使MSE最小化,合理的做法就是:把变换矩阵的特征值从大到小排列,然后选择前q个特征值对应的特征向量就行,此时截断误差能够保证最小,其中中的前q个正交向量就组成了新的特征空间,而原样本向量x在这个新特征空间上的展开系数yi就组成了新的特征向量,这种变换就叫做K-L变换,对于它的其他不同的形式,主要是基于变换矩阵的具体形式。

可以发现,得到这q个新特征与PCA中的d个主成分是类似的,当对原特征x进行中心化时,K-L变换等价于PCA;

K-L变换的几个重要性质

1.变换后得到的新特征满足零均值:

证明:

设有如下K-L变换:,其中矩阵A是变换核矩阵;

对X的变换结果Y球其均值:

2.K-L变换是一种正交变换;

3.K-L变换的新特征彼此之间不相关;

4.K-L变换的新特征向量的二阶矩阵是对角阵,且对角线元素就是原特征的二阶矩阵的特征值;

证明:

5.K-L变换是信号的最佳压缩表示,用q维新特征表示原样本特征带来的误差在所有q维正交坐标变换中最小;

6.用K-L坐标系来表示原数据,意味着熵最小,即样本的方差信息最大程度的集中在较少的维数上;

K-L变换与PCA的联系与区别

联系:

都属于正交变换;

当对原特征x进行中心化时(即变换矩阵为协方差矩阵),K-L变换等价于PCA;

PCA是离散K-L变换;

都可以实现降维变换;

区别:

K-L变换可以实现有监督的特征提取,但是PCA的变换是一种无监督的;

在含义上,K-L变换较广义,PCA较狭义;

K-L变换可以处理连续和离散情况,而PCA只针对离散情况;

K-L变换的变换矩阵可以是很多种,如二阶矩阵、协方差矩阵(总体散布矩阵)等,或者说自相关矩阵,而PCA的变换矩阵就是协方差矩阵;

但是,在一些地方就认为两者是没什么区别的,因为实际应用中不管是协方差矩阵,还是自相关矩阵,其实只是差了个对样本进行均值的平移,但是在PCA中这种平移并不会影响主成分的方向,所以PCA中也通常会先对样本平移,这样看来自相关矩阵就变成了协方差矩阵。

协方差矩阵:

自相关矩阵:

其中,是共轭转置矩阵,当为实矩阵时,等价于转置矩阵;

协方差矩阵和自相关矩阵的关系:

参考:Wiki

时间: 2024-10-15 01:59:42

模式识别(Pattern Recognition)学习笔记(三十五)-- K-L变换与PCA的相关文章

【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头

摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera0: GameObject; private var Camera1: GameObject; private var Camera2: GameObject; private var Camera: GameObject; function Start() { //获取摄像机对象 Camera =

JAVA学习笔记(三十五)- 随机读写文件 RandomAccessFile

RandomAccessFile类 /* * RandomAccessFile类,随机读写文件 * * 数据分段要有规律,每段大小相等,可以将每段数据设置为较大的值,足以存在每一个段的数据 * */ public class Test04 { public static void main(String[] args) throws IOException { //writeFile(); readFile(); } // 写入数据 public static void writeFile()

PHP学习笔记三十五【Try】

<?php function AddUser($name) { if($name=="张三") { echo "add success"; return true; }else { throw new Exception("添加失败"); } } function updateUser($username) { if($username=="张三") { return true; }else{ throw new Exc

angular学习笔记(三十)-指令(5)-link

这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数:scope,iEle,iAttrs,ctrl,linker scope:指令所在的作用域,这个scope和指令定义的scope是一致的.至于指令的scope,会在讲解scope属性的时候详细解释 iEle:指令元素的jqLite封装.(也就是说iEle可以调用angular封装的简版jq的方法和属

angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令

在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指令(5)-link文章也提到了link函数的第五个参数linker. 这篇文章就来讲解一下transclude()方法(linker()方法),是怎么使用的,另外,它也是compile函数的第三个参数,用法一样. 下面就通过自己写一个简易的模拟ngRepeat的指令cbRepeat,来了解linke

Android学习笔记二十五之ListView多布局实现

Android学习笔记二十五之ListView多布局实现 这一节是介绍ListView这个控件的最后一节,实现一个Item的多布局.像我们经常在用的各种即时通讯工具,QQ.微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,这一节,我们就来实现一个ListView的多种Item. 要实现ListView里面有多种Item,就要重写适配器的两个方法getViewTypeCount()和getItemViewType(int position),第一个方法是

Android学习笔记(十五)——碎片的生命周期(附源码)

碎片的生命周期 点击下载源码 与活动类似,碎片具有自己的生命周期.理解了碎片的生命周期后,我们可以在碎片被销毁时正确地保存其实例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Fragments,在Fragment1.java文件中添加如下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragm

【Unity 3D】学习笔记三十四:游戏元素——常用编辑器组件

常用编辑器组件 unity的特色之一就是编辑器可视化,很多常用的功能都可以在编辑器中完成.常用的编辑器可分为两种:原有组件和拓展组件.原有组件是编辑器原生的一些功能,拓展组件是编辑器智商通过脚本拓展的新功能. 摄像机 摄像机是unity最为核心组件之一,游戏界面中显示的一切内容都得需要摄像机来照射才能显示.摄像机组件的参数如下: clear flags:背景显示内容,默认的是skybox.前提是必须在render settings 中设置天空盒子材质. background:背景显示颜色,如果没

马哥学习笔记三十二——计算机及操作系统原理

缓存方式: 直接映射 N路关联 缓存策略: write through:通写 write back:回写 进程类别: 交互式进程(IO密集型) 批处理进程(CPU密集型) 实时进程(Real-time) CPU: 时间片长,优先级低IO:时间片短,优先级高 Linux优先级:priority 实时优先级: 1-99,数字越小,优先级越低 静态优先级:100-139,数据越小,优先级越高 实时优先级比静态优先级高 nice值:调整静态优先级   -20,19:100,139   0:120 ps