R 中的线性代数相关操作

创建向量和矩阵

# 创建向量
v <- c(1, 2, 3)

# 创建矩阵
M <- matrix(c(1, 2, 3, 4, 5, 6), nrow=2, ncol=3)

class(v)
[1] "numeric"
class(M)
[1] "matrix" "array" 
v
[1] 1 2 3
M
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
  • 使用c()函数创建了一个简单的数值向量v,包含三个元素123。在 R 中,向量是一种基本的数据结构,可以包含一系列的元素。这里的向量v是一个一维数组,它可以包含数字、字符或逻辑值等类型的数据。在这个例子中,v是一个包含数字的数值型向量。

  • 使用matrix()函数创建了一个矩阵Mmatrix()函数的第一个参数是一个向量,它包含了将要填充到矩阵中的元素。在这个例子中,矩阵的元素由c(1, 2, 3, 4, 5, 6)指定。nrow=2ncol=3matrix()函数的参数,分别指定矩阵的行数和列数。因此,M是一个23列的矩阵(注意,R在填充矩阵时默认是按列填充的,所以先填充了所有的行,然后移动到下一列)。

v和M的对象类型:

  • v是一个数值型向量(numeric vector)。在 R 中,向量是同质的,意味着所有元素都是同一类型

  • M是一个矩阵(matrix)。矩阵是一个二维数组,每个元素都是相同类型的。在 R 中,矩阵的元素通常是数值型的,但也可以是字符型或逻辑型。

矩阵运算

