等度量映射(Isometric Mapping,简称Isomap)
1 绪论
在MDS中已经说明了为何要进行降维。而进行降维的一般有两类方法:特征选择和特征提取。
- 特征选择:根据一定的标准学则显著特征
- 特征提取:通过对所有特征进行变换来获取精简的特征集
对于降维方法中,经典的线性方法(例如主成分分析,PCA)存在一些不足,即无法发现螺旋的一维结构。Isomap就是处理此类问题的一种经典的非线性学习方法。
2 等度量映射
等度量映射(Isometric Mapping,Isomap)的基本观点同MDS较为类似,即从高维数据中找到任意两个样本点之间的“测地距离”,通过映射实现在低维空间中“测地距离”近似保持不变。
与MDS不同的是,MDS计算的是欧氏距离,而Isomap计算的是“测地距离”。
如上图,“测地距离”即A中沿曲实线的两点之间的距离,欧氏距离即如A中虚直线的两点之间的直线距离。B图即A的近邻图,C图即B图的低维映射结果,C图中红线为它的“测地距离”而蓝线则为欧氏距离。
很明显,Isomap中计算“测地距离”是非常重要的一步。如何计算“测地距离”呢?
我们可以利用流形在局部上与欧氏空间同胚这个性质,对每个点基于欧氏距离找出近邻点,然后建立一个近邻图。于是计算两点之间测地距离的问题就变成了计算近邻图上两点之间的最短路径问题。而计算最短路径可以使用Dijkstra算法或Floyd算法。得到任意两点的距离之后就可以通过MDS算法来获得样本点在低维空间中的坐标。
3 Isomap伪码说明
4 以瑞士卷例子来展示Isomap算法
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d as p3d
from sklearn import datasets, manifold
from sklearn.datasets import make_swiss_roll
def test_swiss_roll(n_samples=5000):
X, t = make_swiss_roll(n_samples=n_samples, noise=0.2, random_state=42) # X为坐标 t为颜色
# figure1=plt.figure()
axes = [-11.5, 14, -2, 23, -12, 15]
fig = plt.figure()
ax = fig.add_subplot(121, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=t, cmap=plt.cm.hot)
ax.view_init(10, 60)
ax.set_xlabel("$x$", fontsize=18)
ax.set_ylabel("$y$", fontsize=18)
ax.set_zlabel("$z$", fontsize=18)
ax.set_xlim(axes[0:2])
ax.set_ylim(axes[2:4])
ax.set_zlim(axes[4:6])
plt.title('3D swiss roll')
ax2 = fig.add_subplot(122)
Z = manifold.Isomap(n_components=2).fit_transform(X)
ax2.scatter(Z[:, 0], Z[:, 1], c=t, cmap=plt.cm.hot)
plt.title('sklearn Isomap')
plt.show()
if __name__ == '__main__':
test_swiss_roll()
程序运行可见:https://aistudio.baidu.com/aistudio/projectdetail/2507328