线性代数之一:方程组与矩阵

1.1 线性方程组

1.1.1 方程组定义

一个m个方程,n个未知数的方程组定义如下:

a11x1+a12x2+...+a1nxna21x1+a22x2+...+a2nxnam1x1+am2x2+...+amnxn=b1=b2=bm(1)

其中 aij bi 均为实数,(1)称为m*n的线性方程组。若方程组有解,则称其为相容的(consistent),否则为不相容的。

1.1.2 等价方程组

定义:若两个含有相同变量的方程组具有相同的解集,则称它们是等价的。
有三种运算可以得到一个等价的方程组:

  • 交换任意两个方程的顺序
  • 任一方程两边同乘一个非零的实数
  • 一方程的倍数加到另一个方程上

1.1.3 系数矩阵

把(1)式中的系数与一个m*n的阵列联系起来,称这个了阵列为方程组的系数矩阵(coefficient matrix),若m=n则称此矩阵为方阵。

a11a21am1a12a22am2.........a1na2namn

如果在系数矩阵的右侧添加一列方程组的右端项,则得到新的矩阵:
a11a21am1a12a22am2.........a1na2namnb1b2bm

称这个矩阵为方程组的增广矩阵(augmented maxtrix)。

1.1.4 解方程组

传统的解方程组即消元法,有了矩阵这个工具后,方程组的求解可以通过对增广矩阵做行运算得到:

  • 交换两行
  • 以非零实数乘以某行
  • 将某行替换为它与其他行的倍数的和

对于大型方程组,需要借助于计算机求解,下面的代码示例使用numpy求解方程组的解:

# 3x + y  = 9 
# x  + 2y = 8
import numpy as np

a = np.array([[3,1],[1,2]])
b = np.array([9,8])
result = np.linalg.solve(a,b)
print result #[ 2.  3.]

1.2 行阶梯形

1.2.1 行阶梯形矩阵定义

若一个矩阵满足下面三个条件,则称其为行阶梯形矩阵(row echelon form)

  1. 每一非零行中的第一个非零元素为1
  2. 第k行的元素不全为零时,第k+1行的首变量之前零的个数多于第k行首变量之前零的个数
  3. 所有元素均为零的行必在不全为零的行之后

右边的矩阵是行阶梯形: 100300110030
使用行运算,将线性方程组的增广矩阵化为行阶梯形的过程称为高斯消元法(Gaussian elimination)

若一个线性方程组中方程的个数多于未知数的个数,则称其为超定的。通常不相容
若方程个数少于未知数的个数,则其为亚定的。通常相容,且有无穷解。

1.2.2 行最简形定义

若一个矩阵满足,矩阵是行阶梯形,且第一行的第一个非零元是其所在列的性非零元,则称矩阵为行简形。下面的矩阵是行最简形的

100010001321

基于基本行运算将矩阵化为行最简形的过程称为Guass-Jordan消元法。

如果线性方程组的右端项全为零,则称其为齐次的。齐次方程组总是相容了,因为全零即为其一个解。

1.3 矩阵算术

1.3.1 矩阵记号

A=A(aij)=a11a21am1a12a22am2.........a1na2namn

行向量:一个1*n的矩阵,如 [1234]
列向量:一个m*1的矩阵, 如 123

对一个m*n的矩阵A,A的行向量表示为

ai=(ai1,ai2,...,ain),i=1,2,..,m

A的列向量表示为
aj=a1ja2jamjj=1,2...,n

矩阵A可以用其列向量或其行向量表示:
A=(a1,a2,...,an)=a⃗ 1a⃗ 2a⃗ m

1.3.2 算术法则

标量乘法:若A为m*n的矩阵,且n为一标量,则二者乘积矩阵B为

nA(aij)=B(bij=naij)

矩阵加法:若A,B均为m*n的矩阵,其和矩阵C为
A(aij)+B(bij)=C(cij=aij+bij)

1.3.3 矩阵乘法与线性方程组

对于方程组(1),若令

A=a11a21am1a12a22am2.........a1na2namn,x=x1x2xn,b=b1b2bm

并定义乘积Ax为
Ax=a11x1+a12x2+...+a1nxna21x1+a22x2+...+a2nxnam1x1+am2x2+...+amnxn=a⃗ 1xa⃗ 2xa⃗ mx(2)

则线性方程组(1)等价于矩阵(2)。同样的将线性方程组表示为矩阵列向量和的形式:
Ax=x1a11a21am1+x2a12a22am2++xna1na2namn=x1a1+x2a2+...+xnan

矩阵乘法定义:若 A=(aij) 为一个m*n的矩阵,矩阵 B=(bij) 是一个n*r的矩阵,则乘积 AB=C(cij) 为一个m*r的矩阵,其元素定义为:

cij=a⃗ ibj=k=1naikbkj

1.3.4 线性组合

