用scikit-learn研究局部线性嵌入(LLE)

1. scikit-learn流形学习库概述

    在scikit-learn中,流形学习库在sklearn.manifold包中。里面实现的流形学习算法有:

    1)多维尺度变换MDS算法:这个对应的类是MDS。MDS算法希望在降维时在高维里样本之间的欧式距离关系在低维可以得到保留。由于降维时它需要考虑了样本的全局欧式距离关系,因此降维计算量很大,现在一般较少使用了。

    2)等距映射ISOMAP算法:这个对应的类是Isomap。 ISOMAP算法使用了样本间的测地距离来代替欧式距离,此外基本和MDS算法相同。由于降维时它仍然需要考虑了样本的全局测地距离关系,因此降维计算量很大。

    3)局部线性嵌入LLE算法:这个对应的类是LocallyLinearEmbedding。这个就是我们LLE原理篇里面的算法、除了包含我们原理篇里讲到的标准的LLE实现以外,它还支持改进版的LLE算法,包括MLLE,HLLE和LTSA。这三个算法我们在原理篇的第五节有介绍。后面我们会详细讲这个类的参数使用。

    4)拉普拉斯特征映射LE算法:这个对应的类是SpectralEmbedding。这个算法使用了图论的方法,用样本构成的无向图对应的拉普拉斯矩阵作特征分解来降维。具体方法和我们在谱聚类(spectral clustering)原理总结里面讲到的基本相同。

    5)t-distributed Stochastic Neighbor Embedding(t-SNE)算法:这个对应的类是TSNE。这个是一个比较新的降维方法。t-SNE希望样本间的在高维对应的高斯核函数相似度在低维可以得到保留,即低维和高维有尽量一样的相似度矩阵。

    这些算法基本原理很类似,都基于流形降维后保持样本之间的某一个特定的关系而产生。下面我们重点讲述LLE算法的使用,即LocallyLinearEmbedding的使用。

2. LLE算法类库使用介绍

    LLE算法类LocallyLinearEmbedding使用起来并不复杂,一般来说,需要调参的参数只有样本近邻的个数。下面我们对LocallyLinearEmbedding的主要参数做一个介绍。

    1)n_neighbors:即我们搜索样本的近邻的个数,默认是5。 n_neighbors个数越大,则建立样本局部关系的时间会越大,也就意味着算法的复杂度会增加。当然n_neighbors个数越大,则降维后样本的局部关系会保持的更好。在下一节我们可以通过具体的例子看出这一点。一般来说,如果算法运行时间可以接受,我们可以尽量选择一个比较大一些的n_neighbors。

    2)n_components:即我们降维到的维数。如果我们降维的目的是可视化,则一般可以选择2-5维。

    3) reg :正则化系数,在n_neighbors大于n_components时,即近邻数大于降维的维数时,由于我们的样本权重矩阵不是满秩的,LLE通过正则化来解决这个问题。默认是0.001。一般不用管这个参数。当近邻数远远的大于降维到的维数时可以考虑适当增大这个参数。

    4)eigen_solver:特征分解的方法。有‘arpack’和‘dense’两者算法选择。当然也可以选择'auto'让scikit-learn自己选择一个合适的算法。‘arpack’和‘dense’的主要区别是‘dense’一般适合于非稀疏的矩阵分解。而‘arpack’虽然可以适应稀疏和非稀疏的矩阵分解,但在稀疏矩阵分解时会有更好算法速度。当然由于它使用一些随机思想,所以它的解可能不稳定,一般需要多选几组随机种子来尝试。

    5)method: 即LLE的具体算法。LocallyLinearEmbedding支持4种LLE算法,分别是'standard'对应我们标准的LLE算法,'hessian'对应原理篇讲到的HLLE算法,'modified'对应原理篇讲到的MLLE算法,‘ltsa’对应原理篇讲到的LTSA算法。默认是'standard'。一般来说HLLE/MLLE/LTSA算法在同样的近邻数n_neighbors情况下,运行时间会比标准的LLE长,当然降维的效果会稍微好一些。如果你对降维后的数据局部效果很在意,那么可以考虑使用HLLE/MLLE/LTSA或者增大n_neighbors,否则标准的LLE就可以了。需要注意的是使用MLLE要求n_neighbors > n_components,而使用HLLE要求n_neighbors > n_components * (n_components + 3) / 2

    6)neighbors_algorithm:这个是k近邻的搜索方法,和KNN算法的使用的搜索方法一样。算法一共有三种,第一种是蛮力实现,第二种是KD树实现,第三种是球树实现。这三种方法在K近邻法(KNN)原理小结中都有讲述,如果不熟悉可以去复习下。对于这个参数,一共有4种可选输入,‘brute’对应第一种蛮力实现,‘kd_tree’对应第二种KD树实现,‘ball_tree’对应第三种的球树实现, ‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。需要注意的是,如果输入样本特征是稀疏的时候,无论我们选择哪种算法,最后scikit-learn都会去用蛮力实现‘brute’。个人的经验,如果样本少特征也少,使用默认的 ‘auto’就够了。 如果数据量很大或者特征也很多,用"auto"建树时间会很长,效率不高,建议选择KD树实现‘kd_tree’,此时如果发现‘kd_tree’速度比较慢或者已经知道样本分布不是很均匀时,可以尝试用‘ball_tree’。而如果输入样本是稀疏的,无论你选择哪个算法最后实际运行的都是‘brute’。

