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

来源:互联网 发布:windows 驱动 路径 编辑:程序博客网 时间:2024/04/30 06:55

一.概念

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_components        self.dissimilarity = dissimilarity        self.metric = metric        self.n_init = n_init        self.max_iter = max_iter        self.eps = eps        self.verbose = verbose        self.n_jobs = n_jobs        self.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_neighbors        self.n_components = n_components        self.eigen_solver = eigen_solver        self.tol = tol        self.max_iter = max_iter        self.path_method = path_method        self.neighbors_algorithm = neighbors_algorithm        self.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=data    for 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=data    Neighbors=[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










原创粉丝点击