# 矩阵转置
M_transpose <- t(M)
M_transpose
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
# 矩阵乘法
M2 <- matrix(c(7, 8, 9, 10, 11, 12), nrow=3, ncol=2)
M2
     [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12
product <- M %*% M2
product
     [,1] [,2]
[1,]   76  103
[2,]  100  136
# 矩阵的逆(假设矩阵是矩阵)
square_matrix <- matrix(c(2, -1, 0, -1, 2, -1, 0, -1, 2), nrow=3, ncol=3)
inverse <- solve(square_matrix)
square_matrix
     [,1] [,2] [,3]
[1,]    2   -1    0
[2,]   -1    2   -1
[3,]    0   -1    2
inverse
     [,1] [,2] [,3]
[1,] 0.75  0.5 0.25
[2,] 0.50  1.0 0.50
[3,] 0.25  0.5 0.75
  • 使用了 R 中的t()函数来转置矩阵M。转置操作会将M的行变成列,列变成行。如果M是一个2x3的矩阵,它的转置M_transpose将是一个3x2的矩阵。

  • 创建了一个新的矩阵M2,这是一个3x2的矩阵。然后,它使用%*%运算符执行了矩阵M和矩阵M2之间的矩阵乘法。结果product是这两个矩阵的乘积。为了进行矩阵乘法,左矩阵的列数必须等于右矩阵的行数。在这个例子中,M2x3M23x2,所以它们可以相乘,结果product将是一个2x2的矩阵。

  • 创建了一个3x3的矩阵square_matrix。然后它使用R的solve()函数来计算这个矩阵的逆。一个矩阵的逆是另一个矩阵,当两者相乘时,结果是单位矩阵(对角线上都是 1,其他位置都是 0 的矩阵)。不是所有的矩阵都有逆,只有那些称为非奇异或可逆的矩阵才有逆。在这个例子中,square_matrix是非奇异的,所以solve()函数可以找到它的逆。

特征值计算

# 求特征值和特征向量
eigen_results <- eigen(square_matrix)
eigen_results
eigen() decomposition
$values
[1] 3.4142136 2.0000000 0.5857864

$vectors
           [,1]          [,2]      [,3]
[1,] -0.5000000 -7.071068e-01 0.5000000
[2,]  0.7071068  1.099065e-15 0.7071068
[3,] -0.5000000  7.071068e-01 0.5000000
  • 使用eigen()函数来计算矩阵的特征值和特征向量,然后将结果分别提取到eigen_valueseigen_vectors中。

  • 在这个上下文中,square_matrix应该是一个矩阵(即行数和列数相同的矩阵)。函数eigen()返回一个列表,其中包含了两个主要成分:特征值和特征向量。

    • 特征值(Eigenvalues):一个矩阵 A 的特征值是一组标量λ,满足方程Av = λv,其中 v 是一个非零向量(特征向量)。特征值给出了矩阵 A 在某些方向上的伸缩因子。

    • 特征向量(Eigenvectors):与特征值相对应的特征向量 v 定义了矩阵 A 在特征值作用下不改变方向的方向。特征向量的方向在变换 A 下保持不变,只是被拉伸或压缩了。

  • eigen()函数返回的结果中的特征值,它们存储在eigen_results$values中。在 R 中,特征值是按照从大到小的顺序排列的。

  • eigen()函数的结果中的特征向量,它们存储在eigen_results$vectors中。这些特征向量是归一化的,即它们的长度(或 2-范数)是 1。eigen_vectors的每一列对应于eigen_values中的一个特征值。

特征值和特征向量在数据分析中的很多方面都非常重要,例如,它们在主成分分析(PCA)和线性动力系统的稳定性分析中都有着关键作用。在机器学习中,通过特征值可以判断矩阵(或数据)的维度,以及是否可以降维。

奇异值分解

# 进行奇异值分解
svd_results <- svd(M)
svd_results$u
           [,1]       [,2]
[1,] -0.6196295 -0.7848945
[2,] -0.7848945  0.6196295
svd_results$d
[1] 9.5255181 0.5143006
svd_results$v
           [,1]       [,2]
[1,] -0.2298477  0.8834610
[2,] -0.5247448  0.2407825
[3,] -0.8196419 -0.4018960

在R语言中,svd() 函数用于执行一个矩阵的奇异值分解(Singular Value Decomposition)。奇异值分解是一种将矩阵分解为一组基本组成部分的技术,这些组成部分可以揭示矩阵的很多重要性质,比如其秩、范数以及是否存在逆矩阵等。

奇异值分解将一个m x n矩阵A分解为三个矩阵的乘积:UΣV*,即:

A = U Σ V*

其中:

  • U是一个m x m的正交矩阵(在实数情况下是正交的,在复数情况下是酉的)。

  • Σ(通常写作 Sigma)是一个m x n的对角矩阵,对角线上的元素是奇异值,按照从大到小的顺序排列。这些奇异值提供了关于矩阵A的信息,比如其范数和秩。

  • V*V矩阵的共轭转置(在实数情况下就是转置),V是一个n x n的正交矩阵。

svd()函数返回一个包含三个元素的列表:

  • d:一个包含奇异值的向量。

  • u:矩阵U

  • v:矩阵V的转置(在R中不是共轭转置,因为R默认处理的是实数矩阵)。

解线性方程组

# 解线性方程组 Ax = b
A <- matrix(c(2, 1, -1, -3, -1, 2, -2, 1, 2), nrow=3, ncol=3)
b <- c(8, -11, -3)
A
     [,1] [,2] [,3]
[1,]    2   -3   -2
[2,]    1   -1    1
[3,]   -1    2    2
b
[1]   8 -11  -3
# 解方程
solve(A, b)
[1]  39  34 -16
# 假设 A 是一个矩阵
A <- matrix(c(2, 1, 1, 3), nrow = 2)

# 求解 A 的逆矩阵
solve(A)
     [,1] [,2]
[1,]  0.6 -0.2
[2,] -0.2  0.4

在 R 语言中,solve() 函数主要用于两个目的:

  1. 求解线性方程组:当你有形如 Ax = b 的线性方程组时,其中 A 是一个已知的矩阵,b 是一个已知的向量,x 是要求解的向量。solve(A, b) 会返回方程组的解 x

  2. 求解逆矩阵:当你只提供一个矩阵 A 时,solve(A) 将计算并返回 A 的逆矩阵,前提是 A 是可逆的(即,A 是非奇异的,它的行列式不为零)。

solve() 函数在应用中非常广泛,它是数值线性代数中基本问题的标准解决工具,例如在统计学中进行线性回归分析时,就会用到这个函数来计算系数。然而,需要注意的是,当矩阵接近奇异或者条件数很大时,直接使用 solve() 函数可能会导致数值不稳定,因此在处理实际问题时需要小心使用。

范数计算

# 向量的2-范数
norm(v, type="2")
[1] 3.741657
# 矩阵的Frobenius范数
norm(M, type="F")
[1] 9.539392
  • 计算向量v的2-范数,也被称为欧几里得范数。对于向量v,其2-范数定义为向量元素平方和的平方根,即 \[\| v \|_2 = \sqrt{\sum_{i=1}^n v_i^2}\] 其中 \(v_i\)是向量 v 的第 i 个元素。这个范数在几何上可以理解为向量的长度或大小。

  • 计算矩阵M的Frobenius范数。Frobenius范数是类似于向量的2-范数的矩阵范数,它定义为矩阵元素平方和的平方根,即\[\| M \|_F = \sqrt{\sum_{i=1}^m \sum_{j=1}^n m_{ij}^2} )\]

    其中 \(m_{ij}\)​ 是矩阵 M 在第 i 行第 j 列的元素。Frobenius范数提供了一个衡量矩阵”大小”或”复杂性”的方式,它也可以被看作是矩阵元素绝对值的直观度量。

在统计学和数据科学中,这些范数用于各种应用,如优化问题(最小化向量或矩阵范数)和错误度量(比较两个向量或矩阵的差异)。