引言
在机器学习和数据分析领域,当数据的维度特别高时,处理和分析数据就会变得尤为困难。这是因为随着维度的增加,数据的稀疏性也会增加,这种现象被称为“维度的诅咒”。为了克服这个挑战,研究者发展了各种降维技术,目的是在保留数据的大部分信息的同时,减少其维度。常用的降维方法包括奇异值分解、主成分分析和T-sne。下面我们将详细介绍奇异值分解,主成分分析和T-sne详情站内其他博文。
1.奇异值分解 (Singular Value Decomposition, SVD)
1.1 算法解读:
奇异值分解 (Singular Value Decomposition,SVD) 是线性代数中一种重要的矩阵分解方 法。给定一个矩阵 \(A\) ,SVD 将其分解为三个矩阵的乘积,即:
$$A=U \Sigma V^T$$
其中:
– \(U\)和 \(V\)都是正交矩阵。正交矩阵的特点是其转置等于其逆,即 \(U^T U=U U^T=I\) 和 \(V^T V=V V^T=I\) ,其中 \(I\) 是单位矩阵。
– \(\Sigma\) 是一个对角矩阵,对角线上的元素称为奇异值,且按降序排列。奇异值反映了矩阵 \(A\)在相 应维度上的“能量”或“强度”。
1.2 步骤和细节:
1. 计算 \(A^T A\) 和 \(A A^T\) :
首先,计算矩阵 \(A\)的转置与 \(A\)的乘积,即 \(A^T A\) 和 \(A A^T\) 。这两个矩阵都是对称矩阵,我们 可以从中得到 \(V\) 和 \(U\)矩阵的信息。
2. 求特征值和特征向量:
对于 \(A^T A\) 和 \(A A^T\) ,我们求出它们的特征值和特征向量。特征值给出了奇异值的平方,特征向量则是 \(U\) 和 \(V\)矩阵的列向量。
3. 排序和选取:
将得到的特征值按降序排列,选取前 \(k\) 个最大的特征值。对应地,选取与这些特征值相关联的特征向量,构成 \(U\) 和 \(V\)矩阵。奇异值矩阵 \(\Sigma\) 则是由特征值的平方根组成的对角矩阵。
4. 构造 \(U, \Sigma, V^T\) :
使用选取的特征向量构造 \(U\)和 \(V\)矩阵,构造奇异值矩阵 \(\Sigma\) 。最终,我们得到了矩阵 \(A\)的 SVD 分解。
1.3 举例:
考虑下面的 \(3 \times\) 3 矩阵 \(A\):
$$A=\left[\begin{array}{ccc}
4 & 0 & 2 \\
3 & -5 & 1 \\
2 & 1 & 3
\end{array}\right]$$
步骤1:计算 \(A^T A\) 和 \(A A^T\)
1. 计算 \(A^T A\) :
$$A^T A=\left[\begin{array}{ccc}
4 & 3 & 2 \\
0 & -5 & 1 \\
2 & 1 & 3
\end{array}\right]\left[\begin{array}{ccc}
4 & 0 & 2 \\
3 & -5 & 1 \\
2 & 1 & 3
\end{array}\right]=\left[\begin{array}{ccc}
29 & -12 & 17 \\
-12 & 26 & -2 \\
17 & -2 & 14
\end{array}\right]$$
步骤2: 求特征值和特征向量
2.1 求 \(A^T A\) 的特征值和特征向量
我们已经计算出
$$A^T A=\left[\begin{array}{ccc}
29 & -12 & 17 \\
-12 & 26 & -2 \\
17 & -2 & 14
\end{array}\right]$$
求特征值:
为了找到特征值,我们需要解以下特征方程:
$$\rm{det}\left(A^T A-\lambda I\right)=\rm{det}\left(\left[\begin{array}{ccc}
29 & -12 & 17 \\
-12 & 26 & -2 \\
17 & -2 & 14
\end{array}\right]-\lambda\left[\begin{array}{lll}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{array}\right]\right)=0$$
这将导致一个三次方程,我们需要找到这个方程的所有根,这些根就是 \(A^T A\)的特征值。
求特征向量:
对于每个找到的特征值 \(\lambda\) ,我们需要解线性方程组:
$$\left(A^T A-\lambda I\right) v=0$$
这里, \(v\) 是我们要找的特征向量。由于这是一个齐次线性方程组,我们可以通过高斯消元法 或其他方法来找到它的解。
相同的逻辑,求解求 \(A A^T\) 的特征值和特征向量,由于实际计算涉及到复杂的代数运算,这里我们主要展示了方法和步骤。实际结果可通过代码进行计算:
# 定义矩阵 A,以及重新计算 A^T A 和 A A^T
A = np.array([[4, 0, 2], [3, -5, 1], [2, 1, 3]])
AtA = np.dot(A.T, A)
AAt = np.dot(A, A.T)
# 计算 A^T A 的特征值和特征向量
eig_values_AtA, eig_vectors_AtA = np.linalg.eigh(AtA)
# 计算 A A^T 的特征值和特征向量
eig_values_AAt, eig_vectors_AAt = np.linalg.eigh(AAt)
# 将特征值和特征向量按降序排列
sorted_indices_AtA = np.argsort(eig_values_AtA)[::-1]
sorted_indices_AAt = np.argsort(eig_values_AAt)[::-1]
eig_values_AtA = eig_values_AtA[sorted_indices_AtA]
eig_vectors_AtA = eig_vectors_AtA[:, sorted_indices_AtA]
eig_values_AAt = eig_values_AAt[sorted_indices_AAt]
eig_vectors_AAt = eig_vectors_AAt[:, sorted_indices_AAt]
AtA, AAt, eig_values_AtA, eig_vectors_AtA, eig_values_AAt, eig_vectors_AAt
经过计算,我们得到了以下结果:
2.2 \(A^T A\) 矩阵为:
$$A^T A=\left[\begin{array}{ccc}
29 & -13 & 17 \\
-13 & 26 & -2 \\
17 & -2 & 14
\end{array}\right]$$
2.3 \(A A^T\) 矩阵为:
$$A A^T=\left[\begin{array}{ccc}
20 & 14 & 14 \\
14 & 35 & 4 \\
14 & 4 & 14
\end{array}\right]$$
2.4 \(A^T A\) 的特征值 (按降序排列) 和对应的特征向量分别为:
特征值:
$$\left[\begin{array}{l}47.1057 \\ 20.3909 \\ 1.50334\end{array}\right]$$
特征向量:
$$\left[\begin{array}{rrr}-0.7552 & 0.2810 & 0.5923 \\ 0.5048 & 0.8257 & 0.2518 \\ -0.4183 & 0.4891 & -0.7654\end{array}\right]$$
其中,每一列代表一个特征向量,与特征值一对应。
2.5 \(A A^T\) 的特征值 (按降序排列) 和对应的特征向量分别为:
$$\left[\begin{array}{l}47.1057 \\ 20.3909 \\ 1.50334\end{array}\right]$$
特征值:
$$\left[\begin{array}{l}47.1057 \\ 20.3909 \\ 1.50334\end{array}\right]$$
特征向量:
$$\left[\begin{array}{ccc}-0.5620 & 0.4656 & 0.6837 \\ -0.7588 & -0.6193 & -0.2020 \\ -0.3293 & 0.6323 & -0.7013\end{array}\right]$$
其中,每一列代表一个特征向量,与特征值一对应。
步骤3:排序和选取
我们将得到的特征值按降序排列,并选取前 \(k\)个最大的特征值及其对应的特征向量,这里 \(k\) 是我们想要保留的特征数量。接着,我们可以计算奇异值矩阵 \(\Sigma\),其对角线上的元素是选取的特征值的平方根。我们以k=2为例子,我们选取两个最大的特征值及其对应的特征向量。对于 \(A^T A\)和 \(A A^T\) 来说,这些特征值分 别是 47.1057 和 20.3909 。
3.1 选取的 \(A^T A\) 特征向量(对应于矩阵 \(V\) 的列):
$$\left[\begin{array}{cc}
-0.7552 & 0.2810 \\
0.5048 & 0.8257 \\
-0.4183 & 0.4891
\end{array}\right]$$
3.2 选取的 \(A A^T\) 特征向量(对应于矩阵 \(U\) 的列):
$$\left[\begin{array}{cc}
-0.5620 & 0.4656 \\
-0.7588 & -0.6193 \\
-0.3293 & 0.6323
\end{array}\right]$$
3.3 计算奇异值矩阵 \(\Sigma\)
奇异值矩阵 \(\Sigma\) 是一个对角矩阵,其对角线上的元素是选取的特征值的平方根,按降序排列。 在这个例子中,我们有:
$$\Sigma=\left[\begin{array}{cc}
\sqrt{47.1057} & 0 \\
0 & \sqrt{20.3909}
\end{array}\right]$$
步骤4: 构造 \(U, \Sigma, V^T\)
在这一步中,我们将使用前面步骤中得到的结果来构造 \(U, \Sigma, V^T\) 三个矩阵,完成SVD的过程。
4.1 构造 \(U\) 矩阵
我们已经选取了 \(A A^T\) 的前两个特征向量。将这些特征向量作为列向量放入一个矩阵中,我 们得到 \(U\) 矩阵:
$$U=\left[\begin{array}{cc}
-0.5620 & 0.4656 \\
-0.7588 & -0.6193 \\
-0.3293 & 0.6323
\end{array}\right]$$
4.2 构造 \(\Sigma\) 矩阵
我们已经计算出了前两个奇异值,并将它们放入对角矩阵 \(\Sigma\) 中:
$$\Sigma=\left[\begin{array}{cc}
\sqrt{47.1057} & 0 \\
0 & \sqrt{20.3909}
\end{array}\right] \approx\left[\begin{array}{cc}
6.8593 & 0 \\
0 & 4.5160
\end{array}\right]$$
4.3 构造 \(V^T\) 矩阵
我们也选取了 \(A^T A\) 的前两个特征向量。将这些特征向量作为行向量放入一个矩阵中,我们 得到 \(V^T\) 矩阵:
$$V^T=\left[\begin{array}{ccc}
-0.7552 & 0.5048 & -0.4183 \\
0.2810 & 0.8257 & 0.4891
\end{array}\right]$$
完成 SVD
现在,我们已经成功地构造了 \(U, \Sigma, V^T\) 三个矩阵,从而完成了矩阵 \(A\) 的奇异值分解:
$$A ≈ U\Sigma V^T=\left[\begin{array}{cc}
-0.5620 & 0.4656 \\
-0.7588 & -0.6193 \\
-0.3293 & 0.6323
\end{array}\right]\left[\begin{array}{cc}
6.8593 & 0 \\
0 & 4.5160
\end{array}\right]\left[\begin{array}{ccc}
-0.7552 & 0.5048 & -0.4183 \\
0.2810 & 0.8257 & 0.4891
\end{array}\right]$$
请注意,由于我们只保留了两个最大的奇异值(k=2),所以这是原始矩阵 A 的近似表示。 那么这个近似的A,相较于原始数据A有什么好处?
实际上,利用奇异值分解(SVD)对矩阵 A 进行近似有多种潜在好处,这些好处在不同的应用领域中可能会有所不同。以下是一些主要的优点:
数据压缩:
通过保留较少的奇异值和相应的特征向量,我们可以用更少的数据表示原始矩阵。这可以被视为一种数据压缩,有助于减少存储和计算的开销。
降噪:
在实际应用中,数据往往会受到噪声的影响。保留较大的奇异值通常意味着保留了数据中的主要成分,而忽略了较小的奇异值有助于滤除噪声和不重要的成分。
降维:
SVD 是一种有效的降维技术。通过保留前 k 个奇异值及其对应的特征向量,我们实现了数据的降维表示,这对于很多机器学习任务(如聚类、回归、分类等)是非常有益的。
计算效率:
对于大规模的数据矩阵,计算其完整的奇异值分解可能非常耗时。通过仅计算和保留前 k 个奇异值和特征向量,我们可以大大提高计算效率。
可视化:
对于高维数据,我们可以通过 SVD 降维到2维或3维空间,从而实现数据的可视化,这有助于分析和理解数据的结构和关系。
推荐系统:
在推荐系统中,SVD 被用来识别用户和物品之间的潜在关系。通过近似表示,我们可以发现用户的潜在兴趣和物品的潜在特性,从而进行更准确的推荐。
特征提取:
SVD 提取的特征向量(左奇异向量和右奇异向量)可以视为原始数据空间中的新特征。这些特征有助于揭示数据的内在结构和模式。
具体来说,这三个矩阵的组合揭示了数据的多个层面的信息,其中左奇异向量和右奇异向量在特征提取中尤为重要。
左奇异向量(U 矩阵)
左奇异向量是原始数据矩阵 A 的列空间的一组正交基,它们描述了数据中的主要“模式”或“特征”。在实际应用中,例如图像分析、文本挖掘等,左奇异向量可以捕捉到数据的重要特性,例如图像的主要结构、文档的主题等。
例如,在文本挖掘中,原始数据矩阵的每一行可能代表一个文档,每一列代表一个词汇,矩阵中的元素代表词频。在这种情况下,左奇异向量可能代表不同文档中主题的权重分布,有助于我们发现文档集中的主要主题。
右奇异向量(V 的转置矩阵)
右奇异向量是原始数据矩阵 A 的行空间的一组正交基,它们描述了数据的不同“视角”或“观测维度”。在很多应用场景中,右奇异向量可以帮助我们理解不同特征或维度如何组合以形成数据的结构。
继续上面的文本挖掘例子,右奇异向量可能代表每个词在不同主题中的权重,有助于我们理解每个词与各个主题的关联性。
奇异值的重要性
奇异值 Σ 中的元素表示了对应的左、右奇异向量在描述数据时的重要性。较大的奇异值意味着相应的左、右奇异向量更能够捕捉到数据的主要结构和模式,而较小的奇异值通常对应于数据的次要特征或噪声。
通过保留较大的奇异值及其对应的奇异向量,我们能够提取出数据的主要特征,同时去除噪声和不重要的信息,从而实现数据的降维、压缩和特征提取。
这些优点使得 SVD 成为了许多领域中广泛使用的工具,包括机器学习、数据挖掘、图像处理、信号处理、推荐系统等。
1.4 算法评价
除了上述的作用和优点外,奇异值分解也存在一些缺点,具体如下:
计算复杂性:
对于非常大的矩阵,计算其 SVD 是非常耗时的。尽管有一些随机化算法和其他技术可以加速 SVD 的计算,但对于特别大的数据集,这仍然是一个挑战。
存储开销:
对于稀疏矩阵,直接应用 SVD 会产生三个密集矩阵,这可能会导致存储开销大增。
解释性:
SVD 提取的特征向量(左奇异向量和右奇异向量)可能难以直观解释,特别是在高维数据中。
线性假设:
SVD 是一种基于线性假设的方法,对于非线性结构的数据,它可能无法完全捕捉到数据的内在模式。
静态方法:
SVD 是一种静态方法,不适合动态变化的数据流,因为当新数据到来时,可能需要重新计算 SVD。
尽管 SVD 有一些局限性,但通过各种改进和变种,例如截断奇异值分解(Truncated SVD)、随机奇异值分解(Randomized SVD)等,它仍然在许多领域中发挥着重要作用。在使用 SVD 时,了解其优缺点并根据具体应用适当选择变种和参数是非常重要的。
1.5 算法变体
1. 截断奇异值分解(Truncated SVD)
截断奇异值分解是标准 SVD 的一种简化版本。在标准 SVD 中,我们会计算所有的奇异值和奇异向量,但在截断 SVD 中,我们仅计算和保留前 k 个最大的奇异值及其对应的奇异向量。这样,我们可以得到原始数据矩阵的低秩近似,从而实现数据压缩和降维。
截断 SVD 的主要优点是计算效率更高,存储开销更小,特别适合处理大规模的数据矩阵。
参考文献:
Golub, G. H., & Reinsch, C. (1970). Singular value decomposition and least squares solutions. Numerische mathematik, 14(5), 403-420.
2. 随机奇异值分解(Randomized SVD)
随机奇异值分解是一种近似算法,它利用随机化技术来加速 SVD 的计算。这种方法特别适合处理非常大且稀疏的矩阵。基本思想是通过随机投影的方式减小数据矩阵的规模,然后在较小的矩阵上进行标准的 SVD。
随机 SVD 的主要优点是计算速度快,能够有效处理大规模稀疏矩阵,但可能以牺牲一定的精度为代价。
参考文献:
Halko, N., Martinsson, P. G., & Tropp, J. A. (2011). Finding structure with randomness: Probabilistic algorithms for constructing approximate matrix decompositions. SIAM review, 53(2), 217-288.
这两种变体都有助于克服标准 SVD 在处理大规模数据时的计算和存储挑战,但可能需要根据具体应用和精度要求进行权衡选择。
暂无评论内容