【从零开始的机器学习】-05 线性代数基础

导言

【从零开始的机器学习】-04 梯度下降法中,我们介绍了梯度下降法的原理,以及如何利用梯度下降法优化一个直线模型(自变量只有1个)的参数,但是在面对现实中的问题是,我们发现自变量往往不止1个,可能是几个或者十几个,甚至成百上千个。对于更为一般的多元线性回归问题,我们要怎么去处理呢?在回答这个问题之前,我们有必要复习一些线代的基础知识,方便我们之后实现多元线性回归问题的机器学习。

1. 矩阵(Matrix)

矩阵是由[]包围的包含数字的矩形,比如: A = [ 1 2 3 4 ] A=\left[ \begin{matrix} 1 & 2 \\ 3 & 4 \end{matrix} \right] A=[1324] B = [ 1 3 5 2 4 6 ] B=\left[ \begin{matrix} 1 & 3 & 5 \\ 2 & 4 & 6\end{matrix} \right] B=[123456]

矩阵通常用 大写字母+行数x列数 表示,比如上面的两个矩阵可以表示为 A 2 × 2 , B 2 × 3 A_{2\times2}, B_{2\times3} A2×2,B2×3

而矩阵中第i行第j列的元素,可以用大写字母+第i行+第j列表示,比如矩阵A的第1行第2列的元素为 A 12 = 2 A_{12}=2 A12=2,矩阵A的第2行第1列的元素为 A 21 = 3 A_{21}=3 A21=3,矩阵B第2行第3列的元素为 B 23 = 6 B_{23}=6 B23=6

2. 向量(Vector)

向量是一种只有1列的特殊矩阵,常用小写字母表示,比如: a = [ 1 2 3 4 ] = A 4 × 1 a=\left[ \begin{matrix} 1 \\ 2 \\ 3 \\ 4 \end{matrix} \right] = A_{4\times1} a=1234=A4×1 b = [ 1 3 5 2 4 ] = B 5 × 1 b=\left[ \begin{matrix} 1 \\ 3 \\ 5 \\ 2 \\ 4 \end{matrix} \right]= B_{5\times1} b=13524=B5×1

数学中,向量表示还需要在小写字母的上方加上→,但编程中我们显然无法用这样的命名方式,因此略去→,特此声明

3. 矩阵与机器学习

初次接触线代或者机器学习的人可能会觉得有些摸不着头脑,这两者有什么关系呢?为什么要提到矩阵?关于这个问题,我们用一个例子说明。

同样是我们想要通过房子的面积推测房价,且我们已经得到了一个直线模型,其表达式为:
h ( x ) = − 50 + 0.5 × x h(x) = -50+0.5\times x h(x)=50+0.5×x

假设我们要预测4个房子的价格,其面积分别为[100,200,150,120]。不使用矩阵的情况下,我们的做法是使用for循环遍历面积数组,分别代入模型的表达式,计算出一个值,然后缓存或者输出到某个地方。

for i in Areas:
	answer.append(-50+0.5*i)
print(answer)

结果为:

那么,如果我们使用矩阵呢?我们设Areas为 A r e a s 4 × 2 = [ 1 100 1 200 1 150 1 120 ] Areas_{4\times2}=\left[ \begin{matrix} 1 & 100 \\ 1 & 200 \\ 1 & 150 \\ 1 & 120 \end{matrix} \right] Areas4×2=1111100200150120,Theta为 T h e t a 2 × 1 = [ − 50 0.50 ] Theta_{2\times1}=\left[ \begin{matrix} -50 \\ 0.50 \end{matrix} \right] Theta2×1=[500.50]

import numpy as np
Areas = np.mat([[1,100],[1,200],[1,150],[1,120]])
Theta = np.mat([[-50],[0.5]])
answer = Areas.dot(Theta)
print(answer)

结果为:

不需要for循环,直接就可以得到最终结果。Areas为由房屋面积构成的矩阵,而Theta为模型的参数构成的矩阵,二者相乘,实际上和for循环内执行的计算是等效的,但从计算机实际的运算效率上看,矩阵计算比for循环要快。通过使用矩阵,我们不仅可以减少编码量,还可以提升计算的速度(这也是高性能计算中大量使用矩阵的原因)。

