zoukankan      html  css  js  c++  java
  • Kernel PCA 推导

    算法原理

    部分数据在低维度线性不可分,但映射到高维度时就可以实现线性划分。通过使用核的技巧就可以实现映射$x_i ightarrow phi_{x_i} $,并在映射得到的新的特征空间进行主成分分析。

    推导方法1[1]

    推导建立在PCA的基础上的。需要先掌握PCA。可以参考前一篇博客

    假设在特征空间数据的均值为:

    [mu = frac{1}{n} sum _{i=1} ^n phi(x_i)= 0 ]

    有方差:

    [C = frac{1}{n} sum _{i=1} ^n phi(x_i) phi(x_i)^ T ]

    和PCA相类似, 特征向量为:

    [egin{align} Cv = lambda v end{align} ]

    因为不知道(phi)的形式是怎么样的,并不能直接通过特征分解求(v)

    可以证明(v)可以表示成高维特征的线性组合

    [v_j = sum _{i=1} ^n alpha _{ji} phi(x_i) ]

    所以求特征向量等价于求因子(alpha_{ji})

    通过将(C, v)的表达式代入(1)中可以得到:

    [egin{align}K alpha_j = n lambda_j alpha_j end{align} ]

    其中(K)是一个核函数,(k(x_i, x_j) = phi (x_i)^T phi (x_i), K eq C)对于特定的数据,可认为是已知的。由(2) $alpha _j (是)K(的特征向量, 下面求其约束。注意这里并不是要求其长度为1。 特征向量)v_j$是一个单位向量,

    [v_j^T v_j = 1 ]

    代入(v_j)

    [sum _{k=1} ^n sum _{l=1} ^n alpha _{jl} alpha _{jk} phi(x_l)^T phi(x_k)= 1 ]

    [alpha _j ^T K alpha _j = 1 ]

    代入(2)得到

    [lambda _j n alpha _j ^T alpha _j = 1 , forall j ]

    以上就是其长度约束。

    对于新的数据x,它在主成分的投影坐标为

    [phi (x)^T v_j = sum _{i=1} ^n alpha _{ji} phi (x)^T phi (x_i) = sum _{i=1} ^n alpha _{ji}K(x, x_j) ]

    由以上投影坐标可以求。


    一般情况下,特征空间的均值不是0。可以将特征中心化。

    [hat phi (x_i) = phi(x_i) - frac{1}{n} sum _{k=1} ^n phi(x_k) ]

    相应的核也变成了

    [hat K(x_i, x_j) = K(x_i, x_j) - frac{1}{n} sum _{k=1} ^n K(x_i, x_k) - frac{1}{n} sum _{k=1} ^n K(x_j, x_k)+ frac{1}{n^2} sum _{l= 1, k=1} ^n K(x_l, x_k) ]

    矩阵形式:

    [hat K (x_i , x_j) = K - 2 1_{1/n}K + 1 _{1/n }K 1_{1/n} ]

    (1_{1/n})表示所有元素为1的矩阵。


    KPCA的算法流程

    1. 选择一个核
    2. 由(3)建立一个归一化核矩阵
    3. 求特征值分解

    [hat K alpha _i = lambda _i alpha _i ]

    1. 对于新的数据点在主成分的投影为

    [y_i = sum _{i=1} ^n alpha _{ji}K(x, x_i), j = 1, ···d ]

    推导方法2[2]

    假设数据均值为0时,有协方差矩阵,

    [C = frac{1}{n}X^T X = frac{1}{N} egin{bmatrix} phi(x_1),...phi(x_n) end{bmatrix} egin{bmatrix} phi(x_1)^T \ vdots \ phi(x_n)^T end{bmatrix}]

    (X)认为是数据在特征空间的表示。因为不知道(phi)的形式,所以希望转换成可以用kernel K表示形式

    [K = X X^T = egin{bmatrix} phi(x_1)^T phi(x_1) & dots & phi(x_1)^T phi(x_n)\ vdots & dots & vdots\ phi(x_n)^Tphi(x_1) & dots & phi(x_n)^T phi(x_n)end{bmatrix} \= egin{bmatrix} kappa(x_1, x_1) & dots & kappa(x_1, x_n) \ vdots & dots & vdots\ kappa(x_n, x_1) & dots & kappa(x_n, x_n) end{bmatrix} ]

    从kernel矩阵的特征方程(逆向推理)出发:

    [ X X^T u = lambda u ]

    两边左乘(X^T),整理得到

    [ X^T X (X^T u) = lambda (X^T u) ]

    可以看出(X^T u)(C)的特征向量,因为其受到其为单位向量的约束,有:

    [v = frac{1}{||X^T u||}X^T u = frac{1}{sqrt{u ^T X X^T u}}X^T u \ =frac{1}{sqrt{u^T lambda u}}X^T u = frac{1}{sqrt{ lambda}}X^T u]

    这里令(u)也是单位向量。特征向量还是和(X)直接相关,仍然是未知的。

    直接考虑在特征空间投影之后的坐标(高中向量知识):

    [v ^T phi(x') = (frac{1}{sqrt{ lambda}}X^T u)^T phi(x') = frac{1}{sqrt{ lambda}}u^T X phi(x') \ = frac{1}{sqrt{ lambda}}u^T egin{bmatrix} phi(x_1)^T \ vdots \ phi(x_n)^T end{bmatrix} phi(x') = frac{1}{sqrt{ lambda}}u^T egin{bmatrix} kappa(x_1, x') \ vdots \ kappa(x_n, x') end{bmatrix} ]

    最想要知道的正好是可以计算的。


    题外话
    特征空间的向量(v)可以用特征空间的数据线性表示。因为

    [ v=frac{1}{sqrt{ lambda}}X^T u = frac{1}{sqrt{ lambda}}egin{bmatrix} phi(x_1),...phi(x_n) end{bmatrix} u \ = frac{1}{sqrt{ lambda}} sum _{i=1} ^n u_i phi(x_i) = sum_{i=1} ^n alpha_i phi(x_i)]


    KPCA的算法流程

    1. 选择一个核
    2. 建立一个归一化核矩阵
    3. 求特征值分解

    [K u = lambda u ]

    1. 对于新的数据点在主成分的投影为

    [v= frac{1}{sqrt{ lambda}}u^T egin{bmatrix} kappa(x_1, x') \ vdots \ kappa(x_n, x') end{bmatrix}]

    参考文献

    [1]. http://www.cs.haifa.ac.il/~rita/uml_course/lectures/KPCA.pdf
    [2]. https://www.youtube.com/watch?v=G2NRnh7W4NQ

  • 相关阅读:
    C调用C++的动态库
    记“gorm查询没报错,但结果为空”的解决
    Android学习之路(一) Android Studio创建项目
    Windows程序消息机制浅析
    2021.5.1 学习小目标
    微信测试流程
    mysql使用正则表达式匹配中文所遇到的问题
    关于mysql的distinct用法
    一次性能测试的网络层面总结
    mongodb中直接根据某个字段更新另外一个字段值
  • 原文地址:https://www.cnblogs.com/hainingwyx/p/6834671.html
Copyright © 2011-2022 走看看