zoukankan      html  css  js  c++  java
  • 局部保留投影算法(个人学习)

    LPP(局部保留投影算法)

    LPP是降维算法之一,降维的目的是为了缓解维数灾难的问题,一个维度为m的原始空间,当m足够大时,对其进行内积运算就会产生内存不足的情况,特别是在处理人脸识别数据集的时候,人脸数据集中有很多冗余的信息,而降维的目的就是删除掉这些冗余的信息,构建一个新的坐标轴,是原始数据点可以投影到一个新的坐标轴上。

    典型的降维的例子:PCA(Principal Component Analysis):主元分析、主成分法。常用于高维数据的降维。可用于提取数据的主要特征分量

    【总问题】如何提取数据的主要特征分量?

    其几何表示见下图:

                                     

    我们可以看出A 与 B 的内积等于 A 到 B 的投影长度乘以 B 的模。如果假设 B 的模为 1,那么就变成了A·B=|A|·|B|cosA=|A|cosA,也就是说A 与 B 的内积值等于 A 向 B 所在直线投影的矢量长度。
    我们想要描述一个向量,首先要确定一组基,然后给出所在基上的投影值,例如。向量(5,2),我们可以说它在left ( 1,0 
ight )left ( 0,1
ight )这组基下,分别内积即可。向量基最好选择模长为1,当模长为1时,内积直接就可以表示向量投影,而且向量基要求线性无关。
     
    举个栗子:例如对于数据点 [公式] 来说,想变换到刚才那组基上[公式] 和 [公式] ,则可以这样表示:

    $$ egin{bmatrix} left ( sqrt{2}
ight ) ^{-1}& left ( sqrt{2}
ight ) ^{-1} \ left ( -sqrt{2}
ight ) ^{-1}& left ( sqrt{2}
ight ) ^{-1} end{bmatrix} 	ag{4} $$$$ egin{bmatrix} left 1& 2&3 \1}&2&3end{bmatrix} 	ag{2} $$=$$ egin{bmatrix} left 2/sqrt{2}& 4/sqrt{2}&6/sqrt{2} \0}&0&0end{bmatrix} 	ag{2} $$
     
     
    通用的表示形式:

                      

    其中p_{i}是一个行向量,表示第 i 个基,a_{i}是一个列向量,表示第 j 个原始数据记录。实际上也就是做了一个向量矩阵化的操作。

    现在我们可以对矩阵相乘有了一个新的物理解释:
    两个矩阵相乘的意义是将右边矩阵中的每一列向量 a_{i}变换到左边矩阵中以每一行行向量为基所表示的空间中去。也就是说一个矩阵可以表示一种线性变换。
    而且我们还可以看出,如果基的数量少于向量本身的维数,则可以达到降维的效果。
     
    【问题一】如何得到一个最优的向量基?
    直观的想法是投影后的值尽可能分散,如果数据重叠,有些样本就会消失。
    1.一维用方差:
    分散程度我们可以用方差来表示,一个变量的方差可以看作是每个元素与变量均值的差的平方和的均值,(围绕平均数波动的大小,在一维空间中我们用方差来表示数据的分散程度)即: 

                                                              

    那么我们想要使数据尽量分散,就期望当我们在寻找最优的基的时候,是的所有数据变换为这个基上的坐标后,方差最大。

    2.多维数据用协方差:

    协方差可以表示两个变量的相关性。为了让两个变量尽可能表示更多的原始信息,我们希望它们之间不存在线性相关性,因为相关性意味着两个变量不是完全独立,必然存在重复表示的信息。

    协方差公式为:

                                                            

    当协方差为 0 时,表示两个变量完全独立。为了让协方差为 0,我们选择第二个基时只能在与第一个基正交的方向上进行选择,因此最终选择的两个方向一定是正交的。

    至此,我们得到了降维问题的优化目标:将一组 N 维向量降为 K 维,其目标是选择 K 个单位正交基,使得原始数据变换到这组基上后,各变量两两间协方差为 0,而变量方差则尽可能大(在正交的约束下,取最大的 K 个方差)

    3.变量方差以及协方差,将二者统一表示。

    二者都可以表示内积的形式,即,我们前面提到过的矩阵相乘表示向量内积。

    假设我们只有 a 和 b 两个变量,那么我们将它们按行组成矩阵 X:

    [公式]

    然后:

    [公式]

    我们可以看到这个矩阵对角线上的分别是两个变量的方差,而其它元素是 a 和 b 的协方差。两者被统一到了一个矩阵里。

     因此,根据之前的分析,如果使得数据尽量分量,所以我们需要让该对称矩阵的对角线上面的值(即方差)尽可能的大,方差大小从小到大的排列,非对角线上的元素(即协方差)都为0。这样就可以达到优化的目的。

    3.矩阵对角化

    原始数据矩阵 X 对应的协方差矩阵为 C,而 P 是一组基按行组成的矩阵,设 Y=PX,则 Y 为 X 对 P 做基变换后的数据。设 Y 的协方差矩阵为 D,我们推导一下 D 与 C 的关系:

    [公式]

    这样我们就看清楚了,我们要找的 P 是能让原始协方差矩阵对角化的 P。换句话说,优化目标变成了寻找一个矩阵 P,满足 [公式] 是一个对角矩阵,并且对角元素按从大到小依次排列,那么 P 的前 K 行就是要寻找的基,用 P 的前 K 行组成的矩阵乘以 X 就使得 X 从 N 维降到了 K 维并满足上述优化条件。

    至此,我们离 PCA 还有仅一步之遥,我们还需要完成对角化。

    由上文知道,协方差矩阵 C 是一个是对称矩阵,在线性代数中实对称矩阵有一系列非常好的性质:

    1. 实对称矩阵不同特征值对应的特征向量必然正交。
    2. 设特征值 [公式] 重数为 r,则必然存在 r 个线性无关的特征向量对应于 [公式] ,因此可以将这 r 个特征向量单位正交化。

    由上面两条可知,一个 n 行 n 列的实对称矩阵一定可以找到 n 个单位正交特征向量

    设这 n 个特征向量为 [公式] ,我们将其按列组成矩阵: [公式] 。

    则对协方差矩阵 C 有如下结论:

    [公式]

    其中 [公式] 为对角矩阵,其对角元素为各特征向量对应的特征值(可能有重复)。

    到这里,我们发现我们已经找到了需要的矩阵 P: [公式] 。(因为之前的矩阵是竖着的列向量,P 是协方差矩阵的特征向量单位化后按行排列出的矩阵)

    P 是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是 C 的一个特征向量。(这个矩阵P其实就是代表我们从一组方向上选择一个方向使得投影后的点散的开,也就是分散程度最大)

     

    如果设 P 按照 [公式] 中特征值的从大到小,将特征向量从上到下排列,则用 P 的前 K 行组成的矩阵乘以原始数据矩阵 X,就得到了我们需要的降维后的数据矩阵 Y。

    总结一下PCA算法的步骤:

    设有 m 条 n 维数据。

    1. 将原始数据按列组成 n 行 m 列矩阵 X;
    2. 将 X 的每一行进行零均值化,即减去这一行的均值;
    3. 求出协方差矩阵 [公式] ;
    4. 求出协方差矩阵的特征值及对应的特征向量;
    5. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k 行组成矩阵 P;
    6. [公式] 即为降维到 k 维后的数据。

    ··················································································································

    哈希算法叫做安全散列算法,又称信息摘要。感知哈希算法可以用来比较两张图片的相似度。感知图像哈希就是寻找一个哈希函数H(I),将图像映射到一个短序列H =H(I),使其能够表示图像本身,并进一步用于各种应用。

    图像感知算法的处理过程:

    1. 缩小尺寸:将图像缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图像的细节,只保留结构/明暗等基本信息,摒弃不同尺寸/比例带来的图像差异;
    2. 简化色彩:将缩小后的图像,转为64级灰度,即所有像素点总共只有64种颜色;
    3. 计算平均值:计算所有64个像素的灰度平均值;
    4. 比较像素的灰度:将每个像素的灰度,与平均值进行比较,大于或等于平均值记为1,小于平均值记为0;
    5. 计算哈希值:将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图像的指纹。
    6. 组合的次序并不重要,只要保证所有图像都采用同样次序就行了; 得到指纹以后,就可以对比不同的图像,看看64位中有多少位是不一样的。在理论上,这等同于”汉明距离”(Hamming distance,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数)。如果不相同的数据位数不超过5,就说明两张图像很相似;如果大于10,就说明这是两张不同的图像。

    ·········································································································

    鲁棒性:一个系统或组织有抵御或克服不利条件的能力。

    机器学习,训练模型时,工程师可能会向算法内添加噪声(如对抗训练),以便测试算法的「鲁棒性」。可以将此处的鲁棒性理解为算法对数据变化的容忍度有多高。

    ···········································································································

    计算汉明距离的算法

    在信息论中,两个等长字符串之间的汉明距离(英语:Hamming distance)是两个字符串对应位置的不同字符的个数。

    换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。

      思路:

      01.将两个给定的数进行 异或(^)运算后保存在变量a,汉明距离就是a的二进制中1的个数

      02.当a不为0时,和0x01进行 按位与(&)运算,如果结果为1,则统计变量加一

      03.将a右移一位,重复第02步

      1. class Solution {
      2.  
        public:
      3.  
        int hammingDistance(int x, int y) {
      4.  
        int num=0;
      5.  
        x=x^y;
      6.  
        while(x!=0)
      7.  
        {
      8.  
        if(x&0x01)
      9.  
        num++;
      10.  
        x=x>>1;
      11.  
        }
      12.  
        return num;}
      13.  
        };

    ·························································································································································

    双线性插值的公式

    双线性插值:在两个方向分别进行一次线性插值(首先在一个方向上使用线性插值,然后再在另一个方向上使用线性插值执行双线性插值。尽管每个步骤在采样值和位置上都是线性的,但是插值总体上不是线性的,而是在采样位置上是二次的。)

    在这里插入图片描述
    如图所示,我们需要求P点的像素值。我们已知了Q11、Q21、Q12、Q22、P的坐标。也知道Q11、Q21、Q12、Q22的像素值。所以先用关于X的单线性插值去分别计算R1、R2的像素值:
    在这里插入图片描述

    在右边的等式中的字母f(Q11)、f(Q12)、f(Q21)、f(Q22)、x1、x2、x都是已知的,求出的f(x,y1)与f(x,y2)即为R1、R2的像素值。
    再使用关于y方向的单线性插值计算P点的像素值
    得出:
    在这里插入图片描述

    在右边的等式中的字母y1、y2、y都是已知的,f(x,y1)与f(x,y2)即为上一个式子中求出的R1、R2像素值。

    什么是图像归一化?

    归一化就是通过一系列变换(即利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响),将待处理的原始图像转换成相应的唯一标准形式(该标准形式图像对平移、旋转、缩放等仿射变换具有不变特性)。

    基于矩的图像归一化技术基本工作原理为:首先利用图像中对仿射变换具有不变性的矩来确定变换函数的参数, 然后利用此参数确定的变换函数把原始图像变换为一个标准形式的图像(该图像与仿射变换无关)。 一般说来,基于矩的图像归一化过程包括4个步骤,即坐标中心化、x-shearing 归一化、缩放归一化和旋转归一化。

    ···················································································································································

    下面介绍公式中各个参数的含义:

    波长(λ):它的值以像素为单位指定,通常大于等于2.但不能大于输入图像尺寸的五分之一。

    方向(θ):这个参数指定了Gabor函数并行条纹的方向,它的取值为0到360度

    相位偏移(φ):它的取值范围为-180度到180度。其中,0he180度分别对应中心对称的center-on函数和center-off函数,而-90度和90度对应反对称函数。

    长宽比(γ):空间纵横比,决定了Gabor函数形状(support,我翻译为形状)的椭圆率(ellipticity)。当γ= 1时,形状是圆的。当γ< 1时,形状随着平行条纹方向而拉长。通常该值为0.5

    带宽(b):Gabor滤波器的半响应空间频率带宽b和σ/ λ的比率有关,其中σ表示Gabor函数的高斯因子的标准差,如下:


    σ的值不能直接设置,它仅随着带宽b变化。带宽值必须是正实数,通常为1,此时,标准差和波长的关系为:σ= 0.56 λ。带宽越小,标准差越大,Gabor形状越大,可见平行兴奋和抑制区条纹数量越多。

    ·························································································································

    1.特征提取得到了归一化矩阵X

    2.最大Gabor滤波响应:选取6个方向

    θ1= 0, θ2= π/6,θ3= π/3, θ4= π/2, θ5= 2π/3, θ6= 5π/6.

    对归一化特征矩阵X进行Gabor滤波。

    得到的最大Gabor滤波响应表示为G(Gabor滤波响应最大值)

    Gv,i= max(Gθ1,v,i, Gθ2,v,i, Gθ3,v,i, Gθ4,v,i, Gθ5,v,i, Gθ6,v,i),

    1 ≤ v ≤ b², 1 ≤ i ≤ N。

    我们将G表示成为G = [g1,g2,g3,· · · ,gN]

    (到这一步我们只是做到了提取特征,下一步我们需要通过LPP在Gabor所提取的特征中保持局部特征)

    matlab代码

    3.LPP(在Gabor所提取的特征中保持局部特征)

    从高维空间中最优地保留局部邻域结构信息,已成功地用于提取图像鉴别特征进行识别。

    现在我们要从一个b²XN的G矩阵,降维到一个dXN的F矩阵,(d<<b²)

    F为通过LPP对应的低维结构,N是列数,b² 和 d都是维数。

     --------------------------------------------------------------------------------------------------

     在机器学习中,在面对非线性问题时,往往都会用到一个名为“核函数”的技巧

    如图所示,左面的图为为原空间,右面的图为映射后的空间,从图中也可以看出来,左面图要用一个椭圆才能将两个类别分割开来,而右面的图要用一个超平面就可以分割开,也如图上的共识所示,原空间点左边为(x1,x2),经过某个函数或者某种计算方法,转化为特征空间上点坐标为(z1,z2,z3),所以我们之前的说法是正确的,将低维空间转化到高维空间大概率可以对其中的点进行线性分割。

    这样,我们第一步就理解了,就是在低维空间上的点通过某一函数转化为高维空间上,更有助于线性分类。

    Kernel:映射的内积

    内积的意义:

     为什么我们在论文中提到LPP算法也要用到核函数呢?

     
    左图为原数据,右图为映射到三维的数据,可以看出:同样是降到1维,先通过Kernel映射到(Kernel是映射的内积,不要弄乱了)三维,再投影到1维,就容易分离开,这就是Kernel在PCA降维中的应用,本质还是对原有数据增加维度。
  • 相关阅读:
    设计模式-外观模式
    发生死锁怎么办
    设计模式-工厂模式
    设计模式-模板方法
    设计模式-命令模式(Command)
    设计模式-单例模式
    设计模式-装饰器模式
    CQRS之旅——旅程8(后记:经验教训)
    CQRS之旅——旅程7(增加弹性和优化性能)
    CQRS之旅——旅程6(我们系统的版本管理)
  • 原文地址:https://www.cnblogs.com/shangstacey/p/13955793.html
Copyright © 2011-2022 走看看