上面的计算中,我们仅用了一个模型进行预测,假设我们有多个模型,想要根据Areas进行房价预测,我们只需要在Theta中添加其他模型相应的参数组成的列,就可以在不修改代码的情况下,在一次计算中就同时计算多个模型分别对Areas进行房价预测的结果。

比如我们有另外两个直线模型,参数分别为 a = [ − 40 0.25 ] a=\left[ \begin{matrix} -40 \\ 0.25 \end{matrix} \right] a=[400.25] b = [ − 70 0.75 ] b=\left[ \begin{matrix} -70 \\ 0.75 \end{matrix} \right] b=[700.75],将他们添加到Theta中,得到: T h e t a 2 × 3 = [ − 50 − 40 − 70 0.50 0.25 0.75 ] Theta_{2\times3}=\left[ \begin{matrix} -50 & -40 & -70 \\ 0.50 & 0.25 & 0.75\end{matrix} \right] Theta2×3=[500.50400.25700.75]

而代码除了添加参数外不变:

import numpy as np
Areas = np.mat([[1,100],[1,200],[1,150],[1,120]])
Theta = np.mat([[-50,-40,-70],[0.5,0.25,0.75]])
answer = Areas.dot(Theta)
print(answer)

结果为(每一列都代表一个模型对4个房子的房价预测):

4. 矩阵的加减法

4-1 矩阵与标量的加减法:

设矩阵 A = [ 1 2 3 4 ] A=\left[ \begin{matrix} 1 & 2 \\ 3 & 4 \end{matrix} \right] A=[1324],标量S=2,那么A+S的结果是A的每个元素加上标量S,得到: [ 1 + 2 2 + 2 3 + 2 4 + 2 ] \left[ \begin{matrix} 1+2 & 2+2 \\ 3+2 & 4+2 \end{matrix} \right] [1+23+22+24+2]= [ 3 4 5 6 ] \left[ \begin{matrix} 3 & 4 \\ 5 & 6 \end{matrix} \right] [3546]

而A-S的结果和A+(-S)的结果相同,A-S相当于A的每一项都加上一个负S

4-2 矩阵与矩阵的加减法:

设矩阵 A = [ a b c d ] A=\left[ \begin{matrix} a & b \\ c & d \end{matrix} \right] A=[acbd],矩阵 B = [ e f g h ] B=\left[ \begin{matrix} e & f \\ g & h \end{matrix} \right] B=[egfh],那么A+B结果是相同位置的元素相加,得到: [ a + e b + f c + g d + h ] \left[ \begin{matrix} a+e & b+f \\ c+g & d+h \end{matrix} \right] [a+ec+gb+fd+h],而A-B的结果是相同位置的元素相减,得到: [ a − e b − f c − g d − h ] \left[ \begin{matrix} a-e & b-f \\ c-g & d-h \end{matrix} \right] [aecgbfdh]。需要注意的是:只有在两个矩阵的维度相同,也就是行数和列数都相同时才能相加减,根据矩阵的加减法定义,维度不相同的矩阵相加减没有意义。

5. 矩阵的乘除法

5-1 矩阵与标量的乘除法:

设矩阵 A = [ a b c d ] A=\left[ \begin{matrix} a & b \\ c & d \end{matrix} \right] A=[acbd],标量为S,那么AxS的结果是A的每个元素乘以标量S,得到: [ a × S b × S c × S d × S ] \left[ \begin{matrix} a\times S & b\times S \\ c\times S & d\times S \end{matrix} \right] [a×Sc×Sb×Sd×S]

A ÷ S A \div S A÷S的结果和 A × 1 S A\times \frac{1}{S} A×S1的结果相同, A ÷ S A \div S A÷S相当于A的每一项都乘以一个标量S的倒数,得到: [ a / S b / S c / S d / S ] \left[ \begin{matrix} a/S & b/S \\ c/S & d/S \end{matrix} \right] [a/Sc/Sb/Sd/S]

5-2 矩阵与向量的乘法:

