(机器学习的矩阵)(向量、矩阵与多元线性回归)

机器学习的矩阵

等公交车时我们期待大家要排队,如果 将人改为数字,也就是数字排队,这个就是矩阵(matrix)。

矩阵的表达方式

矩阵的行与列

矩阵是由row和clo(column的简写)组成。

\bigl(\begin{smallmatrix} 1 &2 &3 \\ 4 &5 &6 \\ 7 &8 &8 \end{smallmatrix}\bigr)

row翻译为行,col翻译为列。m\times n矩阵中m代表行(row),n代表列(column)。

矩阵变量名称

矩阵的变量名称常用大写英文字母表示,下列是设定矩阵的变量名称是A。

A=\bigl(\begin{smallmatrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{smallmatrix}\bigr)

常见的矩阵表达方式

其它矩阵表达方式:

\begin{bmatrix} 1 &2 \\ 3 &4 \end{bmatrix}                \begin{vmatrix} 1 & 2\\ 3 & 4 \end{vmatrix}                \begin{Vmatrix} 1 & 2\\ 3 & 4 \end{Vmatrix}

矩阵元素表达方式

矩阵元素常用下标表示,可以参考下列书写方式:

a_{ij}

i是行号,j是列号。

\begin{pmatrix} a_{11} & \cdots & a_{1n}\\ \vdots & \ddots & \vdots \\ a_{m1} & \cdots & a_{mn} \end{pmatrix}                        \begin{pmatrix} a_{1,1} & \cdots & a_{1,n}\\ \vdots & \ddots & \vdots \\ a_{m,1} & \cdots & a_{m,n} \end{pmatrix}

矩阵相加与相减

基础概念

有2个矩阵如下:

A=\begin{pmatrix} a_{1,1} & \cdots &a_{1,n} \\ \vdots & \ddots &\vdots \\ a_{m,1} & \cdots & a_{m,n} \end{pmatrix}                        B=\begin{pmatrix} b_{1,1} & \cdots &b_{1,n} \\ \vdots & \ddots &\vdots \\ b_{m,1} & \cdots & b_{m,n} \end{pmatrix}

矩阵相加或相减,相当于相同位置的元素执行相加或是相减,所以不同大小的矩阵无法执行相加减,如下所示:

A+B=\begin{pmatrix} a_{1,1}+b_{1,1} & \cdots &a_{1,n}+b_{1,n} \\ \vdots & \ddots &\vdots \\ a_{m,1}+b_{m,1} & \cdots & a_{m,n}+b_{m,n} \end{pmatrix}

A-B=\begin{pmatrix} a_{1,1}-b_{1,1} & \cdots &a_{1,n}-b_{1,n} \\ \vdots & \ddots &\vdots \\ a_{m,1}-b_{m,1} & \cdots & a_{m,n}-b_{m,n} \end{pmatrix}

矩阵加减运算的交换律与结合律是成立的。

交换律:A+B=B+A

结合律:(A+B)+C=A+(B+C)

Python实践

定义矩阵可以使用numpy的matrix()方法,有一个矩阵如下:

A=\begin{pmatrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{pmatrix}

>>> import numpy as np
>>> A=np.matrix([[1,2,3],[4,5,6]])
>>> A
matrix([[1, 2, 3],
        [4, 5, 6]])
>>>

矩阵相加与相减的应用

import numpy as np

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

print('A + B = {}'.format(A + B))
print('A - B = {}'.format(A - B))

运行结果如下:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A + B = [[ 5  7  9]
 [11 13 15]]
A - B = [[-3 -3 -3]
 [-3 -3 -3]]

[Done] exited with code=0 in 4.159 seconds

矩陈乘以实数

矩阵可以乘以实数,操作方式是每个矩阵元素乘以该实数,下列是将矩阵乘以实数k的实例。

kA=\begin{pmatrix} ka_{1,1} & \cdots & ka_{1,n}\\ \vdots & \ddots & \vdots \\ ka_{m,1} & \cdots &ka_{m,n} \end{pmatrix}

矩阵乘以实数的交换律、结合律与分配律是成立的。

交换律:kA=Ak

结合律:jkA=j(kA)

分配律:(j+k)A=jA+kA

k(A+B)=kA+kB

矩阵乘以2。

import numpy as np

A = np.matrix([[1, 2, 3], [4, 5, 6]])

print('2 * A   = {}'.format(2 * A))
print('0.5 * A = {}'.format(0.5 * A))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
2 * A   = [[ 2  4  6]
 [ 8 10 12]]
0.5 * A = [[0.5 1.  1.5]
 [2.  2.5 3. ]]

[Done] exited with code=0 in 4.375 seconds

矩阵乘法

矩阵相乘很重要一点是,左侧矩阵的列数与右侧矩阵的行数要相同,才可以执行矩阵相乘。

乘法基本规则

A矩阵是i\times j,B矩阵是j\times k

AB_{ik}=\sum_{i=1}^{n}a_{i,j}b_{j,k}

使用numpy模块,可以使用*或是@运算符执行矩阵的乘法。

import numpy as np

A = np.matrix([[1, 2], [3, 4]])
B = np.matrix([[5, 6], [7, 8]])
print('A * B = {}'.format(A * B))

C = np.matrix([[1, 0, 2], [-1, 3, 1]])
D = np.matrix([[3, 1], [2, 1], [1, 0]])
print('C @ D = {}'.format(C @ D))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A * B = [[19 22]
 [43 50]]
C @ D = [[5 1]
 [4 2]]

[Done] exited with code=0 in 2.09 seconds

乘法案例

下表是甲和乙要购买水果的数量:

名字香蕉芒果苹果
231
325

下表是超市与百货公司的水果价格:

水果名称超市价格百货公司价格
香蕉3050
芒果6080
苹果5060

计算甲和乙在超市和百货公司购买各需要多少金额。

import numpy as np

A = np.matrix([[2, 3, 1], [3, 2, 5]])
B = np.matrix([[30, 50], [60, 80], [50, 60]])
print('A * B = {}'.format(A * B))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A * B = [[290 400]
 [460 610]]

[Done] exited with code=0 in 2.403 seconds

假设各式水果热量如下:

水果热量
香蕉30卡路里
芒果50卡路里
苹果20卡路里

甲和乙各吃数量如下,计算会产生多少卡路里。

名字香蕉芒果苹果
121
212

代码如下:

import numpy as np

A = np.matrix([[1, 2, 1], [2, 1, 2]])
B = np.matrix([[30], [50], [20]])
print('A * B = {}'.format(A * B))

运行结果如下:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A * B = [[150]
 [150]]

[Done] exited with code=0 in 2.34 seconds

矩阵乘法规则

矩阵运算时,结合律和分配律是成立的。

结合律:A\times B\times C=(A\times B)\times C=A\times (B\times C)

分配律:A\times (B-C)=A\times B-A\times C

矩阵运算时,交换律是不成立的。

A\times B 不等于 B\times A

验证A\times B 不等于 B\times A

代码如下:

import numpy as np

A = np.matrix([[1, 2], [3, 4]])
B = np.matrix([[5, 6], [7, 8]])
print('A * B = {}'.format(A * B))
print('B * A = {}'.format(B * A))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A * B = [[19 22]
 [43 50]]
B * A = [[23 34]
 [31 46]]

[Done] exited with code=0 in 4.095 seconds

方形矩阵

一个矩阵如果行数(row)等于列数(column),方形矩阵(square matrix)。

单位矩阵

一个方形矩阵如果从左上到右下对角线的元素皆是1,其它元素皆是0,这个矩阵称单位矩阵(identity matrix)。

单位矩阵有时用大写英文E或I表示。

单位矩阵就类似阿拉伯数字1,任何矩阵与单位矩阵相乘,结果皆是原来的矩阵。

验证与单位矩阵相乘结果不变。

import numpy as np

A = np.matrix([[1, 2], [3, 4]])
B = np.matrix([[1, 0], [0, 1]])
print('A * B = {}'.format(A * B))
print('B * A = {}'.format(B * A))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A * B = [[1 2]
 [3 4]]
B * A = [[1 2]
 [3 4]]

[Done] exited with code=0 in 2.165 seconds

反矩阵

基础概念

只有方形矩阵(square matrix)才可以有反矩阵(inverse matrix),一个矩阵乘以它的反矩阵,可以得到单位矩阵E,可以参考下列概念。

A\times A^{-1}=E         或是        A^{-1}\times A=E

如果一个的矩阵,它的反矩阵公式如下:

A=\begin{pmatrix} a_{1,1} &a_{1,2} \\ a_{2,1} &a_{2,2} \end{pmatrix}        A^{-1}=\frac{1}{a_{1,1}a_{2,2}-a_{1,2}a_{2,1}}\begin{pmatrix} a_{2,2} &-a_{1,2} \\ -a_{2,1} & a_{1,1} \end{pmatrix}

反矩阵另一个存在条件是a_{1,1}a_{2,2}-a_{1,2}a_{2,1}不等于0。下列是一个矩阵A与反矩阵A^{-1}的实例。

A=\begin{pmatrix} 2 &3 \\ 5 &7 \end{pmatrix}                A^{-1}=\frac{1}{14-15}\begin{pmatrix} 7 &-3 \\ -5 & 2 \end{pmatrix}=\begin{pmatrix} -7 &3 \\ 5 &-2 \end{pmatrix}

Python实践

导入numpy模块,可以使用inv()方法计算反矩阵。

import numpy as np

A = np.matrix([[2, 3], [5, 7]])
B = np.linalg.inv(A)
print('A_inv = {}'.format(B))
print('E     = {}'.format((A * B).astype(np.int64)))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
A_inv = [[-7.  3.]
 [ 5. -2.]]
E     = [[1 0]
 [0 0]]

[Done] exited with code=0 in 4.747 seconds

用反矩阵解联立方程式

假设有一个联立方程式如下:

3x+2y=5

x+2y=-1

将上述联立方程式使用下列矩阵表达。

\begin{pmatrix} 3 &2 \\ 1 &2 \end{pmatrix}\begin{pmatrix} x\\ y \end{pmatrix}=\begin{pmatrix} 5\\ -1 \end{pmatrix}

\begin{pmatrix} 3 &2 \\ 1 &2 \end{pmatrix}的反矩阵是\begin{pmatrix} 0.5 &-0.5 \\ -0.25 &0.75 \end{pmatrix},在等号两边乘以相同的反矩阵,可以得到下列结果。

\begin{pmatrix} 0.5 &-0.5 \\ -0.25 &0.75 \end{pmatrix}\begin{pmatrix} 3 &2 \\ 1 &2 \end{pmatrix}\begin{pmatrix} x\\ y \end{pmatrix}=\begin{pmatrix} 0.5 &-0.5 \\ -0.25 &0.75 \end{pmatrix}\begin{pmatrix} 5\\ -1 \end{pmatrix}

推导可以得到下列结果。

\begin{pmatrix} x\\ y \end{pmatrix}=\begin{pmatrix} 3\\ -2 \end{pmatrix}

可以得到上述联立方程式的解是x=3,y=-2。

使用反矩阵概念验证上述执行结果 。

import numpy as np

A = np.matrix([[3, 2], [1, 2]])
A_inv = np.linalg.inv(A)
B = np.matrix([[5], [-1]])
print('{}'.format(A_inv * B))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
[[ 3.]
 [-2.]]

[Done] exited with code=0 in 2.025 seconds

张量

张量是数学的堆栈结构。

张量用轴空间表示。

标量则是0轴张量,向量称1轴张量,矩阵称2轴张量,3维空间称3轴张量。

定义3维数据,同时使用shape()方法列出数据外形。

import numpy as np

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

print('{}'.format(A))
print('shape = {}'.format(np.shape(A)))

执行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ch21_10.py"
[[[ 1  2]
  [ 3  4]]

 [[ 5  6]
  [ 7  8]]

 [[ 9 10]
  [11 12]]]
shape = (3, 2, 2)

[Done] exited with code=0 in 1.479 seconds

转置矩阵

基础概念

转置矩阵的概念就是将矩阵内列的元素与行的元素对调,所以n\times m的矩阵就可以转成m\times n的矩阵。

矩阵是A,转置矩阵的表达方式是A^T

Python实践

设计转置矩阵时可以使用numpy模块的transpose(),也可以使用T。

转置矩阵的应用。

import numpy as np

A = np.array([[0, 2, 4, 6],
              [1, 3, 5, 7]])              
B = A.T
print('{}'.format(B))
C = np.transpose(A)
print('{}'.format(C))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
[[0 1]
 [2 3]
 [4 5]
 [6 7]]
[[0 1]
 [2 3]
 [4 5]
 [6 7]]

[Done] exited with code=0 in 2.633 seconds

转置矩阵的规则 

转置矩阵可以再转置还原矩阵内容。

(A^T)^T=A

矩阵相加再转置,等于各矩阵转置再相加。

(A+B)^T=A^T+B^T

标量c乘矩阵再载转置,与先转置再乘以标量结果相同。

(cA)^T=cA^T

转置矩阵后再做反矩阵,等于反矩阵后转置

(A^T)^{-1}=(A^{-1})^T

矩阵相乘再转置,等于各矩阵转置后交换次序再相乘。

(AB)^T=B^TA^T

转置矩阵的应用

省略

向量、矩阵与多元线性回归

向量应用在线性回归

单纯的线性方程式如下:

y=ax+b

x代表每年的拜访数据,y是每年国际证照的销售数据。如果数据量庞大,收集了n年,则可以使用向量表达此数据。

x=(x_1\; x_2\cdots x_n)        #下标代表第n年,x_n是第n年拜访客户次数

y=(y_1\; y_2\cdots y_n)        #下标代表第n年,y_n是第n年销售考卷数

由于上述x_ny_n代入y=ax+b会有误差\varepsilon,所以可以为误差加上下标,这样误差可以使用误差向量表示:

\varepsilon =(\varepsilon_1\;\varepsilon_2\;\cdots \;\varepsilon_n)

现在的线性方程式:y=ax+b+\varepsilon

现在斜率a与截距b是标量,由于斜率a乘以向量x后会是n维向量,所以必须将标量b改为向量,如下所示:b=(b_1\;b_2\;\cdots \;b_n)

整个线性方程式执行推导:

y=ax+b+\varepsilon

\varepsilon =y-ax-b

使用最小平方法计算误差平方的总和:\varepsilon _{i}^{2}=\sum_{i=1}^{n}\varepsilon _{i}^{2}

误差向量\varepsilon的内积,推导公式:\varepsilon _{i}^{2}=\sum_{i=1}^{n}\varepsilon _{i}^{2}=\left \| \varepsilon \right \|^2

执行误差平方最小化,等同是计算向量内积:\varepsilon \cdot \varepsilon =(y-ax-b)\cdot (y-ax-b) 

向量应用在多元线性回归

在多元回归中,习惯会用\beta当作斜率的系数,截距则用\beta_0代替,整个多元回归通式可以使用下列公式表达:y=\beta _1x_1+\beta _2x_2+\cdots +\beta _nx_n+\beta _0+\varepsilon

矩阵应用在多元线性回归

省略

将截距放入矩阵

省略

简单的线性回归

省略

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习人工智能,机器学习都离不开数学基础和编程知识。无论你是数据科学的初学者还是已经从事人工智能开发的有经验人员,这门课都适合于你。为什么这么说?首先人工智能和机器学习本质上就是算法,而算法就是数学及统计学以及编程的结合。当前市场上有许多开源的软件包如SKLEARN确实可以帮助没经验的或缺乏数学或算法基础的人实现机器学习模型及预测,但这些工具无法使你真正懂得算法的本质或来源,或者无法使你在不同场合下灵活运用及改进算法。记住,在实际工作中找到适合应用场景的解决方案是最难但是最重要的。但这离不开数学基础和算法理解。比如,线性回归是一类普遍的机器学习算法,所有的机器学习软件都有现成的方法实现模型,但如果在训练数据中加入几条新数据,那么新建立的模型和原来的模型有和联系或不同?再比如,为什么深度神经网络中的Sigmoid函数一般只用到输出层?神经网络的向后传播理论如何与泰勒展开和复合函数的偏导数联系在一起?人工智能中推荐系统和文字向量如何与矩阵的奇异分解以及特征向量联系?模型中对标签进数据变换如何影响预测值?所有这些问题的答案,你都可以从本课中找到线索。本课系统地讲述了有关人工智能,机器学习背后的数学知识。特别指出,微积分和代数知识是本课的核心。统计学基础被安排在另外的课程中。除此之外,我在每一章节或主要知识点后都安排了各类程序以解释和回顾所学到的东西。最后要提到的是,这不是一门工程项目实践课。但我会另外专门安排有关人工智能,机器学习的实践课程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值