3. LLE用于降维可视化实践

    下面我们用一个具体的例子来使用scikit-learn进行LLE降维并可视化。

    首先我们载入需要的类库:

复制代码
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
from sklearn import manifold, datasets
from sklearn.utils import check_random_state
复制代码

    我们接着生成随机数据,由于LLE必须要基于流形不能闭合,因此我们生成了一个缺一个口的三维球体。生成数据并可视化的代码如下:

复制代码
n_samples = 500
random_state = check_random_state(0)
p = random_state.rand(n_samples) * (2 * np.pi - 0.55)
t = random_state.rand(n_samples) * np.pi# 让球体不闭合,符合流形定义
indices = ((t < (np.pi - (np.pi / 8))) & (t > ((np.pi / 8))))
colors = p[indices]
x, y, z = np.sin(t[indices]) * np.cos(p[indices]), \np.sin(t[indices]) * np.sin(p[indices]), \np.cos(t[indices])

fig = plt.figure()
ax = Axes3D(fig, elev=30, azim=-20)
ax.scatter(x, y, z, c=p[indices], marker='o', cmap=plt.cm.rainbow)
复制代码

    我们可以看到原始的数据是这样的:

    现在我们简单的尝试用LLE将其从三维降为2维并可视化,近邻数设为30,用标准的LLE算法。

train_data = np.array([x, y, z]).T
trans_data = manifold.LocallyLinearEmbedding(n_neighbors =30, n_components = 2,method='standard').fit_transform(train_data)
plt.scatter(trans_data[:, 0], trans_data[:, 1], marker='o', c=colors)

    降维到2维后的效果图如下:

    可以看出从三维降到了2维后,我们大概还是可以看出这是一个球体。

    现在我们看看用不同的近邻数时,LLE算法降维的效果图,代码如下:

复制代码
for index, k in enumerate((10,20,30,40)):plt.subplot(2,2,index+1)trans_data = manifold.LocallyLinearEmbedding(n_neighbors = k, n_components = 2,method='standard').fit_transform(train_data)plt.scatter(trans_data[:, 0], trans_data[:, 1], marker='o', c=colors)plt.text(.99, .01, ('LLE: k=%d' % (k)),transform=plt.gca().transAxes, size=10,horizontalalignment='right')
plt.show()
复制代码

    效果图如下:

    现在我们看看还是这些k近邻数,用HLLE的效果。

