矩阵方程
无论是在数学上还是在R语言中,线性代数方程都可以起到简化描述与操作的作用,本篇的主要内容是对这种矩阵方程进行简单介绍。
- 方程组求解
线性代数当初被发明出来是为了解决如下的线性方程组求解的问题:
现在也确实证明在一般情况下线性代数确实可以很好地解决这一问题,接下来我们便将一起学习如何用矩阵代数方程进行如下求解:
向量、矩阵和标量
在代数上,我们使用如下方式来表示向量,且该向量可默认为是一个N行1列的矩阵:
而协方差或自变量使用如下方式表示:
两个向量相乘的表示方法:
在R中,向上方N行两列的矩阵用cbind()
函数就可以生成:
n <- 25
tt <- seq(0,3.4,len=n) ##time in secs, t is a base function
X <- cbind(X1=tt,X2=tt^2)
head(X)
## X1 X2
## [1,] 0.0000000 0.00000000
## [2,] 0.1416667 0.02006944
## [3,] 0.2833333 0.08027778
## [4,] 0.4250000 0.18062500
## [5,] 0.5666667 0.32111111
## [6,] 0.7083333 0.50173611
列的矩阵表示方法如下:
而相应的在R中,可以使用matrix()
函数生成:
N <- 100; p <- 5
X <- matrix(1:(N*p),N,p)
head(X)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 101 201 301 401
## [2,] 2 102 202 302 402
## [3,] 3 103 203 303 403
## [4,] 4 104 204 304 404
## [5,] 5 105 205 305 405
## [6,] 6 106 206 306 406
dim(X)
## [1] 100 5
默认情况下,矩阵是一列一列的进行数字进行填充的,添加参数byrow=TRUE
即可变为按行填充。
而标量就是一个数字,使用小写非黑体符号表示。
矩阵与常量相乘
如果是一个常量,是一个矩阵,那么:
R中矩阵的乘法也很容易实现,使用*号即可:
X <- matrix(1:12,4,3)
print(X)
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
a <- 2
print(a*X)
## [,1] [,2] [,3]
## [1,] 2 10 18
## [2,] 4 12 20
## [3,] 6 14 22
## [4,] 8 16 24
矩阵转置
矩阵转置就是把行与列的内容进行交换,在R中使用t()
函数即可实现,转换后矩阵的维度为:
X <- matrix(1:12,4,3)
X
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
t(X)
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
矩阵乘法
仍以本文一开始的方程组为例:
若使用矩阵代数去计算的话,其实就是先用第一个矩阵第一行中的每一个元素分别与第二个矩阵的第一列的相应位置上的元素相乘,然后求和,其数值就是结果矩阵的第一行第一列的内容。后面以此类推。。。因为第二个矩阵只有一列,所以上述方程组的计算可如下表示:
在R中可以使用solve()
函数进行求解:
X <- matrix(c(1,3,2,1,-2,1,1,1,-1),3,3)
y <- matrix(c(6,2,1),3,1)
solve(X)%*%y #equivalent to solve(X,y)
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
Please note that solve is a function that should be used with caution as it is not generally numerically stable
网友评论