以下内容转自 数析学院,只节选了部分,有需要的同学可以直接查看原文
流形学习(manifold learning)是机器学习、模式识别中的一种方法,在维数约简方面具有广泛的应用。本节将向大家介绍在 Python 中利用 Scikit-Learn 工具库实现流形学习的一系列方法与技巧。
首先需要导入相关的可视化工具库,并构造本节的第一个示例数据:
- %matplotlib inline
- import matplotlib.pyplot as plt
- import seaborn as sns; sns.set()
- import numpy as np
构建如下函数 make_hello 用于示例数据集构建:
- def make_hello(N=1000, rseed=42):
- # 绘制一个“HELLO”形状,并将它保存为png
- fig, ax = plt.subplots(figsize=(4, 1))
- fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
- ax.axis('off')
- ax.text(0.5, 0.4, 'HELLO', va='center', ha='center',
- weight='bold', size=85)
- fig.savefig('hello.png')
- plt.close(fig)
-
- # 打开这个 PNG,并根据图片生成随机散点
- from matplotlib.image import imread
- data = imread('hello.png')[::-1, :, 0].T
- rng = np.random.RandomState(rseed)
- X = rng.rand(4 * N, 2)
- i, j = (X * data.shape).astype(int).T
- mask = (data[i, j] < 1)
- X = X[mask]
- X[:, 0] *= (data.shape[0] / data.shape[1])
- X = X[:N]
- return X[np.argsort(X[:, 0])]
构建示例数据集 X,一组拼接成“HELLO”字样的散点样本:
- X = make_hello(1000)
- colorize = dict(c=X[:, 0], cmap=plt.cm.get_cmap('rainbow', 5))
- plt.scatter(X[:, 0], X[:, 1], **colorize)
- plt.axis('equal');
我们构建的数据样本如上所示,接下来我们对样本点的坐标进行以下旋转,将旋转后的数据集命名为 X2:
- def rotate(X, angle):
- theta = np.deg2rad(angle)
- R = [[np.cos(theta), np.sin(theta)],
- [-np.sin(theta), np.cos(theta)]]
- return np.dot(X, R)
-
- X2 = rotate(X, 20) + 5
- plt.scatter(X2[:, 0], X2[:, 1], **colorize)
- plt.axis('equal');
为了直观地展现流形学习,我们运用 Scikit-Learn 中的 pairwise_distances 工具计算样本点两两之间的距离指标,并存储为矩阵 D:
- from sklearn.metrics import pairwise_distances
- D = pairwise_distances(X)
- D.shape
我们可以用像素图来描绘矩阵 D 中的内容,1000 个样本点中两两间的距离如下图所示:
- plt.imshow(D, zorder=2, cmap='Blues', interpolation='nearest')
- plt.colorbar();
可以看到,X2 与 X 中样本点两两间的距离不会因为整体旋转而改变:
- D2 = pairwise_distances(X2)
- np.allclose(D, D2)
以上内容节选自 数析学院,后文还有三维数据集处理、图像处理实例等,内容较多,先搬运到这,有需要的同学可以先直接到 数析学院 查看原文


雷达卡




京公网安备 11010802022788号







