机器学习(三) 线性代数-矩阵
矩阵
矩阵是一个二维的数据集合。我们将矩阵表示为列表的列表,每个内部列表的大小都一样,表示矩阵的一行。如果A是一个矩阵,那么A[i][j]
就表示第i行第j列的元素。
按照数学表达的惯例,我们通常用大写字母表示矩阵。例:
A = [[1,2,3], # A有2行3列
[4,5,6]]
B = [[1,2], # B有3行2列
[3,4],
[5,6]]
数学中,矩阵的第一行通常称为"第一行",第一列通常称为"第一列"。我们需要将矩阵的形式和python的列表统一:python中的列表从0开始索引,所以,我们将矩阵第一行通常称为"第0行",第一列通常称为"第0列"。
基于列表的列表这种表达形式,矩阵A具有len(A)和len(A[0])列,这种称为形状。
def shape(A):
num_rows = len(A)
num_cols = len(A[0]) if A else 0 #第一行中元素的个数
return num_rows,num_cols
A = [[1,2],
[3,4],
[5,6]]
shape(A)
如果一个矩阵有n行k列,则可以记为n x k矩阵。我们可以把这个n x k矩阵的每一行都当作一个长度为k的向量,把每一列都当作一个长度为n的向量。
def get_row(A,i):
return A[i] # A[i]是第i行
def get_column(A,j):
return [A_i[j] for A_i in A] #每个A_[i]行的第j个元素
get_row(A,2)
[5,6]
get_column(A,1)
[2,4,6]
我们也可以根据形状和用来生成元素的函数来创建矩阵,这里举个创建单位矩阵(对角线元素是1,其他元素是0)的例子:
def entry_fn(i,j):
return 1 if i==j else 0
def make_matrix(num_rows,num_cols,entry_fn):
return [[entry_fn(i,j) for j in range(num_cols)]for i in range(num_rows)]
make_matrix(5,5,entry_fn)
结果如下:
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]]
矩阵很重要:
1.通过把每个向量看出是矩阵的一行,矩阵表示一个包含多维向量的数据集。
例如:有10万人的身高、体重和年龄,就可以创建一个100000 x 3的矩阵,不会在markdown中输入数学符号,点这里:
[ 174 62 25 169 65 30 ⋮ ⋮ ⋮ 176 61 29 ] \begin{bmatrix}174&62&25\\169&65&30\\\vdots&\vdots&\vdots\\176&61&29\end{bmatrix} ⎣⎢⎢⎢⎡174169⋮1766265⋮612530⋮29⎦⎥⎥⎥⎤
2.可以用n x k矩阵表示一个线性函数,这个函数将一个k维的向量映射到一个n维的向量上。
{ Y 1 = β 1 X 11 + β 2 X 21 + β 3 X 31 + ⋯ + β k X k 1 Y 2 = β 1 X 12 + β 2 X 22 + β 3 X 32 + ⋯ + β k X k 2 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ Y n = β 1 X 1 n + β 2 X 2 n + β 3 X 3 n + ⋯ + β k X k n \begin{cases}Y_1=\beta_1X_{11}+\beta_2X_{21}+\beta_3X_{31}+\cdots+\beta_kX_{k1}\\Y_2=\beta_1X_{12}+\beta_2X_{22}+\beta_3X_{32}+\cdots+\beta_kX_{k2}\\\cdots\cdots\cdots\cdots\cdots\cdots\cdots\cdots\cdots\cdots\cdots\cdots\cdots\cdots\\Y_n=\beta_1X_{1n}+\beta_2X_{2n}+\beta_3X_{3n}+\cdots+\beta_kX_{kn}\end{cases} ⎩⎪⎪⎪