跳至主要内容

特征分解:矩阵分解新手指南

探索特征分解的基础知识及其在数据科学与机器学习中的应用。
· 7分钟 阅读

使用 AI 探索

矩阵运算是机器学习、统计分析和科学计算中计算工作的核心。比如,统计中的许多操作需要矩阵求逆、对角化和矩阵指数。这类操作计算成本高,但可以通过将矩阵分解为一组更小的矩阵来提升计算效率。此类操作通常统称为矩阵分解,且根据得到的小矩阵的性质,有各自的名称。

特征分解是一种矩阵分解方法,其中特征值和特征向量构成这些矩阵的元素。理解矩阵特征分解可为机器学习和数据科学工程师提供数学基础,以理解诸如降维和矩阵近似等方法。阅读本文后,建议学习课程 Linear Algebra for Data Science in R,掌握支撑数据科学的关键数学主题。

什么是特征分解?

特征分解是一种矩阵分解方法,将一个方阵分解为三个相乘的矩阵。之所以称为特征分解,是因为这些矩阵的条目为原方阵的特征值和特征向量。从数学上说,方阵A可以分解为三个矩阵,使得:

Eigendecomposition equation

其中,P 是A的特征向量矩阵,D 是一个对角矩阵,其非零元素为按顺序排列的特征值,而P-1 是矩阵P的逆矩阵。

特征分解背后的数学

我将通过一个例子展示如何通过解析运算求出方阵的特征分解。我们的示例矩阵是 2x2 方阵A。如果您在矩阵相乘等技巧上有困难,建议先学习我们的 Linear Algebra for Data Science in R 课程,以便熟悉矩阵乘法的工作方式。Example square matrix

要对矩阵A进行特征分解,需要求出该方阵的特征值及其对应的特征向量。我们可以利用矩阵的特征多项式来计算该矩阵的特征值与特征向量。如果您对这一部分不熟悉,请先阅读Characteristic Equation: Everything You Need to Know for Data Science。

根据特征多项式的定义,有:

Characteristic polynomial

因此,我们的矩阵A的特征多项式为pA(λ) = λ2 - 18λ + 56。将该多项式等于零可求出其根,从而得到特征值: 

因此,特征值为λ1 = 14与λ1 = 4。由特征值可利用(A - λI)X = 0为每个不同的特征值求解对应的特征向量:

对于 λ1 = 14,代入 14 并求解该齐次线性方程组:

这得到一个一维(即一个基向量)的特征子空间。对λ1 = 4重复同样的过程,得到:

现在我们已经得到了矩阵A的特征值和特征向量,就可以写出A的特征分解:

Eigendecomposition of matrix A

其中,我们将两个特征向量并排组合构成 P,并按递减顺序将特征值放在矩阵 D 的对角线上。

当然,我们也可以在计算机系统中使用 Python 或 R 完成特征分解。请注意,Python 和 R 可能会给出归一化(0–1 范围)的特征向量(即标准正交基)。在为验证目的从PDP-1 重构矩阵A时,这一点很重要。

特征分解在数据科学中的应用

特征分解在机器学习和统计中发挥重要作用。在机器学习中,特征分解用于降维方法(如 PCA)。在 PCA 中,我们为原始高维坐标寻找新的维度(方向),以尽可能保留信息。矩阵的特征分解给出特征值,而具有最大特征值的特征向量保留的信息更多,因此被指定为数据的主成分。

在 Python 和 R 中执行特征分解

在学会手算特征分解之后,我们也可以用计算机与编程语言(如 Python 与 R)用几行代码来完成。请记住,Python 与 R 计算得到的特征向量是归一化的(相较于诸如 Python 中的 SymPy 等符号计算语言或包)。

Python 中的特征分解

在 Python 中执行特征分解,需要安装并导入 NumPy 模块。下面的代码演示了如何对非对称方阵A进行特征分解:

import numpy as np

A = np.array([[6,8], [2,12]]) 

eigVals, eigVecs = np.linalg.eig(A)

print(eigVals)
print(eigVecs)
[ 4. 14.]
[[-0.9701425  -0.70710678]
 [ 0.24253563 -0.70710678]]
 # Reconstruct the original matrix A
D = np.diag(eigVals)
A_reconstructed = eigVecs @ D @ np.linalg.inv(eigVecs)

print(A_reconstructed)
[[ 6.  8.]
 [ 2. 12.]]

R 中的特征分解

在 R 中可使用内置函数eigen()完成特征分解,因此对小矩阵进行特征分解无需安装和导入额外包。下面的 R 代码对矩阵 A 执行特征分解(R 会按递减顺序排列特征值,因此特征向量的顺序与 Python NumPy 的输出不同):

A <- matrix(c(6,8,2,12), 2,2, byrow = TRUE)

print(A)

eDecomp <- eigen(A)
eigValues <- eDecomp$values
eigVectors <- eDecomp$vectors

print(eigValues)
print(eigVectors)
[1] 14  4
           [,1]       [,2]
[1,] -0.7071068 -0.9701425
[2,] -0.7071068  0.2425356
A_Reconstructed <- eigVectors %*% diag(eigValues) %*% (solve(eigVectors))

print(A_Reconstructed)
Show in New Window
     [,1] [,2]
[1,]    6    8
[2,]    2   12

特征分解与奇异值分解(SVD)

特征分解与奇异值分解(SVD)是机器学习与科学计算中两种重要的矩阵分解方法。尽管两者都将矩阵分解为三个矩阵,但它们存在一些差异:

  • 特征分解仅适用于方阵,而 SVD 既可用于方阵也可用于非方阵。
  • 在 SVD 中,分解得到的矩阵包含奇异值;而特征分解得到的是特征值。
  • 由于 SVD 能适用于非方阵,其应用范围比特征分解更广。

结论

在这篇简短的线性代数文章中,我们了解了特征分解、如何手算它,以及如何使用 Python 和 R 进行计算。我们还学习了特征分解在 PCA 等机器学习算法中的应用。

如果您立志成为数据分析师或数据科学家,强烈建议学习我们的 Linear Algebra for Data Science in R 课程,以夯实应用数学与编程基础。您也可以报名完整的 Machine Learning Scientist in Python 职业路径,系统学习监督学习、无监督学习与深度学习。

Vahab Khademi

作者

Vahab Khademi

我的教育背景是数学与统计学。我在统计建模和机器学习应用方面拥有丰富经验。此外,我还从事机器学习数学基础方面的研究。

特征分解常见问答

什么是特征分解?

特征分解是将方阵分解为其特征值和特征向量的过程。

何时可以进行特征分解?

特征分解仅对方阵可行。然而,并非所有方阵都能以这种方式分解。矩阵必须是可对角化的,通常意味着它需要具有一组线性无关的特征向量。对于不满足此条件的矩阵(如不可对角化或缺陷矩阵),在通常意义下无法进行特征分解。

主题