# 创建向量
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
# 创建向量
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,包含三个元素1、2和3。在 R 中,向量是一种基本的数据结构,可以包含一系列的元素。这里的向量v是一个一维数组,它可以包含数字、字符或逻辑值等类型的数据。在这个例子中,v是一个包含数字的数值型向量。
使用matrix()函数创建了一个矩阵M。matrix()函数的第一个参数是一个向量,它包含了将要填充到矩阵中的元素。在这个例子中,矩阵的元素由c(1, 2, 3, 4, 5, 6)指定。nrow=2和ncol=3是matrix()函数的参数,分别指定矩阵的行数和列数。因此,M是一个2行3列的矩阵(注意,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是这两个矩阵的乘积。为了进行矩阵乘法,左矩阵的列数必须等于右矩阵的行数。在这个例子中,M是2x3,M2是3x2,所以它们可以相乘,结果product将是一个2x2的矩阵。
创建了一个3x3的矩阵square_matrix。然后它使用R的solve()函数来计算这个矩阵的逆。一个矩阵的逆是另一个矩阵,当两者相乘时,结果是单位矩阵(对角线上都是 1,其他位置都是 0 的矩阵)。不是所有的矩阵都有逆,只有那些称为非奇异或可逆的矩阵才有逆。在这个例子中,square_matrix是非奇异的,所以solve()函数可以找到它的逆。
# 求特征值和特征向量
eigen_results <- eigen(square_matrix)
eigen_resultseigen() 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_values和eigen_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() 函数主要用于两个目的:
求解线性方程组:当你有形如 Ax = b 的线性方程组时,其中 A 是一个已知的矩阵,b 是一个已知的向量,x 是要求解的向量。solve(A, b) 会返回方程组的解 x。
求解逆矩阵:当你只提供一个矩阵 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范数提供了一个衡量矩阵”大小”或”复杂性”的方式,它也可以被看作是矩阵元素绝对值的直观度量。
在统计学和数据科学中,这些范数用于各种应用,如优化问题(最小化向量或矩阵范数)和错误度量(比较两个向量或矩阵的差异)。