设矩阵 A 3 × 2 = [ a b c d e f ] A_{3\times2}=\left[ \begin{matrix} a & b \\ c & d \\ e & f\end{matrix} \right] A3×2=acebdf,向量 s 2 × 1 = [ x y ] s_{2\times1}=\left[\begin{matrix} x \\ y \end{matrix}\right] s2×1=[xy],那么 A × S A\times S A×S的结果为A的每一行与向量S对应位置的元素乘积之和构成的 3 × 1 3\times1 3×1的矩阵 B 3 × 1 = [ a x + b y c x + d y e x + f y ] B_{3\times1}=\left[\begin{matrix} ax+by \\ cx+dy \\ ex+fy \end{matrix}\right] B3×1=ax+bycx+dyex+fy。更一般地讲,对于一个m x n的矩阵A和n x 1的向量B,AxB的结果为m x 1的矩阵C,每一行 C i 1 = A 11 × B 11 + A 12 × B 21 + . . . + A 1 n × B n 1 = ∑ j = 1 n A i j × B j 1 C_{i1}=A_{11}\times B_{11}+A_{12}\times B_{21}+...+A_{1n}\times B_{n1}=\sum_{j=1}^{n}A_{ij}\times B_{j1} Ci1=A11×B11+A12×B21+...+A1n×Bn1=j=1nAij×Bj1

需要注意的是,只有在矩阵A的列数与向量的行数相同的情况下才能进行相乘,否则没有数学意义。

5-3 矩阵与矩阵的乘法:

对于一个m x n的矩阵A和n x p的矩阵B, A × B A\times B A×B的结果为一个m x p的矩阵C,矩阵C的第i列为矩阵A和矩阵B的第i列(相当于向量)的乘积。比如,矩阵 A 3 × 2 = [ a b c d e f ] A_{3\times2}=\left[ \begin{matrix} a & b \\ c & d \\ e & f\end{matrix} \right] A3×2=acebdf,矩阵 B 2 × 2 = [ x w y z ] B_{2\times2}=\left[\begin{matrix} x & w\\ y & z\end{matrix}\right] B2×2=[xywz],则 A × B A\times B A×B的结果为一个3x2的矩阵 C 3 × 2 = [ a x + b y a w + b z c x + d y c w + d z e x + f y e w + f z ] C_{3\times2}=\left[ \begin{matrix} ax+by & aw+bz \\ cx+dy & cw+dz \\ ex+fy & ew+fz\end{matrix} \right] C3×2=ax+bycx+dyex+fyaw+bzcw+dzew+fz,通过观察可以发现矩阵C的第一列元素 与 矩阵A与向量 s = [ x y ] s=\left[\begin{matrix} x \\ y \end{matrix}\right] s=[xy]的相乘结果一致,矩阵C第二列的元素 与 矩阵A与向量 s = [ w z ] s=\left[\begin{matrix} w \\ z \end{matrix}\right] s=[wz]的相乘结果一致。

同样的,只有在矩阵A的列数与矩阵B的行数相同的情况下才能进行相乘,否则没有数学意义。

5-4 矩阵乘法的交换律(commutative):

实数的乘法具有交换律:a x b = b x a,即交换两个运算子的顺序,得到的结果是一致的。

但是矩阵乘法是不存在交换律的(一般情况下):A x B ≠ B x A

证明:

假设A为m x n的矩阵,B为n x p的矩阵,那么A x B的结果为m x p的矩阵C。而B x A,如果p≠m,甚至不能计算;

即使p==m,B x A的结果为n x n的矩阵,A x B的结果为m x m的矩阵,如果m≠n,则两个结果的维度都不同,必然不一致;

即使m==n且n==p,矩阵 A 2 × 2 = [ a b c d ] A_{2\times2}=\left[ \begin{matrix} a & b \\ c & d\end{matrix} \right] A2×2=[acbd],矩阵 B 2 × 2 = [ e f g h ] B_{2\times2}=\left[ \begin{matrix} e & f \\ g & h\end{matrix} \right] B2×2=[egfh],AxB的结果为矩阵 C 2 × 2 = [ a e + b g a f + b h c e + d g c f + d h ] C_{2\times2}=\left[ \begin{matrix} ae+bg & af+bh \\ ce+dg & cf+dh\end{matrix} \right] C2×2=[ae+bgce+dgaf+bhcf+dh],BxA的结果为矩阵 D 2 × 2 = [ a e + c f b e + d f a g + c h b g + d h ] D_{2\times2}=\left[ \begin{matrix} ae+cf & be+df \\ ag+ch & bg+dh\end{matrix} \right] D2×2=[ae+cfag+chbe+dfbg+dh],二者也不相同。

