解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程~

本文主要是介绍解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程~,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天突然心血来潮,想重新推导一下KPCA的公式,期间遇到了几个小问题,上博客查阅,发现目前并没有一个专注于KPCA公式推导的文章,于是决定写一篇这样的博客(转载请注明:http://blog.csdn.NET/wsj998689aa/article/details/40398777)。


1. 理论部分

KPCA的公式推导和PCA十分相似,只是存在两点创新:

1. 为了更好地处理非线性数据,引入非线性映射函数,将原空间中的数据映射到高维空间,注意,这个是隐性的,我们不知道,也不需要知道它的具体形式是啥。

2. 引入了一个定理:空间中的任一向量(哪怕是基向量),都可以由该空间中的所有样本线性表示,这点对KPCA很重要,我想大概当时那个大牛想出KPCA的时候,这点就是它最大的灵感吧。话说这和”稀疏“的思想比较像。

假设中心化后的样本集合X(d*N,N个样本,维数d维,样本”按列排列“),现将X映射到高维空间,得到,假设在这个高维空间中,本来在原空间中线性不可分的样本现在线性可分了,然后呢?想啥呢!果断上PCA啊!~

于是乎!假设D(D >> d)维向量为高维空间中的特征向量,为对应的特征值,高维空间中的PCA如下:

     (1)   

和PCA太像了吧?这个时候,在利用刚才的定理,将特征向量利用样本集合线性表示,如下:

 (2)  

然后,在把代入上上公式,得到如下的形式:

 (3)  

进一步,等式两边同时左乘,得到如下公式:

 (4)  


你可能会问,这个有啥用?

这样做的目的是,构造两个出来,进一步用核矩阵K(为对称矩阵)替代,其中:

  5)  

第二个等号,是源于核函数的性质,核函数比较多,有如下几种:


于是,公式进一步变为如下形式:

  (6)  

两边同时去除K,得到了PCA相似度极高的求解公式:

(7)

求解公式的含义就是求K最大的几个特征值所对应的特征向量,由于K为对称矩阵,所得的解向量彼此之间肯定是正交的。

但是,请注意,这里的只是K的特征向量,但是其不是高维空间中的特征向量,回看公式(2),高维空间中的特征向量w应该是由进一步求出。

这时有的朋友可能会问,这个时候,如果给定一个测试样本,应该如何降维,如何测试?

是这样的,既然我们可以得到高维空间的一组基,这组基可以构成高维空间的一个子空间,我们的目的就是得到测试样本在这个子空间中的线性表示,也就是降维之后的向量。具体如下:

(8)

于是呼~就可以对降维了,然后就做你想要做的事情。。。。


2. 实验部分

做了一些仿真实验,分别比较了PCA与KPCA之间的效果,KPCA基于不同核函数的效果,二者对于原始数据的要求,以及效果随着参数变化的规律。

1)下面展示的是“无重叠的”非线性可分数据下,PCA与KPCA(基于高斯核)的区别,注意,原始数据是二维数据,投影之后也是二维数据

2)下面展示的是“部分重叠的”非线性可分数据下,PCA与KPCA的区别


3)下面展示的是“无高斯扰动的”非线性可分数据下,PCA与KPCA的区别


4)下面展示的是上述三类数据下,基于多项式核函数的KPCA效果


5)下面展示的是在“部分重叠的”非线性可分数据下,基于多项式核函数的KPCA在不同多项式参数下的效果图




3. 实验结论

1. 从2.1中我们可以看出,PCA与KPCA对于非线性数据各自的处理能力,仔细观察PCA其实只对原始数据进行了旋转操作,这是由于其寻找的是数据的“主要分布方向”。KPCA可以将原始数据投影至线性可分情况,其原因就是第一部分所说的内容。

2. 至于为何将数据分为“无重叠”,“部分重叠”,“无高斯扰动”,是自己在试验中发现,对于部分重叠的数据,KPCA不能将数据投影至完全线性可分的程度(2.3第三幅图中,不同类别数据仍旧存在重叠现象),这说明KPCA只是个无监督的降维算法,它不管样本的类别属性,只是降维而已。

3. 这里提供了高斯核与多项式核的效果,我们很容易发现,二者的效果有很大不同,这直观地说明不同核函数具有不同的特质。并且,针对于无高斯扰动数据,始终没有找到参数p,有可能针对这类数据,多项式核函数无能为力。

4. 2.5中展示了多项式核的参数影响,我们可以发现,往往p值是偶数时,数据可以做到近似线性可分,p是奇数时,数据分布的形态也属于另外一种固定模式,但是不再是线性可分。

4. 代码

