本人在学习斯坦福大学的机器学习课程,特记录课程概要内容。课程地址: Andrew Ng机器学习课程
矩阵和向量
矩阵是一个2维数组:上面的矩阵有4行3列,我们称之为 4 x 3矩阵。

所以向量是矩阵的一个子集。上面这个向量是一个 4 x 1矩阵。
符号和术语:
- Aij是指矩阵A的第i行和第j列中的元素。
- 具有“n”行的向量被称为 n-维向量。
- vi是指向量的第i行中的元素。
- 一般来说,我们所有的向量和矩阵都是 1-索引。但请注意,对于某些编程语言,矩阵是 0-索引矩阵。
- 矩阵通常用大写字母表示,而向量用小写表示。
- “标量”表示对象是单个值,不是向量或矩阵。
- ℝ是指一组标量实数。
- ℝ是指n-维向量的实数集合。
下面代码是Octave / Matlab的命令:
% The ; denotes we are going back to a new row.
A = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]
% Initialize a vector
v = [1;2;3]
% Get the dimension of the matrix A where m = rows and n = columns
[m,n] = size(A)
% You could also store it this way
dim_A = size(A)
% Get the dimension of the vector v
dim_v = size(v)
% Now let's index into the 2nd row 3rd column of matrix A
A_23 = A(2,3)
输出结果为:
A =
1 2 3
4 5 6
7 8 9
10 11 12
v =
1
2
3
m = 4
n = 3
dim_A =
4 3
dim_v =
3 1
A_23 = 6
加法和标量乘法
矩阵加法和减法是基于元素的,所以只需要简单的加减相应的元素:
矩阵减法:
加减两个矩阵,他们的 维度必须相同。
矩阵标量相乘,只需要简单的将每个元素乘以相应的标量:
矩阵标量除法,也只需要简单的将每个元素除以相应的标量:
下面代码是Octave / Matlab的命令:
% Initialize matrix A and B
A = [1, 2, 4; 5, 3, 2]
B = [1, 3, 4; 1, 1, 1]
% Initialize constant s
s = 2
% See how element-wise addition works
add_AB = A + B
% See how element-wise subtraction works
sub_AB = A - B
% See how scalar multiplication works
mult_As = A * s
% Divide A by s
div_As = A / s
% What happens if we have a Matrix + scalar?
add_As = A + s
输出结果为:
A =
1 2 4
5 3 2
B =
1 3 4
1 1 1
s = 2
add_AB =
2 5 8
6 4 3
sub_AB =
0 -1 0
4 2 1
mult_As =
2 4 8
10 6 4
div_As =
0.50000 1.00000 2.00000
2.50000 1.50000 1.00000
add_As =
3 4 6
7 5 4
矩阵-向量乘法
我们映射向量的列到矩阵的每一行,并将每个元素相乘并把结果相加:
输出的结果是一个 向量。 矩阵的列数必须和向量的行数相等。
一个 m x n 矩阵乘以一个 n x 1 维向量,结果是一个 m x 1维向量。
下面代码是Octave / Matlab的命令:
% Initialize matrix A
A = [1, 2, 3; 4, 5, 6;7, 8, 9]
% Initialize vector v
v = [1; 1; 1]
% Multiply A * v
Av = A * v
输出结果为:
A =
1 2 3
4 5 6
7 8 9
v =
1
1
1
Av =
6
15
24
矩阵-矩阵乘法
我们通过将两个矩阵分解成几个向量乘法并合并结果来乘以两个矩阵:
一个 m x n 维矩阵乘以一个 n x o 维矩阵,结果是一个 m x o 维矩阵。在上面的列子里,是一个 3 x 2 维矩阵乘以一个 2 x 2 维矩阵,结果是一个 3 x 2 维的矩阵。
两个矩阵相乘, 第一个矩阵的列数必须等于第二个矩阵的行数.
下面代码是Octave / Matlab的命令:
% Initialize a 3 by 2 matrix
A = [1, 2; 3, 4;5, 6]
% Initialize a 2 by 1 matrix
B = [1, 2; 2, 3]
% We expect a resulting matrix of (3 by 2)*(2 by 1) = (3 by 1)
mult_AB = A*B
% Make sure you understand why we got that result
输出结果为:
A =
1 2
3 4
5 6
B =
1 2
2 3
mult_AB =
5 8
11 18
17 28
矩阵乘法属性
矩阵乘法没有交换律: A∗B≠B∗A
矩阵乘法是可关联的: (A∗B)∗C=A∗(B∗C)
当单位矩阵与相同尺寸的任何矩阵相乘时,结果为原始矩阵。它就像乘数乘以1。单位矩阵在对角线上(左上角对右下角对角线)值都为1,其他地方为0。
当矩阵乘以单位矩阵时(A I),单位矩阵的维度必须与矩阵的 列 相等。当单位矩阵乘以矩阵时(IA),单位矩阵的维度必须与矩阵的 行相等。
下面代码是Octave / Matlab的命令:
% Initialize random matrices A and B
A = [1,2;4,5]
B = [1,1;0,2]
% Initialize a 2 by 2 identity matrix
I = eye(2)
% The above notation is the same as I = [1,0;0,1]
% What happens when we multiply I*A ?
IA = I*A
% How about A*I ?
AI = A*I
% Compute A*B
AB = A*B
% Is it equal to B*A?
BA = B*A
% Note that IA = AI but AB != BA
输出结果为:
A =
1 2
4 5
B =
1 1
0 2
I =
Diagonal Matrix
1 0
0 1
IA =
1 2
4 5
AI =
1 2
4 5
AB =
1 5
4 14
BA =
5 7
8 10
逆和转置
矩阵A的逆矩阵(倒数)表示为 A-1 。 矩阵乘以逆它的矩阵等于单位矩阵。
非方矩阵不具有逆矩阵。我们可以用 pinv(A) 函数和Matlab中的
inv(A) 函数计算矩阵的逆矩阵。没有逆矩阵的矩阵叫做奇异矩阵或退化矩阵。
矩阵的转置就是将矩阵沿顺时针方向旋转90°,然后反转。 在Matlab中,我们可以使用 transpose(A) 函数或 A' 来计算矩阵的转置矩阵:
就是说: A ij=A ji T
下面代码是Octave / Matlab的命令:
% Initialize matrix A
A = [1,2,0;0,5,6;7,0,9]
% Transpose A
A_trans = A'
% Take the inverse of A
A_inv = inv(A)
% What is A^(-1)*A?
A_invA = inv(A)*A
inv(A')
输出结果为:
A =
1 2 0
0 5 6
7 0 9
A_trans =
1 0 7
2 5 0
0 6 9
A_inv =
0.348837 -0.139535 0.093023
0.325581 0.069767 -0.046512
-0.271318 0.108527 0.038760
A_invA =
1.00000 -0.00000 0.00000
0.00000 1.00000 -0.00000
-0.00000 0.00000 1.00000
ans =
0.348837 0.325581 -0.271318
-0.139535 0.069767 0.108527
0.093023 -0.046512 0.038760