一.概念
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的瑞士卷为例:
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)
四.总结
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
共同学习,写下你的评论
评论加载中...
作者其他优质文章