复制代码
for index, k in enumerate((10,20,30,40)):plt.subplot(2,2,index+1)trans_data = manifold.LocallyLinearEmbedding(n_neighbors = k, n_components = 2,method='hessian').fit_transform(train_data)plt.scatter(trans_data[:, 0], trans_data[:, 1], marker='o', c=colors)plt.text(.99, .01, ('HLLE: k=%d' % (k)),transform=plt.gca().transAxes, size=10,horizontalalignment='right')
plt.show()
复制代码

    输出如下:

    可见在同样的近邻数的时候,HLLE降维后的数据分布特征效果要比LLE更好。

    我们接着看看MLLE和LTSA的效果。由于代码类似,这里就只给出效果图。

    首先是MLLE的效果图:

    接着是LTSA的效果图:

    从上面的一系列图也可以看出,同样的k-近邻数情况下, MLLE,HLLE和LTSA降维的可视化效果更好。同样的算法,k-近邻数越大则降维可视化效果越好。当然,没有免费的午餐,较好的降维可视化效果意味着更多的算法运行时间。


本文转自刘建平Pinard博客园博客,原文链接:http://www.cnblogs.com/pinard/p/6273377.html,如需转载请自行联系原作者


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断字符串中是否为数字的三种方法

//1用JAVA自带的函数 public static boolean isNumeric(String str){for (int i str.length();--i>0;){ if (!Character.isDigit(str.charAt(i))){return false;}}return true;}//2用正则表达式 public static boolean isNumeric(String str){ Pattern pattern Pattern.…

【图像处理】——Python+opencv实现图像的hu不变矩特征提取(含原理、推导过程、应用、代码等)

目录 转载本文请注明详细地址本文介绍了矩和图像矩的含义本文介绍了不变矩的计算、应用本文介绍了如何计算图像相似度一、思维导图 二、普通矩的定义 1、零阶矩 2、二阶矩

MSSQL-to-MySQL v5.3, 从MSSQL迁移到mySQL的最佳工具

将现有的MSSQL数据库迁移到MySQL数据库,尝试了很多种工具 MySQL Workbench / MSSQL to MySQL Export / DB Converter / openDBcopy 都有这样那样的问题。 最后发现就MSSQL-to-MySQL好一点&#xff0c;能够保证所有表和数据成功迁移&#xff0c;并且字段类型都比较正确。 只是对…

C#窗体应用程序崩溃解决方法总结

一、内存不足 内存是最常见的导致程序崩毁的原因&#xff0c;常用解决方式有如下几种。 算法中声明的占内存较大的全局变量或类中声明的私有变量在循环或运行结束后需进行释放&#xff0c;手动设置Dispose()&#xff0c;然后GC.Collect()。对一些重复调用的类避免多次实例化。…

【学习的心得】——“快餐”的效率与“挖掘”的重要性

从事Python图像处理和机器学习方向已经有大半年了&#xff0c;现在作为还是一个研究生的我&#xff0c;大部分时间都是在完成老师给的课题任务&#xff0c;但是这几个月下来我感觉和老师的意见有点分歧了甚至跟一些同学都有所意见分歧了。 Python虽然是最近几年火起来的语言&a…

Unity3D Input按键系统

默认输入轴&#xff1a; Horizontal 和 Vertical被映射到w, a, s, d键和方向键 Fire1, Fire2, Fire3被分别映射到Ctrl&#xff0c;Option&#xff08;Alt&#xff09;和Command键 Mouse X 和 Mouse Y被映射到鼠标移动增量 Window Shake X 和 Window Shake Y 被映射到窗口的移动…

iOS app 企业内部发布及HTTPS服务器配置

转自: http://www.cnblogs.com/cocoajin/p/4082488.html iOS企业内部发布及HTTPS服务器配置 一&#xff1a;所需的条件 1. 苹果开发者证书&#xff0c;企业版 299$ 版本 2. ssl 证书&#xff0c;即https使用的服务器证书 3. web服务器&#xff0c;支持https 4. 一个域名&#x…

Pytorch超简单安装教程

安装Pytorch 1.1 安装Annaconda 安装Pytorch首先需要安装Annaconda&#xff0c;按照教程&#xff0c;安装了Annaconda5.2.0的版本。 路径 记住安装路径即可&#xff0c;其余均选默认。 1.2 安装Pytorch 第一步&#xff0c;打开Anaconda Prompt 。然后输入 conda create -n…

【图像处理】——纹理特征提取方法(LBP局部二值模式和GLCM灰度共生矩阵)

