大部分刚入门人工智能的小伙伴们应该都是以下几种情况之一:
然而现在各种关于人工智能的教学视频或资料,讲的内容都太广,缺少重点,且不涉及编程实战,更不可能把数学知识与人工智能关联起来。
所以博主我重新拿起10年前本科、研究生学习的课程,结合自己多年的人工智能实战经验与python编程技巧,给大家重点从三大数学知识进行讲解,紧扣数学知识与AI实战的关系,实现数学原理到机器学习、深度学习开发的完美过渡,希望能帮助到小伙伴们在3天内快速学习人工智能必学数学基础。
第一篇既然是给大家分享《线性代数》相关知识点,那就有必要先把书拿出来,我们先看看,真要从头学到尾,应该是怎样的?
附上本人大学期间的课本、目录和笔记照片,还有成绩单:
小伙伴肯定好多疑问,博主你这是要干嘛?给我们炫笔记,炫成绩?下次你是不是还要把高等数学成绩再炫下,然后,就没有然后了,我们不再做朋友了。
哈哈,我只是想告诉小伙伴们,为了写这篇博客,我仔细从头到尾重新翻阅了我从前那七大章150多页的经典线性代数所有内容:从行列式、矩阵、线性方程组,到n维向量、特征值与特征向量,再到二次式,最后是线性空间与线性变换。最后结合我这些年人工智能的经验,我发现了一个重大的秘密:
我们学人工智能,如果只是应用,不是深入理论或很深的算法研究,根本不需要从头到尾去学,更不用像大学一样去考试,如果真要考试,可能你考个30分就能达到人工智能的要求了!
因为人工智能涉及到线性代数的知识点仅仅只有其中的30%左右!
所以从现在开始你需要做的就是把以前的一切归零,跟着我开始三天轻松学习吧!
提示:以下是本篇文章正文内容,下面案例可供参考
我们学这些复杂枯燥的数学知识,可以从最简单的应用开始,因为我们学东西从简入难,就不会那么难入门了,不然刚开始就拿那么多公式推导放到你面前,我相信谁都不会产生兴趣,到时就真的是从入门到放弃了。
所以我先给大家讲讲矩阵在AI中的应用,让大家能对矩阵有个直观的理解,而且学到后面我也不建议大家去做复杂的公式推导或者运算。把所有这些复杂的运算都交给计算机去做吧。
大家在初中时候,肯定学过最简单的线性方程 y = 2x + 1。
意思就是我输入一个x值,通过它与系数a(这里就是2)相乘,加上一个常量b(这里就是1),最后就能求得目标值y。
这里展开来说,如果y有多个值y1,y2,y3…,x也有多个因子x1,x2,x3…时候对应系数a也有多个:a1,a2,a3…,我们如果还是以初高中的方法来表示的话。我们就会像下面这样写,要写很长的一些方程或表达式:
而这时候我们充满智慧的祖先,就发明了矩阵的数学形式,用来简化方程/函数之间的表达,同时根据输入x、输出y值,最后求解到最优系数解。
简单举个小丽相亲的例子来说明:
小丽要去相亲,她给每个来相亲的人,建立了一个excel表格,同时给每一个人,进行了打分。小丽就一直想,相亲了这么多次,大部分都遇到的是不合适的人选,至今都没有遇到一个满分的人选,浪费了好多时间。
那有没有好方法来帮到她呢?最好是那种先不用去相亲,能提前先通过一定的方式来筛选出可以打分在8以上的,如果低于8分的,就不去了,这样就能节省好多时间了。
这里就涉及到机器学习最重要的一个应用,就是建立函数/方程进行回归预测啦。那如何能把这些数据用数学方式来表达呢?
我们来看,常规的函数/方程表达式我们会这样来写:
用上矩阵,我们就能用下面的简单方式来写,瞬间小a变大A,然后直接通过矩阵运算,最优化求解就能找到我们想要的函数啦。
是不是很神奇、很简洁、很清晰!!
当然矩阵除了在机器学习中能运用,在深度学习中,也是应用非常广的,比如拿图像分类来说,我们人眼看到的是颜色、现状,把它用数字表达出来,就是像素点(x,y)对应不同的像素值(0-255),这里面是不是就直接和矩阵的m行n列对应上啦!
脑海中你可以想象下,如果你用传统数学表达式来进行图像的表达及运算,对于现在动不动都是6000*8000像素(4800万)甚至现在都达到1亿像素的图片来说,那我们少说也得写成千上万个表达式才能表达。但用矩阵来表示的话,就能轻松加愉快地搞定了。
最后我想说的是,正所谓大道至简,把线性代数拆开来说,就是把复杂问题通过近似拟合成一条简单线性函数,然后代入X、Y值,求解相关系数A和B,最后就可以得到我们想要的函数。而这里面为了能让我们更加简洁表达及运算,我们就引入了矩阵这一牛逼的数学形式。
大家可以记住这个最简单的表达式Y = AX + B,因为致繁归致简,所有复杂的线性问题或者非线性问题,最后都可以转化或者近似转化为该表达式,然后进行优化分析的。
这里大家可以简单看下百度百科的解释:
在数学中,**矩阵(Matrix)**是一个按照长方阵列排列的复数或实数集合。
我觉得用通俗的话来说,矩阵就是用行与列的数学方式,建立X、Y的函数关系。
矩阵运算,除了有矩阵之间的加、减、乘运算之外,还有矩阵的转置、分解与逆运算。
把矩阵运算简单理解为我们中小学学到的数与数之间加、减、乘运算,但是是多了很多行列的数,然后按照一定的规则来进行运算,这就能理解矩阵的线性运算(矩阵的加减法和矩阵的数乘合称矩阵的线性运算)了。
矩阵加/减法:就是矩阵元素分别对应相加/减。其中加法满足交换律与结合率。注意要同型矩阵才能进行加减运算。
同型矩阵:行数、列数分别相同的矩阵。比如矩阵A为2行3列,矩阵B也为2行3列,那么矩阵A和矩阵B就是同型矩阵了。
矩阵的数乘:单个数与矩阵元素分别相乘。其满足交换律、结合律与分配律。
负矩阵:矩阵元素互为相反数关系的矩阵。就是A=-B,这里矩阵A的每个元素与矩阵B对应的每个元素互为相反数。
当然除了线性运算,矩阵还有很多它的特性运算。如:
[ 2 4 3 0 − 2 8 ] T = [ 2 0 4 − 2 3 8 ] \left[\begin{array}{ccc} 2 & 4 & 3 \\ 0 & -2 & 8 \end{array}\right]^{T}=\left[\begin{array}{cc} 2 & 0 \\ 4 & -2 \\ 3 & 8 \end{array}\right] [204−238]T=⎣⎡2430−28⎦⎤
矩阵的分解:小伙伴们肯定会有疑问,矩阵除法哪里去了。矩阵其实没有除法,但是矩阵可以分解成比较简单的或具有某种特性的若干矩阵的和或乘积,这里就不展开说了。
学习机器学习比较深入的小伙伴,可能会了解到矩阵的分解法一般有三角分解、谱分解、奇异值分解、满秩分解等。但我觉得对于只学基础来说,其实不用太较真,只要懂什么意思就差不多了,不用对公式推导下太多功夫。
矩阵乘法:这里面最容易不小心弄错的,就是矩阵之间的乘法运算了。
简单来说:矩阵与矩阵相乘,就是左边矩阵行元素与右边矩阵列元素依次相乘并求和。举例如下:
根据其运算规则,我们也能知道:
只有在下列情况下,两个矩阵的乘法才有意义,或说乘法运算是可行的:左矩阵的列数=右矩阵的行数。
另外矩阵的乘法满足结合律、左分配律、右分配律,但矩阵乘法不满足交换律。大家可以看下面这个例子,AB是3X3矩阵,BXA是1X1矩阵,AB并不等于BA。
A
B
=
[
a
1
a
2
a
3
]
[
b
1
b
2
b
3
]
=
[
a
1
b
1
a
1
b
2
a
1
b
3
a
2
b
1
a
2
b
2
a
2
b
3
a
3
b
1
a
3
b
2
a
3
b
3
]
B
A
=
[
b
1
b
2
b
3
]
[
a
1
a
2
a
3
]
=
b
1
a
1
+
b
2
a
2
+
b
3
a
3
\begin{array}{l} A B=\left[\begin{array}{l} a_{1} \\ a_{2} \\ a_{3} \end{array}\right]\left[\begin{array}{lll} b_{1} & b_{2} & b_{3} \end{array}\right]=\left[\begin{array}{ccc} a_{1} b_{1} & a_{1} b_{2} & a_{1} b_{3} \\ a_{2} b_{1} & a_{2} b_{2} & a_{2} b_{3} \\ a_{3} b_{1} & a_{3} b_{2} & a_{3} b_{3} \end{array}\right] \\ B A=\left[\begin{array}{lll} b_{1} & b_{2} & b_{3} \end{array}\right]\left[\begin{array}{l} a_{1} \\ a_{2} \\ a_{3} \end{array}\right]=b_{1} a_{1}+b_{2} a_{2}+b_{3} a_{3} \end{array}
AB=⎣⎡a1a2a3⎦⎤[b1b2b3]=⎣⎡a1b1a2b1a3b1a1b2a2b2a3b2a1b3a2b3a3b3⎦⎤BA=[b1b2b3]⎣⎡a1a2a3⎦⎤=b1a1+b2a2+b3a3
逆矩阵:逆矩阵有点类似我们中小学学过的数a的倒数1/a。设A是一个n阶矩阵,若存在另一个n阶矩阵B,使得: AB=BA=E(E为单位矩阵),则称方阵A可逆,并称方阵B是A的逆矩阵(可用A的-1次方来表示)。这里也大概知道其意思即可,不用深入去推导公式,因为这些都可以交给计算机去做!
好啦,到这里就可以结束矩阵的运算了,是不是除了矩阵特性运算稍微难一点点,其它的无非就是中小学加减乘运算。所以说学习线性代数不要怕,So Easy!!
向量相对矩阵就更简单了,我们只要了解行向量与列向量即可。
只有一行的矩阵就是行向量。
x
=
[
x
1
x
2
…
x
m
]
\mathbf{x}=\left[\begin{array}{llll} x_{1} & x_{2} & \ldots & x_{m} \end{array}\right]
x=[x1x2…xm]
只有一列的矩阵就是列向量。
x
=
[
x
1
x
2
⋮
x
m
]
\mathbf{x}=\left[\begin{array}{c} x_{1} \\ x_{2} \\ \vdots \\ x_{m} \end{array}\right]
x=⎣⎢⎢⎢⎡x1x2⋮xm⎦⎥⎥⎥⎤
向量的基本运算,只要知道两点即可:
那行向量和列向量会应用到哪里呢?其实在上面小丽相亲的案例中,我们就已经应用到了,Y、A和B就是列向量。
安装Anaconda(装Anaconda就不需要单独装python,Anaconda 是一个python的发行版,包括了python和很多常见的软件库, 和一个包管理器conda)
详见:https://zhuanlan.zhihu.com/p/75717350
如果你安装的是Anaconda发行版时,就会自动安装Jupyter Notebook(Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。)
其官方介绍:https://jupyter-notebook.readthedocs.io/en/stable/notebook.html
一般来说最新版本的Anaconda都是包括了基本的数学库numpy、pandas与matplotlib,不用重新安装,如果没有安装,可以用conda install指令进行安装。
其中:
Numpy是一个用来支持大量的维度数组与矩阵运算的基础软件包,核心:基于N维数组对象ndarray的数组运算。
官方网站:www.numpy.org.cn
Pandas是一个强大的分析结构化数据的工具集,可用于快速实现数据导入/出、索引,学好它,就可以实现常用的Excel自动化办公了。
官方网站:www.pypandas.cn
Matplotlib是Python的基础绘图库,几行代码即可生成绘图,直方图、条形图、散点图,信手拈来,绝对是你数据可视化的重要工具。
官方网站:www.matplotlib.org.cn
安装代码如下:
conda install numpy conda install pandas conda install matplotlib
我们通过下面这个例题来为大家讲解下如何在Jupyter Notebook中实现矩阵的相关运算。
A
=
[
1
2
3
4
5
6
7
8
9
]
B
=
[
3
2
1
6
5
4
9
8
7
]
A=\left[\begin{array}{lll} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right] \quad B=\left[\begin{array}{lll} 3 & 2 & 1 \\ 6 & 5 & 4 \\ 9 & 8 & 7 \end{array}\right]
A=⎣⎡147258369⎦⎤B=⎣⎡369258147⎦⎤
C
=
[
1
2
3
4
5
6
]
D
=
[
2
3
4
]
C=\left[\begin{array}{ll} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{array}\right] \quad D=\left[\begin{array}{l} 2 \\ 3 \\ 4 \end{array}\right]
C=⎣⎡135246⎦⎤D=⎣⎡234⎦⎤
上面分别是矩阵A、B、C、D,我们接下来通过编程分别来实现求解矩阵E、F、G、H、I。
E
=
A
+
B
;
F
=
A
−
B
;
G
=
A
⋅
B
;
E=A+B ; F=A-B ; G=A \cdot B ;
E=A+B;F=A−B;G=A⋅B;
H
=
−
A
;
I
=
A
⋅
D
H=-A ; I=A \cdot D
H=−A;I=A⋅D
使用Jupyter Notebook演示如下:
全部代码如下:
import numpy as np A = np.array([[1,2,3],[4,5,6],[7,8,9]]) # 矩阵就是用numpy的array数组形式来表示的 print(A) print(A.shape) # 查看A行列数,这里可以看出A为一个3X3的矩阵 B = np.array([[3,2,1],[6,5,4],[9,8,7]]) C = np.array([[1,2],[3,4],[5,6]]) D = np.array([[1],[2],[3]]) print(B.shape,C.shape,D.shape) # 分别查看B、C、D行列数 print(B) print(C) print(D) E = A + B print(E.shape) # 查看E行列数 print(E) F = A - B G = np.dot(A,B) # 注意矩阵相乘,是用numpy库中的.dot点乘操作 H = -A print(F) print(G) print(H) print(F.shape,G.shape,H.shape) # 分别查看F、G、H行列数 I = np.dot(A,D) # 注意矩阵相乘,是用numpy库中的.dot点乘操作 print(I) print(I.shape) # 查看I行列数,可以看出矩阵点乘向量,还是向量
好啦,到这里就结束关于人工智能必学数学基础第一天线性代数篇了,相信小伙伴们从矩阵、向量基础知识再到矩阵、向量基本运算都有了一定的了解,并且也通过实战编程体会到了Python计算机编程语言对线性代数的强大计算能力了。
下一篇,我们会继续用浅显易懂、实战编程的方式为大家继续讲解关于人工智能必学数学基础——第二天微积分篇,欢迎大家继续支持我 关注、收藏,点赞,一键三连。
另外如果有任何问题,可以随时评论区留言或者私信我。
本文只供大家学习相关知识使用,不以任何商业盈利为目的,转载或分享请注明相关来源。如涉及到相关侵权,请联系我删除。
欢迎志同道合者互相交流学习,可以加我微信号:Zhihua_Steven,或者扫以下二维码添加我的微信。