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

一.概念

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 np
import operator
import matplotlib.pyplot as plt
from sklearn import datasets,decomposition,manifold
from itertools import cycle
from mpl_toolkits.mplot3d import Axes3D
def 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










猜你喜欢

转载自blog.csdn.net/sm9sun/article/details/78835456