纹理特征提取方法 局部二值模式(LBP) (结构法) Local binary patterns 原理 将像素点的邻域八个像素点与中心像素点值进行比较,大于设为1,小于设为0,这样就会得到一个邻域值为1和0的格子,将这八个值按照一定的规则排列成一个二进制的数字,并且转换为十进制作为中心像…

44. 源代码解读-RocketMQ-架构

1. 前言 1.1 github源代码 https://github.com/apache/rocketmq 1.2 github其他客户端&#xff0c;比如c,php https://github.com/apache/rocketmq-externals 1.3 运行进程 RocketMQ分成两个进程运行 NamesrvBrokerNamesrv&#xff0c;命名服务&#xff0c;主要负责Broker状态管…

jquery检测浏览器类型

使用jquery如下代码检测浏览器版本时&#xff1a;出问题&#xff0c;在检测IE浏览器&#xff0c;如果版本是IE11时&#xff0c;会出现 $.browser.msie的返回值是false&#xff0c;$.browser.mozilla的返回值是true&#xff0c;即把IE11检测成火狐了 结局办法 判断IE浏览器用 …

【leetcode❤python】 9. Palindrome Number

#回文数#Method1&#xff1a;将整数转置和原数比较&#xff0c;一样就是回文数&#xff1b;负数不是回文数#这里反转整数时不需要考虑溢出&#xff0c;但不代表如果是C/C等语言也不需要考虑class Solution(object): def isPalindrome(self, x): """ …

Pytorch基础(一) —— tensorboard的应用

一、简介与安装方法 1.1 概念 Tensorboard 是 TensorFlow 的一个工具包&#xff0c;用于展示网络图、张量的指标变化和分布情况&#xff0c;如权重W、偏置B、卷积层数、全连接层数等参数&#xff0c;使用该工具可以方便观察神经网络训练过程&#xff0c;分析学习模型训练的效…

“RuntimeWarning: overflow encountered in ubyte_scalars像素加减运算溢出异常”原因以及解决办法

转载本文请注明详细地址本文介绍了像素点相加减溢出的原因与解决方法 目录 原因&#xff1a; 解决方法&#xff1a; 原因&#xff1a; 这个问题一般是会出现在图像处理像素的加减中&#xff0c;出现的原因是因为图片的像素一般是八位即最大值是256&#xff0c;最小值是0&…

二叉树重建

一、已知先序遍历和中序遍历。求后序遍历。http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId944 依据先序遍历和中序遍历还原二叉树的主要思想&#xff1a; 1、先序遍历序列的第一个元素必然是根节点&#xff0c;能够由此获取二叉树的根节点。 2、依据根节点&…

asyn4j -- java 异步方法调用框架

asyn4j 是一个java异步方法调用框架&#xff0c;基于消费者与生产者模式。包括了异步方法执行&#xff0c;异步回调执行&#xff0c;异步工作缓存模块.支持Spring. 让我们写异步方法不再写很多的相关多线程代码。用asyn4j轻松搞定异步方法调用.提高程序的响应能力.转载于:https…

Pytorch基础(二)—— Transforms详解

一、概念 Transforms是pytorch的图像处理工具包&#xff0c;是torchvision模块下的一个一个类的集合&#xff0c;可以对图像或数据进行格式变换&#xff0c;裁剪&#xff0c;缩放&#xff0c;旋转等&#xff0c;在进行深度学习项目时用途很广泛。下面对Transforms内的常见类的…

图像基本处理算法的简单实现(二)

图像基本处理算法的简单实现&#xff08;一&#xff09; 图像基本处理算法的简单实现&#xff08;二&#xff09; 4&#xff09;膨胀腐蚀 属于什么心态学&#xff0c;膨胀、腐蚀、击中/击不中变换、细化…&#xff08;又晕了T^T&#xff09;。简单点好像就是集合运算&#xff0…

【WIN10】WIN2D——基本圖形的繪製

DEMO下載地址&#xff1a;http://yunpan.cn/c3iNuHFFAcr8h &#xff08;提取码&#xff1a;8e48&#xff09; 先看一個截圖&#xff1a; 繪製了一些基本形狀。 DEMO的繪製代碼都非常簡單&#xff0c;不想在博客裡細說了&#xff0c;看代碼更為清晰些。 可能繪製扇形的代碼有些麻…