a1,a2,...,anRmx1,x2,...,xn:x1a1+x2a2+...+xnana1,a2,...,an 的一个线性组合

线性方程组相容性定理:
一个线性方程组Ax=b相容的充要条件是向量b可写为矩阵A列向量的一个线性组合。

1.3.5 矩阵转置

一个m*n的矩阵A的转置为n*m的矩阵,定义为: AT(bij=aji)
若一个方阵A,满足 AT=A ,则称A是对称的(symmetric)。

转置的代数法则:

  • (AT)T=A
  • (cA)T=c(AT)
  • (A+B)T=AT+BT
  • (AB)T=BTAT

1.3.6 矩阵乘法应用

现代检索技术是基于矩阵与线性代数的。在典型的情况下,一个数据库包含一组文档,且我们希望通过搜索条件找出最符合需要的文档。假设数据库包含m个文档与一个字典,字典包含了文档中排重后的关键字,字典包含的词数为n,且按字典序排序。
我们将数据库表示为一个m*n的矩阵A,这个矩阵的第i行表示字典中第i个关键字在各个文档中的TF-IDF。如果一次检索包含多个关键字,将其表示为一个n*1的列向量 x ,如果字典中第i个关键字包含在检索中,则x的第i个元素为1。为完成检索,只需要计算ATx,结果为一个n*1的列向量,每行对应一个文档与搜索条件的匹配度,选择其中值最大的即为最匹配的结果。在第5章,可以通过向量夹角的余弦cos值来计算匹配度。

1.4 矩阵代数

1.4.1 运算法则

下列法则对任何标题n和m及矩阵A B C都是成立的:
交换率:A+B = B+A
结合率:(A+B)+C = A+(B+C) (AB)C = A(BC)
分配率:A(B+C) = AB + AC

1.4.2 矩阵的逆

定义:单位矩阵 I=δij ,其中

δij={10 i=j ij

定义:矩阵的逆,若存在矩阵B使用 AB=BA=I ,则称方阵A是可逆的(invertible)或非奇异的(nonsingular),矩阵B称A的逆,记作 A1 。注意,只有方阵才可能可逆,非方阵不应使用奇异或非奇异的这一说法。

定理:若A B均为非奇异的方阵,则AB也是非奇异的,且 (AB)1=B1A1
更一般的有 (A1A2...Ak)1=A1k...A12A11

1.4.3 使用numpy进行矩阵运算

下面使用python代码计算上面两节介绍的运算

import numpy as np
A = np.array([[1,2,3],
              [4,5,7],
              [7,8,9]])
I = np.eye(3) #三阶单位矩阵
print 3*A #标量乘法
print A+I #矩阵加法
print A.T #A的转置
print np.dot(A, I) #矩阵乘法
print np.linalg.inv(A)   #计算A的逆

1.5 初等矩阵

1.5.1 定义

定义初等矩阵:如果从单位矩阵 I 开始,只进行一次初等行运算,得到的矩阵称为初等(elementary)矩阵,因此有三类初等矩阵,以n=3为例。
交换两行 E1=010100001
一行乘积 E2=100010003
乘后加行 E3=100010301
一般的,若E为n阶初等矩阵,A为n*r的矩阵,E*A的作用就是对A进行相应的行运算。A*E的作用就是对A进行相应的列运算。
定理:若E为一初等矩阵,则E是非奇异的,且E的逆与它同类型的初等矩阵。
定义:若存在一个有限初等矩阵的序列使得 B=E1E2...EkA ,则称A与B是行等价的。
定理:非奇异矩阵的等价条件:若A是n阶方阵,则下列陈述是等价的

  • A是非奇异的
  • Ax=0仅有平凡解0
  • A与I行等价

若A是非奇异的,则有

i=1kEiA=I

在等式两边乘以 A1
i=1kEiI=A1

这给出了计算A的逆的方式,即将A和I写为增广形式,并利用初等行去处将其中的A转换为I,则I将转换为 A1 。即 (A|I) 的行最简形为 (I|A1)

因此也可以通过求逆计算线性方程组Ax=b的解,即 x=A1b

1.5.2 LU分解

对于方阵A
上三角矩阵:当 i>j 时, aij=0
下三角矩阵:当 i<j 时, aij=0
三角形矩阵:上三角和下三角的统称
严格三角形:对角元素非零的三角形矩阵
对角形矩阵:当 ij 时, aij=0

定义:将矩阵A分解为一个单位下三角矩阵L和一个严格上三角矩阵U的乘积的过程,称为LU分解。LU分解只需要对A使用第三种行运算化简为严格上三角形,即可完成。LU分解在消元过程中十分有用。

LU=11/22013001200430218=214451229=A

1.5.3 使用scipy对矩阵LU分解

import scipy.linalg

A = np.array([[1,2,3],
              [4,5,7],
              [7,8,9]])

l,u = scipy.linalg.lu(A,True)
print l,u

1.6 备注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值