前面给出了自己对KPCA的理论解释,以及做的一些基础实验,不给出实现代码,就不厚道了,代码如下所示,一部分是KPCA算法代码,另一部分是实验代码。
[plain]  view plain copy
  1. function [eigenvalue, eigenvectors, project_invectors] = kpca(x, sigma, cls, target_dim)  
  2.     % kpca进行数据提取的函数  
  3.     psize=size(x);  
  4.     m=psize(1);     % 样本数  
  5.     n=psize(2);     % 样本维数  
  6.   
  7.   
  8.     % 计算核矩阵k  
  9.     l=ones(m,m);  
  10.     for i=1:m  
  11.         for j=1:m  
  12.            k(i,j)=kernel(x(i,:),x(j,:),cls,sigma);   
  13.         end  
  14.     end  
  15.   
  16.   
  17.     % 计算中心化后的核矩阵  
  18.     kl=k-l*k/m-k*l/m+l*k*l/(m*m);    
  19.   
  20.   
  21.     % 计算特征值与特征向量  
  22.     [v,e] = eig(kl);   
  23.     e = diag(e);  
  24.   
  25.   
  26.     % 筛选特征值与特征向量  
  27.     [dump, index] = sort(e, 'descend');  
  28.     e = e(index);  
  29.     v = v(:, index);  
  30.     rank = 0;  
  31.     for i = 1 : size(v, 2)  
  32.         if e(i) < 1e-6  
  33.             break;  
  34.         else  
  35.             v(:, i) = v(:, i) ./ sqrt(e(i));  
  36.         end  
  37.         rank = rank + 1;  
  38.     end  
  39.     eigenvectors = v(:, 1 : target_dim);  
  40.     eigenvalue = e(1 : target_dim);  
  41.   
  42.   
  43.     % 投影  
  44.     project_invectors = kl*eigenvectors;   %计算在特征空间向量上的投影   
  45. end  

[plain]  view plain copy
  1. function compare  
  2.     clear all;  
  3.     close all;  
  4.     clc;  
  5.       
  6.     % 生成非线性可分的三类数据  
  7.     if exist('X1.mat')  
  8.         load 'X1.mat'  
  9.         load 'X2.mat'  
  10.         load 'X3.mat'  
  11.         figure(1)         
  12.         plot(X1(1, :),X1(2, :) ,'ro')  
  13.         hold on;  
  14.         plot(X2(1, :),X2(2, :),'g*')  
  15.         hold on;  
  16.         plot(X3(1, :),X3(2, :),'b.')  
  17.         hold on;  
  18.           
  19.         title('原始数据');  
  20.         xlabel('第一维');  
  21.         ylabel('第二维');  
  22.         saveas(gcf, '原始数据图.jpg')  
  23.     else  
  24.         [X1, X2, X3] = generate_data();  
  25.         save 'X1.mat'  X1  
  26.         save 'X2.mat'  X2  
  27.         save 'X3.mat'  X3  
  28.     end  
  29.   
  30.     X = [X1 X2 X3];  
  31.     [nFea, nSmps] = size(X);  
  32.     nClsSmps = nSmps / 3;  
  33.       
  34.     % PCA  
  35.     [vec_pca, Y_pca, value_pca] = princomp(X');  
  36.     Y_pca = Y_pca';  
  37.       
  38.     figure(2);  
  39.     plot(Y_pca(1, 1 : nClsSmps),Y_pca(2, 1 : nClsSmps), 'ro');  
  40.     hold on;  
  41.     plot(Y_pca(1, nClsSmps + 1 : 2 * nClsSmps),Y_pca(2, nClsSmps + 1 : 2 * nClsSmps), 'g*');  
  42.     hold on;  
  43.     plot(Y_pca(1, 2 * nClsSmps + 1 : end),Y_pca(2, 2 * nClsSmps + 1 : end), 'b.');  
  44.     hold on;  
  45.     title('PCA');  
  46.     xlabel('第一维');  
  47.     ylabel('第二维');  
  48.     saveas(gcf, 'PCA投影图.jpg')  
  49.       
  50.     % KPCA  
  51.     percent = 1;  
  52.     var   = 2; % 1 代表高斯核,2代表多项式核,3代表线性核  
  53.     sigma = 6; % 核参数  
  54.     [vec_KPCA, value_KPCA, Y_pca] = kpca(X', sigma, var, 2);  
  55.     Y_pca = Y_pca';  
  56.       
  57.     figure(3);  
  58.     plot(Y_pca(1, 1 : nClsSmps),Y_pca(2, 1 : nClsSmps), 'ro');  
  59.     hold on;  
  60.     plot(Y_pca(1, nClsSmps + 1 : 2 * nClsSmps),Y_pca(2, nClsSmps + 1 : 2 * nClsSmps), 'g*');  
  61.     hold on;  
  62.     plot(Y_pca(1, 2 * nClsSmps + 1 : end),Y_pca(2, 2 * nClsSmps + 1 : end), 'b.');  
  63.     hold on;  
  64.     str = strcat('KPCA', '(p =', num2str(sigma), ')');  
  65.     title(str);  
  66.     xlabel('第一维');  
  67.     ylabel('第二维');  
  68.     str = strcat(str, '.jpg')  
  69.     saveas(gcf, str)  
  70. end  


5. 总结

KPCA的算法虽然简单,但是个人认为,它的意义更在于一种思想:将数据隐式映射到高维线性可分空间,利用核函数进行处理,无需知道映射函数的具体形式。这种思想实在是太牛了,它让降维变得更有意义。为这种思想点赞!!!

这篇关于解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程~的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637071

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud