局部线性嵌入(LLE) 是一种非线性降维算法,它能够使降维后的数据较好地保持原有流形结构,每一个数据点都可以由其近邻点的线性加权组合构造得到。
局部线性嵌入寻求数据的低维投影,保留本地邻域内的距离。它可以被认为是一系列局部主成分分析,被全局比较以找到最佳的非线性嵌入。
算法的主要步骤分为三步:
1、首先寻找每个样本点的k个近邻点
2、然后,由每个样本点的近邻点计算出该样本点的局部重建权值矩阵
3、最后,由该样本点的局部重建权值矩阵和近邻点计算出该样本点的输出值
LLE在有些情况下也并不适用,例如数据分布在整个封闭的球面上,LLE则不能将它映射到二维空间,且不能保持原有的数据流形。因此在处理数据时,需要确保数据不是分布在用合的球面或者椭球面上。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import NullFormatter
from sklearn import manifold, datasets
Axes3D
n_points = 1000
# X, color = datasets.samples_generator.make_swiss_roll(n_samples=1500)
X, color = datasets.make_swiss_roll(n_samples=1500)
n_neighbors = 10#近临点数量为10
n_components = 2#降到二维
fig = plt.figure(figsize=(12, 8))
plt.suptitle("Manifold Learning with %i points, %i neighbors"
% (1000, n_neighbors), fontsize=14)
ax = fig.add_subplot(121, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)
ax.view_init(4, -72)
ax.set_zlabel('Z')
ax.set_ylabel('Y')
ax.set_xlabel('X')
se = manifold.SpectralEmbedding(n_components=n_components,
n_neighbors=n_neighbors)
Y = se.fit_transform(X)
ax = fig.add_subplot(122)
plt.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Spectral)
ax.xaxis.set_major_formatter(NullFormatter())
ax.yaxis.set_major_formatter(NullFormatter())
plt.xlabel('LE1')
plt.ylabel('LE2')
plt.axis('tight')
plt.show()
经过LLE变换,样本在低维空间已经能够区分。