5-5 矩阵乘法的结合律(associative):

实数的乘法具有结合律:对于a x b x c, (a x b) x c 与 a x (b x c)的结果是相同的。
矩阵乘法也存在结合律:对于A x B x C,(A x B) x C 与 A x (B x C)的结果是相同的。

6. 单位矩阵

实数中,实数乘以1的结果为实数本身。而矩阵中,也存在着这样的矩阵I,使得矩阵A x I = I x A = 矩阵A本身,我们将这样的矩阵I称为单位矩阵。单位矩阵 I n × n = [ 1 0 … 0 0 0 1 … 0 0 ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 … 1 0 0 0 … 0 1 ] I_{n\times n}=\left[ \begin{matrix} 1 & 0 & \dots & 0 & 0 \\ 0 & 1 & \dots & 0 & 0 \\ \vdots & \vdots &\ddots &\vdots & \vdots\\ 0 & 0 & \dots & 1 & 0 \\ 0 & 0 & \dots & 0 & 1 \\ \end{matrix} \right] In×n=1000010000100001,对角线元素为1,其余位置的元素均为0。单位矩阵 I 1 × A = A I_{1}\times A = A I1×A=A, A × I 2 = A A\times I_{2}=A A×I2=A I 1 I_{1} I1的列数和A的行数相同,而 I 2 I_{2} I2的行数与A的列数相同,因此 I 1 I_{1} I1 I 2 I_{2} I2虽然都是单位矩阵,但未必相同。

代码实现:

import numpy as np
np.identity(5) #生成一个5x5的单位矩阵

7. 逆矩阵

实数中,如果对于实数a,存在它的一个倒数1/a,则有a和1/a相乘等于1。

而对于方阵A(即行数与列数相同的矩阵),若存在着逆矩阵 A − 1 A^{-1} A1,则有 A × A − 1 = A − 1 × A = I A\times A^{-1}=A^{-1}\times A=I A×A1=A1×A=I,即矩阵A与A的逆矩阵相乘得到单位矩阵I。

就像实数中0没有倒数一样,也有一些方阵是没有逆矩阵的,我们将不存在逆矩阵的方阵称为“奇异矩阵(sigular matrix)”或“退化矩阵(degenerate matrix)”,因为他们的各个元素都非常接近0。具体的性质在此不做展开。同时,非方阵的矩阵是一定没有逆矩阵的

代码实现:

方阵A的逆矩阵为,可以用**-1计算,也可以用A.I计算,还可以调用函数numpy.linalg.inv()计算。需要注意的是,假如A为奇异矩阵,那么上述三种方法会报错。避免报错的方法为,调用numpy.linalg.pinv(),在遇到奇异矩阵时,它会返回一个伪逆矩阵,使得程序可以继续运行。

import numpy as np
A = np.mat([[1,2],[3,4]])
B = A**-1
print("A:",A)
print()
print("B:",B)
print()
print(A.dot(B))

结果:
在这里插入图片描述

8. 矩阵的转置

将一个mxn的矩阵A转换成nxm的矩阵B的操作,原来的行变成列,原来的列变成行,Bij = Aji。矩阵A的转置用 A T A^{T} AT表示。

比如:矩阵 A 3 × 2 = [ a b c d e f ] A_{3\times2}=\left[ \begin{matrix} a & b \\ c & d \\ e & f\end{matrix} \right] A3×2=acebdf,则 A T = [ a c e b d f ] A^{T}=\left[ \begin{matrix} a & c & e \\ b & d& f\end{matrix} \right] AT=[abcdef] A T A^{T} AT的维度为A的行列对调,本例子为2x3。

代码实现:

import numpy as np
A = np.mat([[1,2],[3,4],[5,6]])
print("A:",A)
print()
print("A^T:",A.T)

结果:
在这里插入图片描述

9. 预告

我们复习了一些接下来会用到的线性代数基础知识。接下来,我们将进入多元线性回归问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值