继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

人工智障学习笔记——机器学习(14)mds&isomap降维

九日王朝
关注TA
已关注
手记 180
粉丝 42
获赞 185

一.概念

MDS(多维缩放)降维是一组对象之间的距离的可视化表示,也可以当做一种无监督降维算法使用。而Isomap(等度量映射)是在MDS算法的基础上衍生出的一种非迭代的全局优化算法,它是一种等距映射算法,也就是说降维后的点,两两之间距离不变,这个距离是测地距离。


二.算法

MDS算法的思想其实是巧妙的,即通过利用对点(数据)做平移,旋转,翻转等操作,点的距离是不变的这一特性来对原始数据进行操作。

算法步骤:
1.依据公式计算di,.^2,dj,.^2,d.,.^2
2.依据公式计算降维后空间的内积矩阵B
3.对矩阵B进行特征值分解
4.依据求得的对角矩阵和特征向量矩阵,依据公式计算Z

再说isomap,MDS算法是保持降维后的样本间距离不变,Isomap算法引进了邻域图,样本只与其相邻的样本连接,他们之间的距离可直接计算,较远的点可通过最小路径算出距离,在此基础上进行降维保距。

算法步骤:
1.对每个样本点x,计算它的k近邻;同时将x与它的k近邻的距离设置为欧氏距离,与其他点的距离设置为无穷大
2.调用最短路径算法计算任意两个样本点之间的距离,获得距离矩阵D
3.调用多维缩放MDS算法,获得样本集在低维空间中的矩阵Z


三.sklearn提供的API

sklearn的manifold提供了MDS方法以及Isomap方法

MD5:


def __init__(self, n_components=2, metric=True, n_init=4,                 max_iter=300, verbose=0, eps=1e-3, n_jobs=1,                 random_state=None, dissimilarity="euclidean"):self.n_components = n_componentsself.dissimilarity = dissimilarityself.metric = metricself.n_init = n_initself.max_iter = max_iterself.eps = epsself.verbose = verboseself.n_jobs = n_jobsself.random_state = random_state


Isomap:



def __init__(self, n_neighbors=5, n_components=2, eigen_solver='auto',                 tol=0, max_iter=None, path_method='auto',                 neighbors_algorithm='auto', n_jobs=1):self.n_neighbors = n_neighborsself.n_components = n_componentsself.eigen_solver = eigen_solverself.tol = tolself.max_iter = max_iterself.path_method = path_methodself.neighbors_algorithm = neighbors_algorithmself.n_jobs = n_jobs



参数与LLE类似,Isomap一样可以引入n_neighbors近邻数参数


实例代码:

还是以LLE的瑞士卷为例:


https://img3.mukewang.com/5b4cacc10001e06a05160455.jpg


import numpy as npimport operatorimport matplotlib.pyplot as pltfrom sklearn import datasets,decomposition,manifoldfrom itertools import cyclefrom mpl_toolkits.mplot3d import Axes3Ddef load_data():swiss_roll =datasets.make_swiss_roll(n_samples=1000)return swiss_roll[0],np.floor(swiss_roll[1])def isomap_components(*data):X,Y=datafor n in [3,2,1]:mds=manifold.MDS(n_components=n)mds.fit(X)isomap=manifold.Isomap(n_components=n)isomap.fit(X)print("n = %d 重建误差:"%n,isomap.reconstruction_error()," 距离误差:",mds.stress_)def isomap_neighbors(*data):X,Y=dataNeighbors=[1,3,5,10,25,50,100,Y.size-1]fig=plt.figure("isomap",figsize=(9, 9))for i in range(1):mds=manifold.MDS(n_components=2)X_r=mds.fit_transform(X)ax=fig.add_subplot(3,3,1)ax.scatter(X_r[:,0],X_r[:,1],marker='o',c=Y,alpha=0.5)ax.set_title("mds")plt.xticks(fontsize=10, color="darkorange")plt.yticks(fontsize=10, color="darkorange")for i,k in enumerate(Neighbors):isomap=manifold.Isomap(n_components=2,n_neighbors=k)X_r=isomap.fit_transform(X)ax=fig.add_subplot(3,3,i+2)ax.scatter(X_r[:,0],X_r[:,1],marker='o',c=Y,alpha=0.5)ax.set_title("k = %d"%k)plt.xticks(fontsize=10, color="darkorange")plt.yticks(fontsize=10, color="darkorange")plt.suptitle("isomap")plt.show()X,Y=load_data()fig = plt.figure('data')ax = Axes3D(fig)ax.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o',c=Y)isomap_components(X,Y)isomap_neighbors(X,Y)




https://img.mukewang.com/5b4cacc90001651506590385.jpg


https://img4.mukewang.com/5b4cacd00001ed8e04360486.jpg


四.总结

MDS和Isomap都是保留全局特征的非线性数据降维算法,且出发点都是基于距离保持。不同的是MDS是基于欧式距离,Isomap则是测地线距离。Isomap新样本难以将其映射到低维空间中,因此需要训练一个回归学习器来对新样本的低维空间进行预测。此外,建立近邻图时,要控制好距离的阈值,防止短路和断路。
Isomap&LLE:如果是简单规范的低维流型,两者降维效果均可以接受的情况下适合用LLE,因为在运算效率上,Isomap要逊色于LLE,毕竟LLE是局部特征,但对于流型较为复杂的情况,LLE的降维效果就不如Isomap了,因为Isomap从全局出发使得其能更好的处理低维流形复杂的数据。


五.相关学习资源

http://blog.csdn.net/u014593570/article/details/78458985?locationNum=4&fps=1

http://blog.csdn.net/Dark_Scope/article/details/53229427



打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP