ML: 降维算法-LE

        PCA的降维原则是最小化投影损失,或者是最大化保留投影后数据的方差。LDA降维需要知道降维前数据分别属于哪一类,而且还要知道数据完整的高维信息。拉普拉斯特征映射 (Laplacian Eigenmaps,LE)看问题的角度和LLE十分相似。它们都用图的角度去构建数据之间的关系。图中的每个顶点代表一个数据,每一条边权重代表数据之间的相似程度,越相似则权值越大。并且它们还都假设数据具有局部结构性质。LE假设每一点只与它距离最近的一些点相似,再远一些的数据相似程度为0,降维后相近的点尽可能保持相近。而LLE假设每一个点都能通过周围邻域数据的线性组合来描述,并且降维后这一线性关系尽可能保持不变。

      LE的基本思想就是用一个无向有权图来描述一个流形,然后通过用图的嵌入(graph embedding)来找低维表示。说白了,就是保持图的局部邻接关系的情况下把这个图从高维空间中重新画在一个低维空间中(graph drawing)。就算法而言,就是那三步:构建图、选择权、特征映射。

      如: 对 N 个维度为 m 的样本,希望可以把它们降到 k 维(k<m)。不过首先我们要把样本们转化成一张图。一般来说有两种思路可以完成这一步:

  • 1. 对于每个顶点,找到距离它最近的 k 个邻居, 每个邻居用下面这个高斯函数计算边的权重;
  • 2. 以每个顶点为中心画一个半径为 R 的球, 所有在这个球里面的点都是邻居,用下面这个高斯函数计算一下权重

       

    有了一个 graph,然后就可以用 Laplacian 三板斧了: 1. 计算 L; 2. 把 L 做SVD分解; 3. 找 出 top k+1 最小的 eigenvalue, 去掉为 0 的那个, 就能得到对应的 k 个维度为 1*N 的向量, 变成 N 个 k*1 的向量就是降维之后的点。

    LE算法的数据推理参见; 

 dimRed


    参考资料:https://cran.r-project.org/web/packages/dimRed/dimRed.pdf

    Slots

  • fun: A function that does the embedding and returns a dimRedResult object.
  • stdpars:The standard parameters for the function

    需求安装的软件包

install.packages("loe")install.packages("RSpectra")install.packages("dimRed")

  构建对象及结构示例代码:

> library(dimRed)
> library(loe)
> library(RSpectra)
> 
> #构建dimRedResult 对象
> dm <- dimRedData(data = iris[, 1:4], meta = iris[, 5])
> leim <- LaplacianEigenmaps()
> str(leim)
Formal class 'LaplacianEigenmaps' [package "dimRed"] with 2 slots
  ..@ fun    :function (data, pars, keep.org.data = TRUE)  
  ..@ stdpars:List of 6
  .. ..$ ndim  : num 2
  .. ..$ sparse: chr "knn"
  .. ..$ knn   : num 50
  .. ..$ eps   : num 0.1
  .. ..$ t     : num Inf
  .. ..$ norm  : logi TRUE

 参数说明:

  • ndim: 输出维度数
  • sparse:字符串向量, "knn", "eps"
  • knn: knn 近邻个数
  • eps:球半径
  • t:Parameter for the transformation of the distance matrix by w=exp(-d^2/t), larger values give less weight to differences in distance, t == Inf treats all distances != 0 equally

计算及结果示例代码

> emb <- leim@fun(dm,leim@stdpars)
2017-08-18 18:50:25: Creating weight matrix
2017-08-18 18:50:25: Eigenvalue decomposition
Eigenvalues: 3.838199e-01 3.691626e-02 9.011414e-17
2017-08-18 18:50:25: DONE
> str(emb)
Formal class 'dimRedResult' [package "dimRed"] with 9 slots
  ..@ data        :Formal class 'dimRedData' [package "dimRed"] with 2 slots
  .. .. ..@ data: num [1:150, 1:2] -0.104 -0.116 -0.114 -0.117 -0.106 ...
  .. .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. .. ..$ : NULL
  .. .. .. .. ..$ : chr [1:2] "LEIM1" "LEIM2"
  .. .. ..@ meta:'data.frame':    150 obs. of  1 variable:
  .. .. .. ..$ meta: Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..@ org.data    : num [1:150, 1:4] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : NULL
  .. .. ..$ : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
  ..@ apply       :function (x)  
  ..@ inverse     :function (x)  
  ..@ has.org.data: logi TRUE
  ..@ has.apply   : logi FALSE
  ..@ has.inverse : logi FALSE
  ..@ method      : chr "leim"
  ..@ pars        :List of 7
  .. ..$ ndim  : num 2
  .. ..$ sparse: chr "knn"
  .. ..$ knn   : num 50
  .. ..$ eps   : num 0.1
  .. ..$ t     : num Inf
  .. ..$ norm  : logi TRUE
  .. ..$ d     :function (x, method = "euclidean", diag = FALSE, upper = FALSE, p = 2)  
> head(emb@data@data)
          LEIM1        LEIM2
[1,] -0.1038285 -0.012537113
[2,] -0.1158002 -0.016098949
[3,] -0.1140282 -0.014946421
[4,] -0.1168551 -0.006973706
[5,] -0.1057686 -0.012734742
[6,] -0.1298387 -0.017395325

 图例: plot(emb,type="parpl")

LDA计算分类结果  

> library(MASS)
> newSet <- cbind(iris,emb@data@data)
>  model1=lda(Species~LEIM1+LEIM2,data=newSet)
>  table(iris$Species,predict(model1)$class)
            
             setosa versicolor virginica
  setosa         50          0         0
  versicolor      1         42         7
  virginica       0          6        44
原文地址:https://www.cnblogs.com/tgzhu/p/7390746.html