zoukankan      html  css  js  c++  java
  • 数字图像处理-----主成成分分析PCA

    主成分分析PCA

    降维的必要性

    1.多重共线性--预测变量之间相互关联。多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯。

    2.高维空间本身具有稀疏性。一维正态分布有68%的值落于正负标准差之间,而在十维空间上只有0.02%。

    3.过多的变量会妨碍查找规律的建立。

    4.仅在变量层面上分析可能会忽略变量之间的潜在联系。例如几个预测变量可能落入仅反映数据某一方面特征的一个组内。

    降维的目的:

    1.减少预测变量的个数

    2.确保这些变量是相互独立的

    3.提供一个框架来解释结果

    降维的方法有:主成分分析、因子分析、用户自定义复合等。

    PCA(Principal Component Analysis)不仅仅是对高维数据进行降维,更重要的是经过降维去除了噪声,发现了数据中的模式。

    PCA把原先的n个特征用数目更少的m个特征取代,新特征是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的m个特征互不相关。从旧特征到新特征的映射捕获数据中的固有变异性。

    预备知识

    样本X和样本Y的协方差(Covariance):

    协方差的几何解释:http://www.cnblogs.com/nsnow/p/4758202.html

         协方差矩阵的最大特征向量总是指向数据最大方差的方向,并且该向量的幅度等于相应的特征值。第二大特征向量总是正交于最大特征向量,并指向第二大数据的传播方向。

    协方差的matlab计算公式为:
        协方差(i,j)=(第i列所有元素-第i列均值)*(第j列所有元素-第j列均值)/(样本数-1
    a =
        -1     1     2
        -2     3     1
         4     0     3

    for i=1:size(a,2) 
        for j=1:size(a,2) 
            c(i,j)=sum((a(:,i)-mean(a(:,i))).*(a(:,j)-mean(a(:,j))))/(size(a,1)-1);
        end 
    end

    c =

       10.3333   -4.1667    3.0000

       -4.1667    2.3333   -1.5000

        3.0000   -1.5000    1.0000 

    协方差为正时说明X和Y是正相关关系,协方差为负时X和Y是负相关关系,协方差为0时X和Y相互独立。

    Cov(X,X)就是X的方差(Variance).

    当样本是n维数据时,它们的协方差实际上是协方差矩阵(对称方阵),方阵的边长是。比如对于3维数据(x,y,z),计算它的协方差就是:

    ,则称是A的特征值,X是对应的特征向量。实际上可以这样理解:矩阵A作用在它的特征向量X上,仅仅使得X的长度发生了变化,缩放比例就是相应的特征值

    当A是n阶可逆矩阵时,A与P-1Ap相似,相似矩阵具有相同的特征值。

    特别地,当A是对称矩阵时,A的奇异值等于A的特征值,存在正交矩阵Q(Q-1=QT),使得:

    对A进行奇异值分解就能求出所有特征值和Q矩阵。

         D是由特征值组成的对角矩阵

    由特征值和特征向量的定义知,Q的列向量就是A的特征向量。

    Jama包

    Jama包是用于基本线性代数运算的java包,提供矩阵的cholesky分解、LUD分解、QR分解、奇异值分解,以及PCA中要用到的特征值分解,此外可以计算矩阵的乘除法、矩阵的范数和条件数、解线性方程组等。

    PCA过程

    1.特征中心化。即每一维的数据都减去该维的均值。这里的“维”指的就是一个特征(或属性),变换之后每一维的均值都变成了0。

    很多数据挖掘的教材上都会讲到鹫尾花的例子,本文就拿它来做计算。原始数据是150×4的矩阵A:

    5.1     3.5     1.4     0.2
    4.9     3.0     1.4     0.2
    4.7     3.2     1.3     0.2
    4.6     3.1     1.5     0.2
    5.0     3.6     1.4     0.2
    5.4     3.9     1.7     0.4
    4.6     3.4     1.4     0.3
    5.0     3.4     1.5     0.2
    4.4     2.9     1.4     0.2
    4.9     3.1     1.5     0.1
    5.4     3.7     1.5     0.2
    4.8     3.4     1.6     0.2
    4.8     3.0     1.4     0.1
    4.3     3.0     1.1     0.1
    5.8     4.0     1.2     0.2
    5.7     4.4     1.5     0.4
    5.4     3.9     1.3     0.4
    5.1     3.5     1.4     0.3
    5.7     3.8     1.7     0.3
    5.1     3.8     1.5     0.3
    5.4     3.4     1.7     0.2
    5.1     3.7     1.5     0.4
    4.6     3.6     1.0     0.2
    5.1     3.3     1.7     0.5
    4.8     3.4     1.9     0.2
    5.0     3.0     1.6     0.2
    5.0     3.4     1.6     0.4
    5.2     3.5     1.5     0.2
    5.2     3.4     1.4     0.2
    4.7     3.2     1.6     0.2
    4.8     3.1     1.6     0.2
    5.4     3.4     1.5     0.4
    5.2     4.1     1.5     0.1
    5.5     4.2     1.4     0.2
    4.9     3.1     1.5     0.1
    5.0     3.2     1.2     0.2
    5.5     3.5     1.3     0.2
    4.9     3.1     1.5     0.1
    4.4     3.0     1.3     0.2
    5.1     3.4     1.5     0.2
    5.0     3.5     1.3     0.3
    4.5     2.3     1.3     0.3
    4.4     3.2     1.3     0.2
    5.0     3.5     1.6     0.6
    5.1     3.8     1.9     0.4
    4.8     3.0     1.4     0.3
    5.1     3.8     1.6     0.2
    4.6     3.2     1.4     0.2
    5.3     3.7     1.5     0.2
    5.0     3.3     1.4     0.2
    7.0     3.2     4.7     1.4
    6.4     3.2     4.5     1.5
    6.9     3.1     4.9     1.5
    5.5     2.3     4.0     1.3
    6.5     2.8     4.6     1.5
    5.7     2.8     4.5     1.3
    6.3     3.3     4.7     1.6
    4.9     2.4     3.3     1.0
    6.6     2.9     4.6     1.3
    5.2     2.7     3.9     1.4
    5.0     2.0     3.5     1.0
    5.9     3.0     4.2     1.5
    6.0     2.2     4.0     1.0
    6.1     2.9     4.7     1.4
    5.6     2.9     3.6     1.3
    6.7     3.1     4.4     1.4
    5.6     3.0     4.5     1.5
    5.8     2.7     4.1     1.0
    6.2     2.2     4.5     1.5
    5.6     2.5     3.9     1.1
    5.9     3.2     4.8     1.8
    6.1     2.8     4.0     1.3
    6.3     2.5     4.9     1.5
    6.1     2.8     4.7     1.2
    6.4     2.9     4.3     1.3
    6.6     3.0     4.4     1.4
    6.8     2.8     4.8     1.4
    6.7     3.0     5.0     1.7
    6.0     2.9     4.5     1.5
    5.7     2.6     3.5     1.0
    5.5     2.4     3.8     1.1
    5.5     2.4     3.7     1.0
    5.8     2.7     3.9     1.2
    6.0     2.7     5.1     1.6
    5.4     3.0     4.5     1.5
    6.0     3.4     4.5     1.6
    6.7     3.1     4.7     1.5
    6.3     2.3     4.4     1.3
    5.6     3.0     4.1     1.3
    5.5     2.5     4.0     1.3
    5.5     2.6     4.4     1.2
    6.1     3.0     4.6     1.4
    5.8     2.6     4.0     1.2
    5.0     2.3     3.3     1.0
    5.6     2.7     4.2     1.3
    5.7     3.0     4.2     1.2
    5.7     2.9     4.2     1.3
    6.2     2.9     4.3     1.3
    5.1     2.5     3.0     1.1
    5.7     2.8     4.1     1.3
    6.3     3.3     6.0     2.5
    5.8     2.7     5.1     1.9
    7.1     3.0     5.9     2.1
    6.3     2.9     5.6     1.8
    6.5     3.0     5.8     2.2
    7.6     3.0     6.6     2.1
    4.9     2.5     4.5     1.7
    7.3     2.9     6.3     1.8
    6.7     2.5     5.8     1.8
    7.2     3.6     6.1     2.5
    6.5     3.2     5.1     2.0
    6.4     2.7     5.3     1.9
    6.8     3.0     5.5     2.1
    5.7     2.5     5.0     2.0
    5.8     2.8     5.1     2.4
    6.4     3.2     5.3     2.3
    6.5     3.0     5.5     1.8
    7.7     3.8     6.7     2.2
    7.7     2.6     6.9     2.3
    6.0     2.2     5.0     1.5
    6.9     3.2     5.7     2.3
    5.6     2.8     4.9     2.0
    7.7     2.8     6.7     2.0
    6.3     2.7     4.9     1.8
    6.7     3.3     5.7     2.1
    7.2     3.2     6.0     1.8
    6.2     2.8     4.8     1.8
    6.1     3.0     4.9     1.8
    6.4     2.8     5.6     2.1
    7.2     3.0     5.8     1.6
    7.4     2.8     6.1     1.9
    7.9     3.8     6.4     2.0
    6.4     2.8     5.6     2.2
    6.3     2.8     5.1     1.5
    6.1     2.6     5.6     1.4
    7.7     3.0     6.1     2.3
    6.3     3.4     5.6     2.4
    6.4     3.1     5.5     1.8
    6.0     3.0     4.8     1.8
    6.9     3.1     5.4     2.1
    6.7     3.1     5.6     2.4
    6.9     3.1     5.1     2.3
    5.8     2.7     5.1     1.9
    6.8     3.2     5.9     2.3
    6.7     3.3     5.7     2.5
    6.7     3.0     5.2     2.3
    6.3     2.5     5.0     1.9
    6.5     3.0     5.2     2.0
    6.2     3.4     5.4     2.3
    5.9     3.0     5.1     1.8

    每一列减去该列均值后,得到矩阵B:

    -0.743333       0.446       -2.35867        -0.998667      
    -0.943333       -0.054      -2.35867        -0.998667      
    -1.14333        0.146       -2.45867        -0.998667      
    -1.24333        0.046       -2.25867        -0.998667      
    -0.843333       0.546       -2.35867        -0.998667      
    -0.443333       0.846       -2.05867        -0.798667      
    -1.24333        0.346       -2.35867        -0.898667      
    -0.843333       0.346       -2.25867        -0.998667      
    -1.44333        -0.154      -2.35867        -0.998667      
    -0.943333       0.046       -2.25867        -1.09867       
    -0.443333       0.646       -2.25867        -0.998667      
    -1.04333        0.346       -2.15867        -0.998667      
    -1.04333        -0.054      -2.35867        -1.09867       
    -1.54333        -0.054      -2.65867        -1.09867       
    -0.0433333      0.946       -2.55867        -0.998667      
    -0.143333       1.346       -2.25867        -0.798667      
    -0.443333       0.846       -2.45867        -0.798667      
    -0.743333       0.446       -2.35867        -0.898667      
    -0.143333       0.746       -2.05867        -0.898667      
    -0.743333       0.746       -2.25867        -0.898667      
    -0.443333       0.346       -2.05867        -0.998667      
    -0.743333       0.646       -2.25867        -0.798667      
    -1.24333        0.546       -2.75867        -0.998667      
    -0.743333       0.246       -2.05867        -0.698667      
    -1.04333        0.346       -1.85867        -0.998667      
    -0.843333       -0.054      -2.15867        -0.998667      
    -0.843333       0.346       -2.15867        -0.798667      
    -0.643333       0.446       -2.25867        -0.998667      
    -0.643333       0.346       -2.35867        -0.998667      
    -1.14333        0.146       -2.15867        -0.998667      
    -1.04333        0.046       -2.15867        -0.998667      
    -0.443333       0.346       -2.25867        -0.798667      
    -0.643333       1.046       -2.25867        -1.09867       
    -0.343333       1.146       -2.35867        -0.998667      
    -0.943333       0.046       -2.25867        -1.09867       
    -0.843333       0.146       -2.55867        -0.998667      
    -0.343333       0.446       -2.45867        -0.998667      
    -0.943333       0.046       -2.25867        -1.09867       
    -1.44333        -0.054      -2.45867        -0.998667      
    -0.743333       0.346       -2.25867        -0.998667      
    -0.843333       0.446       -2.45867        -0.898667      
    -1.34333        -0.754      -2.45867        -0.898667      
    -1.44333        0.146       -2.45867        -0.998667      
    -0.843333       0.446       -2.15867        -0.598667      
    -0.743333       0.746       -1.85867        -0.798667      
    -1.04333        -0.054      -2.35867        -0.898667      
    -0.743333       0.746       -2.15867        -0.998667      
    -1.24333        0.146       -2.35867        -0.998667      
    -0.543333       0.646       -2.25867        -0.998667      
    -0.843333       0.246       -2.35867        -0.998667      
    1.15667     0.146       0.941333        0.201333       
    0.556667        0.146       0.741333        0.301333       
    1.05667     0.046       1.14133     0.301333       
    -0.343333       -0.754      0.241333        0.101333       
    0.656667        -0.254      0.841333        0.301333       
    -0.143333       -0.254      0.741333        0.101333       
    0.456667        0.246       0.941333        0.401333       
    -0.943333       -0.654      -0.458667       -0.198667      
    0.756667        -0.154      0.841333        0.101333       
    -0.643333       -0.354      0.141333        0.201333       
    -0.843333       -1.054      -0.258667       -0.198667      
    0.0566667       -0.054      0.441333        0.301333       
    0.156667        -0.854      0.241333        -0.198667      
    0.256667        -0.154      0.941333        0.201333       
    -0.243333       -0.154      -0.158667       0.101333       
    0.856667        0.046       0.641333        0.201333       
    -0.243333       -0.054      0.741333        0.301333       
    -0.0433333      -0.354      0.341333        -0.198667      
    0.356667        -0.854      0.741333        0.301333       
    -0.243333       -0.554      0.141333        -0.0986667     
    0.0566667       0.146       1.04133     0.601333       
    0.256667        -0.254      0.241333        0.101333       
    0.456667        -0.554      1.14133     0.301333       
    0.256667        -0.254      0.941333        0.00133333     
    0.556667        -0.154      0.541333        0.101333       
    0.756667        -0.054      0.641333        0.201333       
    0.956667        -0.254      1.04133     0.201333       
    0.856667        -0.054      1.24133     0.501333       
    0.156667        -0.154      0.741333        0.301333       
    -0.143333       -0.454      -0.258667       -0.198667      
    -0.343333       -0.654      0.0413333       -0.0986667     
    -0.343333       -0.654      -0.0586667      -0.198667      
    -0.0433333      -0.354      0.141333        0.00133333     
    0.156667        -0.354      1.34133     0.401333       
    -0.443333       -0.054      0.741333        0.301333       
    0.156667        0.346       0.741333        0.401333       
    0.856667        0.046       0.941333        0.301333       
    0.456667        -0.754      0.641333        0.101333       
    -0.243333       -0.054      0.341333        0.101333       
    -0.343333       -0.554      0.241333        0.101333       
    -0.343333       -0.454      0.641333        0.00133333     
    0.256667        -0.054      0.841333        0.201333       
    -0.0433333      -0.454      0.241333        0.00133333     
    -0.843333       -0.754      -0.458667       -0.198667      
    -0.243333       -0.354      0.441333        0.101333       
    -0.143333       -0.054      0.441333        0.00133333     
    -0.143333       -0.154      0.441333        0.101333       
    0.356667        -0.154      0.541333        0.101333       
    -0.743333       -0.554      -0.758667       -0.0986667     
    -0.143333       -0.254      0.341333        0.101333       
    0.456667        0.246       2.24133     1.30133    
    -0.0433333      -0.354      1.34133     0.701333       
    1.25667     -0.054      2.14133     0.901333       
    0.456667        -0.154      1.84133     0.601333       
    0.656667        -0.054      2.04133     1.00133    
    1.75667     -0.054      2.84133     0.901333       
    -0.943333       -0.554      0.741333        0.501333       
    1.45667     -0.154      2.54133     0.601333       
    0.856667        -0.554      2.04133     0.601333       
    1.35667     0.546       2.34133     1.30133    
    0.656667        0.146       1.34133     0.801333       
    0.556667        -0.354      1.54133     0.701333       
    0.956667        -0.054      1.74133     0.901333       
    -0.143333       -0.554      1.24133     0.801333       
    -0.0433333      -0.254      1.34133     1.20133    
    0.556667        0.146       1.54133     1.10133    
    0.656667        -0.054      1.74133     0.601333       
    1.85667     0.746       2.94133     1.00133    
    1.85667     -0.454      3.14133     1.10133    
    0.156667        -0.854      1.24133     0.301333       
    1.05667     0.146       1.94133     1.10133    
    -0.243333       -0.254      1.14133     0.801333       
    1.85667     -0.254      2.94133     0.801333       
    0.456667        -0.354      1.14133     0.601333       
    0.856667        0.246       1.94133     0.901333       
    1.35667     0.146       2.24133     0.601333       
    0.356667        -0.254      1.04133     0.601333       
    0.256667        -0.054      1.14133     0.601333       
    0.556667        -0.254      1.84133     0.901333       
    1.35667     -0.054      2.04133     0.401333       
    1.55667     -0.254      2.34133     0.701333       
    2.05667     0.746       2.64133     0.801333       
    0.556667        -0.254      1.84133     1.00133    
    0.456667        -0.254      1.34133     0.301333       
    0.256667        -0.454      1.84133     0.201333       
    1.85667     -0.054      2.34133     1.10133    
    0.456667        0.346       1.84133     1.20133    
    0.556667        0.046       1.74133     0.601333       
    0.156667        -0.054      1.04133     0.601333       
    1.05667     0.046       1.64133     0.901333       
    0.856667        0.046       1.84133     1.20133    
    1.05667     0.046       1.34133     1.10133    
    -0.0433333      -0.354      1.34133     0.701333       
    0.956667        0.146       2.14133     1.10133    
    0.856667        0.246       1.94133     1.30133    
    0.856667        -0.054      1.44133     1.10133    
    0.456667        -0.554      1.24133     0.701333       
    0.656667        -0.054      1.44133     0.801333       
    0.356667        0.346       1.64133     1.10133    
    0.0566667       -0.054      1.34133     0.601333       

    2.计算B的协方差矩阵C:

    
    
    查阅matlab help;cov(A)即可:
    0.685694        -0.0392685      1.27368     0.516904       
    -0.0392685      0.188004        -0.321713       -0.117981      
    1.27368     -0.321713       3.11318     1.29639    
    0.516904        -0.117981       1.29639     0.582414   

    3.计算协方差矩阵C的特征值和特征向量。

    查阅matlab help可以知道,利用eig函数可以快速求解矩阵的特征值与特征向量。

    格式:[V,D] = eig(A)

    说明:其中D为特征值构成的对角阵,每个特征值对应于V矩阵中列向量(也正是其特征向量),如果只有一个返回变量,则得到该矩阵特征值构成的列向量。


    C=V*S*V-1 S= 4.2248414     0       0       0 0          0.24224437  0        0 0          0       0.078524387 0 0          0       0        0.023681839 V= 0.36158919   0.65654382   -0.58100304   0.3172364 -0.082268924    0.72970845    0.596429220    -0.3240827 0.85657212  -0.17576972 0.  072535217    -0.47971643 0.35884438    -0.074704743    0.54904125    0.75113489
    4.选取大的特征值对应的特征向量,得到新的数据集。
    特征值是由大到小排列的,前两个特征值的和已经超过了所有特征值之和的97%。我们取前两个特征值对应的特征向量,得到一个4×2的矩阵M。令A'150×2=A150×4M4×2,这样我们就把150×4的数据A集映射成了150×2的数据集A',特征由4个减到了2个。
    A'= 
    2.8271335      5.6413345     
    2.7959501      5.1451715     
    2.6215213      5.1773814     
    2.7649037      5.0036022     
    2.7827477      5.648651      
    3.2314432      6.0625092     
    2.6904502      5.2326213     
    2.8848587      5.4851323     
    2.6233824      4.7439288     
    2.837496       5.2080359     
    3.0048137      5.9666624     
    2.898198       5.3362466     
    2.7239067      5.0869876     
    2.2861405      4.8114466     
    2.867797       6.5009233     
    3.127471       6.6594805     
    2.8888143      6.132817      
    2.8630179      5.633864      
    3.3122624      6.1939719     
    2.9239945      5.8351996     
    3.2008088      5.7125959     
    2.9681058      5.7547583     
    2.2954831      5.4563413     
    3.2082122      5.4202505     
    3.1551697      5.2835156     
    3.0034234      5.1756719     
    3.0422848      5.4526144     
    2.9489496      5.6894119     
    2.8715193      5.634018      
    2.8784929      5.1246505     
    2.9228787      5.117334      
    3.1012632      5.7328089     
    2.8637038      6.1347075     
    2.9141809      6.4147479     
    2.837496       5.2080359     
    2.6443408      5.3919215     
    2.8861119      5.921529      
    2.837496       5.2080359     
    2.5294983      4.8344766     
    2.9210176      5.5507867     
    2.7412018      5.5857866     
    2.6591299      4.3818646     
    2.5130445      4.9804183     
    3.1058267      5.5106443     
    3.3025077      5.7574212     
    2.7956756      5.0720467     
    2.9737672      5.8250931     
    2.6710196      5.0941501     
    2.9686547      5.901008      
    2.8074283      5.4297384     
    6.7961349      6.0001695     
    6.4437514      5.6339266     
    6.9754017      5.8189198     
    5.6923082      4.4891254     
    6.5984751      5.3901207     
    6.1517776      4.8974035     
    6.6065644      5.5986187     
    4.759874       4.3136202     
    6.5546382      5.5436868     
    5.5011511      4.5941521     
    5.0002549      4.0522372     
    6.0224389      5.2124439     
    5.7736764      4.7668379     
    6.4953853      5.1903675     
    5.3364769      5.0629127     
    6.4389134      5.7829664     
    6.1709338      4.9627499     
    5.7458813      4.9828064     
    6.4537025      4.7729094     
    5.5545872      4.7332394     
    6.6275817      5.2305124     
    5.8681272      5.2479059     
    6.8078095      4.9871684     
    6.4318433      5.1323376     
    6.2253487      5.465109      
    6.4109813      5.6443412     
    6.8423818      5.5594003     
    7.0687368      5.5821223     
    6.3237964      5.1523966     
    5.204006       4.949643      
    5.440998       4.6121911     
    5.3194564      4.6372386     
    5.6463357      5.0030194     
    6.8900779      4.8935226     
    6.098616       4.8314411     
    6.3185463      5.5097803     
    6.7317694      5.722765      
    6.3242084      4.9440526     
    5.7565361      5.0479987     
    5.6758544      4.6350671     
    5.9743719      4.6452005     
    6.4015012      5.2809153     
    5.7402198      4.9124716     
    4.8042598      4.3063037     
    5.866874       4.8115092     
    5.8424678      5.1035466     
    5.8865791      5.0231053     
    6.1530309      5.3338002     
    4.6028777      4.5631602     
    5.8091488      4.9677114     
    8.0430681      5.3028838     
    6.9254133      4.7398024     
    8.1278252      5.6566652     
    7.4821558      5.1336016     
    7.8610989      5.2728454     
    8.9082203      5.8618983     
    6.0307247      4.123374      
    8.4433454      5.6671066     
    7.8310134      5.0691818     
    8.4294749      6.0951088     
    7.1732758      5.5567668     
    7.3136813      5.0985747     
    7.6767196      5.5300099     
    6.8559354      4.5383128     
    7.0966086      4.7754209     
    7.4160846      5.4335471     
    7.4605895      5.3554582     
    9.0001057      6.486272      
    9.3060273      5.5679974     
    6.8096707      4.5537158     
    7.939508       5.6915111     
    6.7094386      4.7091479     
    9.0106057      5.7715045     
    6.8990091      5.1106987     
    7.7871944      5.6481141     
    8.1255342      5.8730957     
    6.7689661      5.1355922     
    6.8020106      5.1983025     
    7.6341949      5.1038737     
    7.8989047      5.7772489     
    8.3523013      5.6874736     
    8.743683       6.6852526     
    7.6700793      5.0964032     
    6.9544433      5.170927      
    7.2909809      4.8132622     
    8.587862       6.0004966     
    7.6563279      5.453633      
    7.4162037      5.3627746     
    6.6801944      5.1502251     
    7.6189944      5.6862121     
    7.8256443      5.497338      
    7.4337916      5.7240021     
    6.9254133      4.7398024     
    8.0746635      5.5907028     
    7.9307322      5.6182322     
    7.4553579      5.5021455     
    7.0370045      4.9397096     
    7.2753867      5.3932482     
    7.4129702      5.430603      
    6.9010071      5.0318398

    每个样本正好是二维的,画在平面坐标系中如图:

    鹫尾花数据集共分为3类花(前50个样本为一类,中间50个样本为一类,后50个样本为一类),从上图可以看到把数据集映射到2维后分类会更容易进行,直观上看已经是线性可分的了,下面我们用自组织映射网络对其进行聚类。

    当然我们已知了有3类,所以在设计SOFM网络时,我把竞争层节点数设为3,此时的聚类结果是前50个样本聚为一类,后100个样本聚为一类。当把竞争层节点数改为4时,仅第2类中的3个样本被误分到了第3类中,整体精度达98%!

    #include<iostream>
    #include<fstream>
    #include<set>
    #include<cstdlib>
    #include<vector>
    #include<cmath>
    #include<ctime>
      
    using namespace std;
      
    const int sample_num=150;      //鹫尾花样本个数
    const int class_num=4;      //指定聚类的数目
    int iteration_ceil;      //迭代的上限
    vector<pair<double,double> > flowers(sample_num);      //样本数据
    vector<vector<double> > weight(class_num);   //权向量
    const double prime_eta=0.7;     //初始学习率
      
    /*向量模长归一化*/
    void normalize(vector<double> &vec){
        double sum=0.0;
        for(int i=0;i<vec.size();++i)
            sum+=pow(vec[i],2);
        sum=sqrt(sum);
        for(int i=0;i<vec.size();++i)
            vec[i]/=sum;
    }
     
    /*从文件读入鹫尾花样本数据*/
    void init_sample(string filename){
        ifstream ifs(filename.c_str());
        if(!ifs){
            cerr<<"open data file failed."<<endl;
            exit(1);
        }
        for(int i=0;i<sample_num;++i){
            vector<double> X(2);
            ifs>>X[0]>>X[1];
            normalize(X);       //输入向量模长归一化
            flowers[i]=make_pair(X[0],X[1]);
        }
        ifs.close();
    }
     
    /*初始化权值*/
    void init_weight(){
        srand(time(0));
        for(int i=0;i<weight.size();++i){
            vector<double> ele(2);
            ele[0]=rand()/(double)RAND_MAX;
            ele[1]=rand()/(double)RAND_MAX;
            normalize(ele);     //权值向量模长归一化
            weight[i]=ele;
        }
    }
     
    /*根据输入,选择获胜者*/
    int pick_winner(double x1,double x2){
        int rect=-1;
        double max=0.0;
        for(int i=0;i<weight.size();++i){
            double product=x1*weight[i][0]+x2*weight[i][1];
            if(product>max){
                max=product;
                rect=i;
            }
        }
        return rect;
    }
      
    int main(int argc,char *argv[]){
        cout<<"input iteration count"<<endl;
        int count;      //每个样本迭代的次数
        cin>>count;
        cout<<"input data file name"<<endl;
        string filename;
        cin>>filename;
        iteration_ceil=count*sample_num;
        init_sample(filename);
        init_weight();
          
        double eta=prime_eta;
        double gradient1=-1*9*prime_eta/iteration_ceil;
        double gradient2=-1*prime_eta/(9*iteration_ceil);
        double b1=prime_eta;
        double b2=prime_eta/9;
        for(int iteration=0;iteration<iteration_ceil;++iteration){
            int flower_index=iteration%sample_num;
            double x1=flowers[flower_index].first;
            double x2=flowers[flower_index].second;
            int winner=pick_winner(x1,x2);
            /*更改获胜者的权值*/
            weight[winner][0]+=eta*(x1-weight[winner][0]);
            weight[winner][1]+=eta*(x2-weight[winner][1]);
            /*权向量归一化*/
            for(int i=0;i<weight.size();++i){
                vector<double> W(2);
                W[0]=weight[i][0];
                W[1]=weight[i][1];
                normalize(W);
                weight[i][0]=W[0];
                weight[i][1]=W[1];
            }
            /*更新学习率*/
            if(iteration<0.1*iteration_ceil){   //在前10%的迭代中,学习率线性下降到原来的10%
                eta=gradient1*iteration+b1;
            }
            else{       //后90%的迭代中线性降低到0
                eta=gradient2*iteration+b2;
            }
        }
      
        for(int i=0;i<sample_num;++i){
            double x1=flowers[i].first;
            double x2=flowers[i].second;
            int winner=pick_winner(x1,x2);
            cout<<i+1<<"	"<<winner+1<<endl;
        }
        return 0;
    }

    输出聚类结果:

    1       2
    2       2
    3       2
    4       2
    5       2
    6       2
    7       2
    8       2
    9       2
    10      2
    11      2
    12      2
    13      2
    14      2
    15      2
    16      2
    17      2
    18      2
    19      2
    20      2
    21      2
    22      2
    23      2
    24      2
    25      2
    26      2
    27      2
    28      2
    29      2
    30      2
    31      2
    32      2
    33      2
    34      2
    35      2
    36      2
    37      2
    38      2
    39      2
    40      2
    41      2
    42      2
    43      2
    44      2
    45      2
    46      2
    47      2
    48      2
    49      2
    50      2
    51      4
    52      4
    53      4
    54      4
    55      4
    56      4
    57      4
    58      4
    59      4
    60      4
    61      4
    62      4
    63      4
    64      4
    65      4
    66      4
    67      4
    68      4
    69      1
    70      4
    71      4
    72      4
    73      1
    74      4
    75      4
    76      4
    77      4
    78      4
    79      4
    80      4
    81      4
    82      4
    83      4
    84      1
    85      4
    86      4
    87      4
    88      4
    89      4
    90      4
    91      4
    92      4
    93      4
    94      4
    95      4
    96      4
    97      4
    98      4
    99      4
    100     4
    101     1
    102     1
    103     1
    104     1
    105     1
    106     1
    107     1
    108     1
    109     1
    110     1
    111     1
    112     1
    113     1
    114     1
    115     1
    116     1
    117     1
    118     1
    119     1
    120     1
    121     1
    122     1
    123     1
    124     1
    125     1
    126     1
    127     1
    128     1
    129     1
    130     1
    131     1
    132     1
    133     1
    134     1
    135     1
    136     1
    137     1
    138     1
    139     1
    140     1
    141     1
    142     1
    143     1
    144     1
    145     1
    146     1
    147     1
    148     1
    149     1
    150     1

    参考:http://www.cnblogs.com/zhangchaoyang/articles/2222048.html

     

  • 相关阅读:
    PHP面试题(二)
    机房的带外管理---远程管理你的开发测试机
    《Qt编程的艺术》——8.2.1 在Designer中使用View类
    一步一步学android之事件篇——单击事件
    OC类方法和实例方法 及常用的for/in方法
    终止imp/exp和expdp/impdp进程运行的方法
    java MessageFormat 应用 和 疑惑
    菜鸟成长日记之新手备忘录-IOS开发第一个项目总结
    视频监控之VSCloud版本计划
    ural 1136. Parliament
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/5702843.html
Copyright © 2011-2022 走看看