在pyhton的机器学习库sklearn中,LLE等降维算法可以直接调用,在本次大作业中,根据LLE的推导过程编写算法实现了LLE,与mainfold自带的LLE进行对比。由于后面的实验中都是直接调用LocallyLinearEmbedding,所以用大量篇幅介绍了LocallyLinearEmbedding的参数含义以及调参方法。
图2-5 LLE算法推导实现与sklearn实现对比
由图2-5可知,自行编写的LLE降维算法在降维之后的效果略逊于sklearn中提供的接口,后面的实验中都是直接调用LocallyLinearEmbedding再调参,以下给出自行实现LLE算法的步骤以及LocallyLinearEmbedding参数意义。
My_LLE算法流程:
step1:利用KNN找到每个数据最近的K个近邻点
step2:求出权重系数W
step3:得到M
step4:返回最小的d’个特征值所对应发的特征向量
sklearn调用参数含义:
Mainfold.LocallyLinearEmbedding(n_neighbors,n_components,method)[4][11]
LLE算法LocallyLinearEmbedding使用起来并不复杂,一般来说,需要调参的参数只有样本近邻的个数即n_neighbors的值。
- n_neighbors:即k近邻算法时选取的最近邻个数,默认是5。 n_neighbors个数越大,则建立样本局部关系的时间会越大,也就意味着算法的复杂度会增加。当然n_neighbors个数越大,则降维后样本的局部关系会保持的更好。如果算法的运行时间可以接受,我们可以采用一个比较大的n_neighbors。但是n_neighbors取值太大,不同颜色的数据开始相互重叠,说明选取的近邻个数太多则不能反映数据的流形信息。n_neighbors参数变化对降维的影响如图2-6所示。
- n_components:即我们降维到的维数。可视化数据一般可以选择2-5维。
- method:即LLE的具体算法。LocallyLinearEmbedding支持4种LLE算法,分别是'standard'对应我们标准的LLE算法,'hessian'对应HLLE算法,'modified'对应MLLE算法,‘ltsa’对应LTSA算法。默认是'standard'。
- neighbors_algorithm:这个是k近邻的搜索方法,和KNN算法的使用的搜索方法一样。对于这个参数,一共有4种可选输入,‘brute’对应第一种蛮力实现,‘kd_tree’对应第二种KD树实现,‘ball_tree’对应第三种的球树实现,‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。
图2-6.LLE降维在不同k值的二维分布结果。n_neighbors=k
可以看出,当k取值较小(k=1、2、3、4)时,因为当近邻个数太少时,难以很好地反映数据的拓扑关系,LLE算法不能将数据很好地映射到低维空间,当k值取值适合,比如k=15,可见不同颜色的数据能很好地被分开并保持适合的间距。但若k取值太大,如k=100,999,不同颜色的数据开始相互重叠,说明选取的近邻个数太多则不能反映数据的流形信息。