1.Isomap算法简介
等度量映射(Isometric Feature Mapping,Isomap)是流形学习的一种,用于非线性数据降维,是一种无监督算法。
Isomap所采用的核心算法和MDS是一致的,区别在于原始空间中的距离矩阵的计算上。很多数据是非线性结构,不适合直接采用PCA算法和MDS算法。在非线性数据结构中,流形上距离很远(测地距离,即在曲面上(不允许离开曲面)从A点走到B点的最短距离)的两个数据点,在高维空间中的距离(欧式距离)可能非常近。
Isomap最主要的优点就是使用“测地距离”,而不是使用原始的欧几里得距离,这样可以更好得控制数据信息的流失,能够在低维空间中更加全面地将高维空间的数据表现出来,如下图经典的“瑞士卷”模型,通过从点1到点9的k近邻层层递进方法,得到红色曲线,即为两点之间的测地距离。
2.Isomap算法原理
**(1)首先建立邻近图:**对于每个样本点,计算它的k近邻,利用流形在局部上的欧式空间同胚性质,基于欧式距离,找出每个点在低维流形上的近邻点,建立近邻连接图;
**(2)计算两个点之间的测地距离:**调用最短路径算法计算任意两样本点之间的距离,计算近邻图上任意两点之间的最短路径,作为两点之间的距离;
**(3)低维映射:**得到两点之间的测地距离后,通过MDS算法获得样本点在地位空间中的坐标。
近邻图有两种类型:
**(1)k近邻图:**指定近邻点个数,例如指定距离最近的k个点为近邻点;
**(2)ε近邻图:**指定近邻点阈值ε,距离小于ε的点被认为是近邻点。
在建立近邻图时,应当注意控制近邻图的范围,否则容易出现“短路”或者“断路”问题:
**(1)“短路”问题:**近邻范围制定过大,距离很远的点也被误认为是近邻;
**(2)“断路”问题:**近邻范围制定过小,本应当相邻的点被认为断开的。
3.Isomap算法优缺点
Isomap算法针对MDS算法,解决了MDS基于欧式距离映射非线性结构高维数据的局限性。
然而,对于新样本,难以将其映射到低维空间。理论上可以将新样本添加到数据集中,重新调用Isomap算法,但这方案计算量太大。一般的解决方法是,训练一个回归学习器对新样本的低维空间进行预测
4.python实战Isomap
以鸢尾花数据集为例,实现Isomap降维算法。原始数据集包含三种不同的分类,共150条数据,每个数据有四个特征。
#(1)导入必要程序库
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets,decomposition,manifold
#(2)加载数据
def load_data():
iris=datasets.load_iris()
return iris.data,iris.target
#(3)使用Isomap
def test_Isomap(*data):
X,y=data
for n in [4,3,2,1]:
isomap=manifold.Isomap(n_components=n)
isomap.fit(X)
print('reconstruction_error(n_components=%d):%s'%(n,
isomap.reconstruction_error()))
X,y=load_data()
test_Isomap(X,y)
#(4)降维后的样本分布图
def plot_Isomap(*data):
X,y=data
Ks=[1,5,25,y.size-1]
fig=plt.figure()
for i,k in enumerate(Ks):
isomap=manifold.Isomap(n_components=2,n_neighbors=k)
X_r=isomap.fit_transform(X)
ax=fig.add_subplot(2,2,i+1)
colors=((1,0,0),(0,1,0),(0,0,1),(0.5,0.5,0),(0,0.5,0.5),(0.5,0,0.5),
(0.4,0.6,0),(0.6,0.4,0),(0,0.6,0.4),(0.5,0.3,0.2),)
for label,color in zip(np.unique(y),colors):
position=y==label
ax.scatter(X_r[position,0],X_r[position,1],label='target=%d'%label,color=color)
ax.set_xlabel('X[0]')
ax.set_ylabel('X[1]')
ax.legend(loc='best')
ax.set_title("k=%d"%k)
plt.suptitle('Isomap')
plt.tight_layout(pad=2)
plt.show()
plot_Isomap(X,y)
#(5)将原始数据压缩到一维
def plot_Isomap_k_d1(*data):
X,y=data
Ks=[1,5,25,y.size-1]
fig=plt.figure()
for i,k in enumerate(Ks):
isomap=manifold.Isomap(n_components=2,n_neighbors=k)
X_r=isomap.fit_transform(X)
ax=fig.add_subplot(2,2,i+1)
colors=((1,0,0),(0,1,0),(0,0,1),(0.5,0.5,0),(0,0.5,0.5),(0.5,0,0.5),
(0.4,0.6,0),(0.6,0.4,0),(0,0.6,0.4),(0.5,0.3,0.2),)
for label,color in zip(np.unique(y),colors):
position=y==label
ax.scatter(X_r[position],np.zeros_like(X_r[position]),label='target=%d'%label,color=color)
ax.set_xlabel('X[0]')
ax.set_ylabel('Y')
ax.legend(loc='best')
ax.set_title("k=%d"%k)
plt.suptitle('Isomap')
plt.tight_layout(pad=2)
plt.show()
plot_Isomap_k_d1(X,y)
代码运行如下:
reconstruction_error(n_components=4):1.0094929893039135
reconstruction_error(n_components=3):1.0181252006659833
reconstruction_error(n_components=2):1.0275229261937564
reconstruction_error(n_components=1):1.0715321251523136
降维后的样本分布如下:
将原始数据的特征直接压缩到一维效果如下:
5.下篇预告
sklearn与机器学习系列专题之降维(六)一文弄懂LLE特征筛选&降维
敬请期待!
欢迎关注公众号“码点联盟”,不定期分享机器学习、深度学习干货,及各种资料大礼包!
另外,这是一个由一线互联网大厂算法工程师及双985研究生创建的公众号,后续会经常分享各类实用机器学习算法技术文章,欢迎交流讨论!