局部线性嵌入(LLE)是一种非线性降维方法,它的目标是在较低维度空间中保持高维数据的局部特征。LLE的步骤可以概括如下:
邻域选择:对于每个数据点 x i x_i xi?,找出其 k k k 个最近邻。
重建权重计算:对每个点
x
i
x_i
xi?,使用其邻域中的点来线性重建它,并找到重建误差最小的权重系数。这可以通过最小化下列代价函数实现:
min
?
∑
i
∣
x
i
?
∑
j
∈
N
(
i
)
W
i
j
x
j
∣
2
\min \sum_i \left| x_i - \sum_{j \in N(i)} W_{ij} x_j \right|^2
mini∑?
?xi??j∈N(i)∑?Wij?xj?
?2
其中,
N
(
i
)
N(i)
N(i) 表示
x
i
x_i
xi? 的邻域中的点的集合,
W
i
j
W_{ij}
Wij? 是重建权重。
降维映射:在低维空间中寻找点
y
i
y_i
yi? 的集合,使得这些点保持原始重建权重所表示的局部几何结构。这涉及到最小化以下代价函数:
min
?
∑
i
∣
y
i
?
∑
j
∈
N
(
i
)
W
i
j
y
j
∣
2
\min \sum_i \left| y_i - \sum_{j \in N(i)} W_{ij} y_j \right|^2
mini∑?
?yi??j∈N(i)∑?Wij?yj?
?2
LLE的核心目标是在保留高维空间中局部结构的同时,找到数据点的低维表示 y i y_i yi?。
在LLE算法中,重建权重计算是一个关键步骤,目的是在高维空间中使用每个数据点的邻域来线性重建该点。这一步骤可以分解为以下几个部分:
选择邻域:对于每个数据点 x i x_i xi?,根据某种准则(如欧几里得距离)找出其 k k k 个最近邻。
计算重建权重:对于每个点
x
i
x_i
xi?,找出一组权重
W
i
j
W_{ij}
Wij?,使得使用这些权重线性组合邻域中的点所得到的重建点
x
^
i
=
∑
j
∈
N
(
i
)
W
i
j
x
j
\hat{x}_i = \sum_{j \in N(i)} W_{ij} x_j
x^i?=∑j∈N(i)?Wij?xj? 与原始点
x
i
x_i
xi? 尽可能接近。这通过最小化下列代价函数实现:
min
?
W
i
j
∑
i
∥
x
i
?
∑
j
∈
N
(
i
)
W
i
j
x
j
∥
2
\min_{W_{ij}} \sum_i \| x_i - \sum_{j \in N(i)} W_{ij} x_j \|^2
Wij?min?i∑?∥xi??j∈N(i)∑?Wij?xj?∥2
其中,约束条件是对于每个
i
i
i,
∑
j
∈
N
(
i
)
W
i
j
=
1
\sum_{j \in N(i)} W_{ij} = 1
∑j∈N(i)?Wij?=1。
假设我们的数据集包含三个点:A ( 0 , 0 ) (0, 0) (0,0),B ( 1 , 0 ) (1, 0) (1,0) 和 C ( 1 , 1 ) (1, 1) (1,1)。我们的目标是为点 A 计算重建权重,假设它的最近邻是点 B 和点 C。
定义重建误差:重建误差是原始点和基于其邻居的线性组合之间的差异。对于点 A,这个误差可以表示为:
E
=
∥
A
?
(
W
A
B
?
B
+
W
A
C
?
C
)
∥
2
E = \| A - (W_{AB} \cdot B + W_{AC} \cdot C) \|^2
E=∥A?(WAB??B+WAC??C)∥2
其中,
W
A
B
W_{AB}
WAB? 和
W
A
C
W_{AC}
WAC? 是我们要找的重建权重。
应用约束条件:在LLE中,每个点的重建权重之和应该等于1,即 W A B + W A C = 1 W_{AB} + W_{AC} = 1 WAB?+WAC?=1。这保证了重建过程的稳定性。
构建并求解优化问题:我们需要最小化重建误差 E E E,同时满足权重的约束条件。将点 A, B, C 的坐标代入,并利用约束条件简化表达式,得到一个可以求解的优化问题。
考虑点 A
(
0
,
0
)
(0, 0)
(0,0),点 B
(
1
,
0
)
(1, 0)
(1,0) 和点 C
(
1
,
1
)
(1, 1)
(1,1),我们可以将重建误差
E
E
E 表达为:
E
=
[
(
0
?
W
A
B
?
1
?
W
A
C
?
1
)
2
+
(
0
?
W
A
B
?
0
?
W
A
C
?
1
)
2
]
E = \left[ (0 - W_{AB} \cdot 1 - W_{AC} \cdot 1)^2 + (0 - W_{AB} \cdot 0 - W_{AC} \cdot 1)^2 \right]
E=[(0?WAB??1?WAC??1)2+(0?WAB??0?WAC??1)2]
根据约束条件
W
A
B
+
W
A
C
=
1
W_{AB} + W_{AC} = 1
WAB?+WAC?=1,我们可以替换其中一个权重,比如用
W
A
B
=
1
?
W
A
C
W_{AB} = 1 - W_{AC}
WAB?=1?WAC?,
将
W
A
B
=
1
?
W
A
C
W_{AB} = 1 - W_{AC}
WAB?=1?WAC? 代入代价函数,得到:
E
=
[
(
0
?
(
1
?
W
A
C
)
?
1
?
W
A
C
?
1
)
2
+
(
0
?
(
1
?
W
A
C
)
?
0
?
W
A
C
?
1
)
2
]
E = \left[ (0 - (1 - W_{AC}) \cdot 1 - W_{AC} \cdot 1)^2 + (0 - (1 - W_{AC}) \cdot 0 - W_{AC} \cdot 1)^2 \right]
E=[(0?(1?WAC?)?1?WAC??1)2+(0?(1?WAC?)?0?WAC??1)2]
简化后得到:
E
=
[
?
2
W
A
C
+
1
]
2
+
[
?
W
A
C
]
2
E = \left[ -2W_{AC} + 1 \right]^2 + \left[ -W_{AC} \right]^2
E=[?2WAC?+1]2+[?WAC?]2
求导:对
E
E
E 关于
W
A
C
W_{AC}
WAC? 求导,得到:
d
E
d
W
A
C
=
2
(
?
2
W
A
C
+
1
)
(
?
2
)
+
2
(
?
W
A
C
)
(
?
1
)
\frac{dE}{dW_{AC}} = 2(-2W_{AC} + 1)(-2) + 2(-W_{AC})(-1)
dWAC?dE?=2(?2WAC?+1)(?2)+2(?WAC?)(?1)
简化后得到:
d
E
d
W
A
C
=
8
W
A
C
?
4
?
2
W
A
C
=
6
W
A
C
?
4
\frac{dE}{dW_{AC}} = 8W_{AC} - 4 - 2W_{AC} = 6W_{AC} - 4
dWAC?dE?=8WAC??4?2WAC?=6WAC??4
求解最优权重:令导数等于零解出
W
A
C
W_{AC}
WAC?:
6
W
A
C
?
4
=
0
??
?
??
W
A
C
=
2
3
6W_{AC} - 4 = 0 \implies W_{AC} = \frac{2}{3}
6WAC??4=0?WAC?=32?
因此,
W
A
B
=
1
?
W
A
C
=
1
3
W_{AB} = 1 - W_{AC} = \frac{1}{3}
WAB?=1?WAC?=31?。
综上所述,对于点 A,最优的重建权重是 W A B = 1 3 W_{AB} = \frac{1}{3} WAB?=31? 和 W A C = 2 3 W_{AC} = \frac{2}{3} WAC?=32?。
这个结果表明,在使用点 B 和点 C 重建点 A 的过程中,点 C 对重建点 A 的贡献比点 B 大。
在局部线性嵌入(LLE)算法中,降维映射是最后一个步骤,它的目标是在低维空间中找到一个数据点的新表示,这些新表示应保留高维空间中的局部结构。这是通过优化一个新的代价函数来实现的,该函数基于之前计算的重建权重。
定义低维映射的代价函数:假设
y
i
y_i
yi? 是高维空间中点
x
i
x_i
xi? 的低维表示。降维映射的目标是最小化以下代价函数:
Φ
=
∑
i
∥
y
i
?
∑
j
∈
N
(
i
)
W
i
j
y
j
∥
2
\Phi = \sum_i \| y_i - \sum_{j \in N(i)} W_{ij} y_j \|^2
Φ=i∑?∥yi??j∈N(i)∑?Wij?yj?∥2
其中,
W
i
j
W_{ij}
Wij? 是之前计算得到的重建权重,
N
(
i
)
N(i)
N(i) 是点
x
i
x_i
xi? 的邻域。
优化过程:这个优化过程寻找一组低维表示 { y i } \{y_i\} {yi?},使得每个点 y i y_i yi? 与使用其高维邻居的重建权重 W i j W_{ij} Wij? 线性组合的低维表示尽可能接近。这个过程通常需要使用数值优化方法来实现,因为直接解析求解可能非常复杂。
保持局部结构:通过这种方式,低维表示 { y i } \{y_i\} {yi?} 能够保留原始高维数据中的局部邻域关系。如果两个高维点在原始空间中彼此接近,它们的低维表示也会彼此接近。
假设我们有一个简单的高维数据集,并且我们已经计算出了每个点的重建权重。现在,我们的目标是将这些点映射到低维空间(例如,从3维映射到2维)。我们将展示这个过程的简化版本。
考虑以下三维空间中的四个点:
假设我们已经根据LLE的第一步计算出了重建权重,例如:
优化问题:我们现在希望找到这些点在二维空间中的新表示
{
y
i
}
\{y_i\}
{yi?},使得代价函数
Φ
\Phi
Φ 最小:
Φ
=
∑
i
∥
y
i
?
∑
j
∈
N
(
i
)
W
i
j
y
j
∥
2
\Phi = \sum_i \| y_i - \sum_{j \in N(i)} W_{ij} y_j \|^2
Φ=i∑?∥yi??j∈N(i)∑?Wij?yj?∥2
在这个例子中,我们将求解一组新坐标
{
y
A
,
y
B
,
y
C
,
y
D
}
\{y_A, y_B, y_C, y_D\}
{yA?,yB?,yC?,yD?}。
数值求解:在实际应用中,这通常需要使用数值优化方法,如梯度下降或特征值分解,来求解。
构建矩阵M:根据计算出的重建权重,我们构建一个矩阵M。这个矩阵的元素是通过比较每对点之间的重建权重差异得到的。对于点A,B,C和D,这个矩阵可能看起来像这样(这是一个简化的示例):
M
=
[
1
?
0.3
?
0.7
0
?
0.3
1
?
0.4
?
0.3
?
0.7
?
0.4
1
?
0.1
0
?
0.3
?
0.1
1
]
M = \begin{bmatrix} 1 & -0.3 & -0.7 & 0 \\ -0.3 & 1 & -0.4 & -0.3 \\ -0.7 & -0.4 & 1 & -0.1 \\ 0 & -0.3 & -0.1 & 1 \end{bmatrix}
M=
?1?0.3?0.70??0.31?0.4?0.3??0.7?0.41?0.1?0?0.3?0.11?
?
矩阵 M 的构建
对角线元素:矩阵
M
M
M 的每个对角线元素
M
i
i
M_{ii}
Mii? 反映了点
i
i
i 与其邻居的重建权重之和:
M
i
i
=
1
?
∑
j
∈
N
(
i
)
W
i
j
2
M_{ii} = 1 - \sum_{j \in N(i)} W_{ij}^2
Mii?=1?j∈N(i)∑?Wij2?
其中,
N
(
i
)
N(i)
N(i) 表示点
i
i
i 的邻居集合,
W
i
j
W_{ij}
Wij? 是点
i
i
i 用于重建自己的来自邻居
j
j
j 的权重。
非对角线元素(邻居间):对于邻居点
i
i
i 和
j
j
j,矩阵
M
M
M 中的元素
M
i
j
M_{ij}
Mij? 是它们之间的重建权重:
M
i
j
=
?
W
i
j
如果
?
j
∈
N
(
i
)
M_{ij} = -W_{ij} \quad \text{如果} \, j \in N(i)
Mij?=?Wij?如果j∈N(i)
这表示点
i
i
i 和
j
j
j 在重建过程中的直接影响。
非对角线元素(非邻居间):对于不是邻居的点
i
i
i 和
j
j
j,矩阵
M
M
M 的元素
M
i
j
M_{ij}
Mij? 设为0:
M
i
j
=
0
如果
?
j
?
N
(
i
)
?
且
?
i
?
N
(
j
)
M_{ij} = 0 \quad \text{如果} \, j \notin N(i) \, \text{且} \, i \notin N(j)
Mij?=0如果j∈/N(i)且i∈/N(j)
求解特征值问题:接下来,我们解决特征值问题 M v = λ v Mv = \lambda v Mv=λv,其中 v v v是特征向量, λ \lambda λ是特征值。我们关注的是最小的非零特征值对应的特征向量。
低维嵌入:找到对应最小非零特征值的特征向量后,这些特征向量(除了对应最小特征值的向量)构成了数据的低维嵌入。在我们的例子中,这将是一个2维表示。
在LLE算法中,一旦计算出矩阵 M M M 的特征值和特征向量,我们可以按照以下步骤得到数据的低维表示:
求解特征值问题:首先,我们求解特征值问题
M
v
=
λ
v
Mv = \lambda v
Mv=λv,其中
v
v
v 是特征向量,
λ
\lambda
λ 是对应的特征值。通常,这是通过数值方法完成的,如使用Python中的 numpy.linalg.eigh
函数。
排序特征值:求解后,我们得到一系列特征值和相应的特征向量。特征值按照从小到大的顺序排序,与之对应的特征向量也按同样的顺序排列。
选择最小的非零特征值:在LLE中,我们通常忽略最小的特征值(通常接近或等于零),因为它对应的特征向量通常是数据的平均值或类似的全局结构。
选择后续特征向量:为了得到 ( k ) 维的低维表示,我们选择紧随最小特征值之后的 ( k ) 个特征向量。例如,如果我们想将数据降至2维,我们将选择第二小和第三小的特征值对应的特征向量。
构建特征向量矩阵:将选定的特征向量组合成一个矩阵,其中每一列是一个特征向量。假设我们选择了第二小和第三小的特征值对应的特征向量,那么这个矩阵将有两列。
转换为低维数据:这个特征向量矩阵就是数据点在低维空间中的新坐标。每个数据点的低维表示是这个矩阵中相应行的值。
import numpy as np
from scipy.spatial.distance import pdist, squareform
from scipy.linalg import eigh
def compute_reconstruction_weights(X, k):
n_samples = X.shape[0]
W = np.zeros((n_samples, n_samples))
for i in range(n_samples):
distances = np.sum((X[i] - X) ** 2, axis=1)
neighbors = np.argsort(distances)[1:k+1]
# 构建局部邻域矩阵
K = X[neighbors] - X[i]
G = K.dot(K.T)
G_inv = np.linalg.inv(G + np.eye(k) * 1e-3) # 加入小的正则项防止矩阵奇异
# 计算重建权重
weights = G_inv.sum(axis=1) / G_inv.sum()
W[i, neighbors] = weights
return W
def lle(X, k, n_components):
W = compute_reconstruction_weights(X, k)
# 构建矩阵 M
M = (np.eye(len(X)) - W).T @ (np.eye(len(X)) - W)
# 计算特征值和特征向量
eigenvalues, eigenvectors = eigh(M, eigvals=(1, n_components))
return eigenvectors
# 示例数据(可以是任意高维数据)
np.random.seed(0)
X = np.random.rand(10, 3) # 10个样本,每个样本3维
# 使用LLE降维到2维
embedded_X = lle(X, k=5, n_components=2)
print("低维表示:\n", embedded_X)