机器学习数学基础之线代篇——线性代数python手册(建议收藏)(代码片段)

水龙吟唱 水龙吟唱     2022-12-30     359

关键词:

提到线性代数,又不得不吐槽国内教材了,学起来真的是实力劝退。有多少跟着国内教材学完线性代数课程后,知道线性代数是什么,它到底是干什么的?

事实上如果你后面想做科研、想研究机器学习、深度学习,你会发现处处是线性代数。这么抽象又重要的课程,一本书里基本看不到几张图,就好比是没有注释的代码,大概以为我的脑子就是记公式的机器吧…

如果你还未开始学习线性代数,那么强烈建议你把学校发的紫色教材放在一边,找几本国外的线性代数教材看看。然后在B站里搜一下麻省理工公开课Gilbert Strang老爷子的线性代数视频,相信你会打开新世界的大门(文末有彩蛋)——


吐槽就到这,我们先来看一个涉及线性代数本质问题的式子:
y = A x y=Ax y=Ax
可以说,线性代数的很多问题都是从这个式子出发的。那么在线性代数中,如何理解这个式子呢?

直观上看,这个式子跟我们熟悉的一次函数 y = kx比较像。对于y=kx,我们可以理解为将标量x经过 某种线性变换,得到另一个标量y。

这里,我们把x和y换成向量,对于y = Ax,我们可以理解为将矩阵A(线性变换)作用于向量x ,得到另一个向量y。

由于向量就是空间中的一个点,这个种线性变换的作用就是将空间中的一个点变为空间中的另一个点。

对于函数y=kx,如果我们知道y和k,就能够求解出x。对于y=Ax也一样,如果y和A已知,我们同样可以求出x,这就是求解线性方程组的问题了。

其他知识点都是从这些基本的概念衍生出来的,这里就不一一列举了。任何新知识都不是凭空出来的,都是建立在以前的理论基础之上。在学习数学的时候,可以多联系以前的知识,类比着学习。


线性代数概念较多,计划在另一篇总结基本概念,这里仅总结线性代数里一些重要概念的python程序。

1 矩阵基本操作

注:向量操作与矩阵类似。

1.1 创建矩阵

(1)通过列表创建矩阵

#通过列表创建矩阵
import numpy as np
m = [[1,2,3],[4,5,6],[7,8,9]]  
a1 = np.array(m)
print("a1:",a1)
print("a1的大小:" ,a1.shape)
print("a1的类型:",type(a1))

(2)通过元组创建矩阵

#通过元组创建矩阵
t = ((1,2,3),(4,5,6),(7,8,9)) 
a2 = np.array(t)
print("a2:",t)
print("a2的大小:" ,a2.shape)
print("a2的类型:",type(a2))

(3)使用random()和randint()函数

random()函数随机生成矩阵中指定范围的浮点数:

import numpy as np
a1 = np.random.random((3,4))  #3×4阶,取值范围为0~1
print(a1)

randint()函数随机生成矩阵中指定范围的整数:

a2 = np.random.randint(1,10,size=[3,4])  #3×4阶,取值范围为1~10(不包括10)
print(a2)

1.2 改变矩阵的大小

import numpy as np
m = [1,2,3,4,5,6,7,8,9,10,11,12]
a = np.array(m)
a1 = a.reshape(3,4)
a2 = a.reshape(4,3)
print("原矩阵a: \\n",a)
print("转换为3行4列矩阵a1:\\n",a1)
print("转换为4行3列矩阵a2:\\n",a2)

1.3 获取矩阵元素

print("a2的第0行元素a2[0]: \\n",a2[0])
print("a2的前2行元素a2[0:2]: \\n",a2[0:2])
print("a2的第0行和第2行元素a2[[0,2]]: \\n",a2[[0,2]])
print("a2的第0列元素a2[:,1]: \\n",a2[:,1])
print("a2的前2行元素a2[:,0:2]: \\n",a2[:,0:2])
print("a2的第0列和第2列元素a2[:,[0,2]]: \\n",a2[:,[0,2]])
print("a2的第2行第2列元素a2[2,2]: \\n",a2[2,2])

1.4 特殊矩阵生成

(1)单位矩阵

import numpy as np
e1 = np.eye(5)
e2 = np.identity(5)
print("通过eye()创建五阶单位矩阵e1: \\n",e1)
print("通过identity()创建五阶单位矩阵e2: \\n",e2)

(2)零矩阵

import numpy as np
a = np.zeros((3,4))  
print("3×4阶零矩阵a: \\n",a)

(3)对角矩阵

import numpy as np
m = [1,2,3,4,5]
a = np.diag(m)
print("创建对角线为1,2,3,4,5的对角矩阵: \\n",a)

(4)上三角矩阵和下三角矩阵

import numpy as np
m = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
a = np.array(m)
a1 = np.triu(a,0)
a2 = np.tril(a,0)
print("a矩阵:\\n",a)
print("a矩阵的上三角矩阵: \\n",a1)
print("a矩阵的下三角矩阵: \\n",a2)

1.5 矩阵运算

(1)矩阵加减法运算

import numpy as np
m1 = [[1,1,1],[2,2,2]]
m2 = [[3,3,3],[4,4,4]]
a1 = np.array(m1)
a2 = np.array(m2)
print("a1 + a2 = \\n",a1 + a2)
print("a1 - a2 = \\n",a1 - a2)

(2)矩阵数乘运算

import numpy as np
m = [[5,5,5],[6,6,6]]
a = np.array(m)
print("矩阵数乘2a = \\n",2*a)

(3)矩阵乘法运算

import numpy as np
a1 = np.array([[1,1,1],[2,2,2],[3,3,3]])
a2 = np.array([[4,4,4],[5,5,5],[6,6,6]])
a3 = np.dot(a1,a2)
a4 = a1.dot(a2)
a5 = a1*a2
a6 = np.multiply(a1,a2)
print("矩阵乘法a1×a2 = \\n",a3)
print("矩阵乘法a1×a2 = \\n",a4)
print("对应元素的乘积: \\n",a5)
print("对应元素的乘积: \\n",a6)

(4)矩阵乘方运算

import numpy as np
m = [[1,1,1],[2,2,2],[3,3,3]]
a = np.array(m)
a1 = a**2
print("a的二次方a1: \\n",a1)

(5)生成逆矩阵

import numpy as np
m = [[2,5],[2,3]]
a = np.array(m)
a1 = np.linalg.inv(a)
a2 = np.mat(a)
a3 = a2.I
print("使用np.linalg.inv()求a的逆矩阵a1: \\n",a1)
print("使用I属性求a的逆矩阵a3: \\n",a3)

(6)生成转置矩阵

import numpy as np
m = [[1,2,3],[4,5,6]]
a = np.array(m)
a1 = a.T
a2 = np.transpose(a)
print("使用T属性求a的转置a1: \\n",a1)
print("使用np.transpose()函数求a的转置a2: \\n",a2)

2 行列式

2.1 行列式与矩阵的区别

(1)行列式是一个数值,矩阵是一个数表;

(2)行列式的行数等于列数,矩阵的行数不等于列数。

2.2 计算行列式

(1)使用np.linalg.det()函数计算行列式

官方手册用法:

python程序:

#计算行列式d
import numpy as np
d = [[1, 2, -4],[-2, 2, 1],[-3, 4, -2]]
a = np.array(d)
result = np.linalg.det(a)  
print(result)  #-14.000000000000004

(2)使用scipy.linalg.det()函数计算行列式

官方手册用法:

python程序:

# 计算行列式d
from scipy import linalg
d = [[1, 2, -4],[-2, 2, 1],[-3, 4, -2]]
a = np.array(d)
linalg.det(a)

2.3 计算矩阵的秩

使用np.linalg.matrix_rank() 函数计算矩阵的秩。

官方手册用法:

python程序:

# 计算矩阵d的秩
import numpy as np
m = [[2, -1, -1, 1, 2],[1, 1, -2, 1, 4],[4, -6, 2, -2, 4],[3, 6, -9, 7, 9]]
a = np.array(m)
rank = np.linalg.matrix_rank(m)
print(rank) #3

3 向量基本运算

3.1 向量的内积

python程序:

# 计算向量v1与向量v2的内积
import numpy as np
v1 = [[1,1,1]]
v2 = [[1,-2,1]]
a1 = np.array(v1).reshape(3,1)
a2 = np.array(v2).reshape(3,1)
result = a1.T.dot(a2)
print(result) #[[0]]

3.2 向量的长度

使用np.linalg.norm()函数:

官方手册用法:

python程序:

# 计算向量v的长度
import numpy as np 
v = [[1,2,2]]
a = np.array(v)
result =np.linalg.norm(a)
print(result) #3

4 计算线性方程组的解

(1)使用np.linalg.solve()函数

官方手册用法:

注意:这里系数矩阵必须是满秩,即所有行必须是线性无关的。

python程序:

#计算线性方程组的解
import numpy as np 
l1 = [[3, 2, -3],[2, -3, 3],[1, -1, 2]]
l2 = [[-2, 5, 5]]
a1 = np.array(l1)
a2 = np.array(l2).reshape(3,1)
result = np.linalg.solve(a1,a2)
print(result)

(2)使用scipy.linalg.solve()函数

官方手册用法(内容有点长):

https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.linalg.solve.html#scipy.linalg.solve

python程序:

#计算线性方程组的解
from scipy import linalg
l1 = [[3, 2, -3],[2, -3, 3],[1, -1, 2]]
l2 = [[-2, 5, 5]]
a1 = np.array(l1)
a2 = np.array(l2).reshape(3,1)
result = linalg.solve(a1,a2)
print(result)

5 特征值与特征向量

5.1 计算特征值与特征向量

使用np.linalg.eig()函数:

官方手册用法:

python程序:

# 计算特征值和特征向量
import numpy as np
m = [[3,-1],[-1,3]]
a = np.array(m)
eig_val,eig_vex = np.linalg.eig(a)
print(eig_val) 
print(eig_vex) 

输出

特征值: 
 [4. 2.]
特征向量:
 [[ 0.70710678  0.70710678]
 [-0.70710678  0.70710678]]

5.2 特征值分解

特征值分解要求带分解的矩阵必须是n维方阵。

python程序:

import numpy as np
m1 = [[-2, 1, 1],[0, 2, 0],[-4, 1, 3]]  #m1为原始矩阵
a = np.array(m1)
eig_val,eig_vex = np.linalg.eig(a)
print("特征值为:",eig_val)
eig_val_diag = np.diag(eig_val) #特征值对角化
print("对角矩阵:",eig_val_diag)
m2 = eig_vex.dot(eig_val_diag.dot(np.linalg.inv(eig_vex))) #m2为新生成的矩阵
print(m2)
print("m1和m2是否相等:",np.allclose(m1,m2))

6 SVD

6.1 SVD要点

SVD(Singular Value Decompostion)可以对任意矩阵进行分解,它是一种抽取重要特征的方法,将一个复杂的大矩阵用三个小矩阵来表示,而这三个小矩阵包含大矩阵的重要特征信息。

6.2 使用SVD重构矩阵

python程序:

#奇异值分解
import numpy as np
m1 = [[1, 2, 2, 1],[2, 1, -2, -2],[1, -1, -4, -3]] # 原矩阵m1
a = np.array(m1)
u,s,vt = np.linalg.svd(a) 
diagma = np.zeros(np.shape(a))
diagma[:len(s),:len(s)] = np.diag(s)
print("左奇异值矩阵: \\n",u) 
print("奇异值: \\n",s)
print("右奇异值矩阵: \\n",vt)
print("奇异值矩阵: \\n",diagma)
m2 = u.dot(diagma.dot(vt)) # 重构后的矩阵m2
print("原矩阵m1与重构后矩阵m2是否相同:",np.allclose(m1,m2)) #判断重构后矩阵与原矩阵是否相等

输出:

左奇异值矩阵: 
 [[-0.34819307 -0.73853115  0.57735027]
 [ 0.4654902  -0.67080962 -0.57735027]
 [ 0.81368327  0.06772153  0.57735027]]
奇异值: 
 [6.38092733e+00 3.04692736e+00 1.50350788e-16]
右奇异值矩阵: 
 [[ 0.21885073 -0.16370335 -0.76510817 -0.58302235]
 [-0.66047812 -0.72715663 -0.13335703  0.13125468]
 [ 0.28819959 -0.02107189 -0.52371947  0.80138311]
 [-0.65788602  0.66633357 -0.35006188  0.02534264]]
奇异值矩阵: 
 [[6.38092733e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
 [0.00000000e+00 3.04692736e+00 0.00000000e+00 0.00000000e+00]
 [0.00000000e+00 0.00000000e+00 1.50350788e-16 0.00000000e+00]]
原矩阵m1与重构后矩阵m2是否相同: True

6.3 使用SVD进行矩阵近似

for k in range(3,0<

线代学习笔记

   看了几天线性代数的教学视频,一脸懵逼。一大堆问号在头上,可是她是如此的重要,甚至是很多学科的血液,连这个都不懂的话,估计接下来的编程,机器学习,概率论全都会一脸茫然!如果强迫自己要一个时限... 查看详情

华为云技术分享机器学习(02)——学习资料链接

...章和视频,实际看了后觉得好多内容都太难,自己目前的数学基础很难理解里面讲解的内容。另外,资料太多反而影响学习效率,很多内容都是重复的,海量的书籍、视频与文章,最终只能作为收藏的一部分,永久的沉睡在云盘... 查看详情

ai人工智能机器学习深度学习学习路径及推荐书籍

...本语法和常用的Python库,如NumPy、Pandas和Matplotlib等。学习数学基础:机器学习涉及到很多数学知识,尤其是线性代数、微积分和概率论。可以选择上述推荐的书籍进行学习,也可以参考网上的免费教程和视频。学习机器学习基础... 查看详情

python机器学习算法学习的步骤机器学习的应用及流程(获取数据特征工程模型模型评估)(代码片段)

...斯算法),统计学(贯穿整个学习过程),算法根据数学基础一步步的推导出来的。需要编程语言把学到的知识应用到实践中,pyth 查看详情

机器学习--线性代数基础

关闭yunqishequ1的博客    目录视图摘要视图订阅管理博客写新文章评论送书|7月书讯:众多畅销书升级!      CSDN日报20170727——《想提高团队技术,来试试这个套路!》     &n... 查看详情

机器学习需要啥数学基础

...很多的工具,其中最重要的当属数学工具了,因此必要的数学基础可谓是打开机器学习大门的必备钥匙。机器学习涉及到的数学基础内容包括三个方面,分别是线性代数、概率统计和最优化理论。下面小编就会好好给大家介绍一... 查看详情

slam学习

学习内容:数学:线性代数,概率论,优化理论,离散数学,李代数,凸优化;算法:  概率机器人,机器人状态估计,深度学习,非线性优化;工程:c/c++,python,ros,opencv;硬件:  激光传感器,IMU, 摄像头; 查看详情

人工智能学习

第一阶段:数学高等数学/线性代数/概率论第二阶段:编程python工具库实战/python网络爬虫第三阶段:机器学习机器学习入门/机器学习提升第四阶段:数据挖掘实战数据挖掘入门/数据分析实战第五阶段:深度学习深度学习... 查看详情

机器学习|数学基础mathematicsformachinelearning系列之矩阵理论:线性空间定义及其性质

目录前言1.2线性空间定义及其性质定义1.1:线性空间(向量空间)定理1.2.1:零元与负元命题1命题2补充法则结语前言Hello!小伙伴!非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ 自我介绍ଘ(੭ˊᵕˋ)੭... 查看详情

机器学习教程一-不懂这些线性代数知识别说你是搞机器学习的

...//www.shareditor.com/blogshow/?blogId=1数学是计算机技术的基础,线性代数是机器学习和深度学习的基础,了解数据知识最好的方法我觉得是理解概念,数学不只是上学时用来考试的,也是工作中必不可少的基础知识,实际上有很多有趣... 查看详情

机器学习理论基础学习3---linearclassification线性分类之线性判别分析

 下面依次讲解以下五个线性分类的算法: 查看详情

机器学习--线性回归的原理与基础实现(代码片段)

文章目录一、一元线性回归的实现1.1原理1.2Python底层实现一元线性回归二、多元线性回归的实现2.1参考文献2.2代码实现2.3相关性分析三、第三方库实现线性回归四、线性回归案例4.1回归知识复习4.2案例编写一、一元线性回归的实... 查看详情

机器学习数学基础之矩阵理论

        目录一、线性空间1.   线性空间的概念(1) 线性空间的定义(2) 线性空间的本质2.   线性空间的基(1) 线性表示(2) 线性相关(3) 线性无关(4) ... 查看详情

机器学习|数学基础mathematicsformachinelearning系列之矩阵理论(11):线性变换的矩阵表示

目录前言3.2线性变换的矩阵表示定义3.7命题定理3.2.1结语前言Hello!小伙伴!非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ 自我介绍ଘ(੭ˊᵕˋ)੭昵称:海轰标签:程序猿|C++选手|学生简介:因C语言... 查看详情

机器学习数学系列:机器学习与数学基础知识

...概率与统计基础:  概率公式、常见分布、常见统计量线性代数基础:  矩阵乘法的几何意义  这是一张非常著名的图,请仔细挖掘其信息量。以期它在整体上指引我们的学习。1 机器学习基础1.1机器学习分类有... 查看详情

机器学习的数学基础(代码片段)

一、概述我们知道,机器学习的特点就是:以计算机为工具和平台,以数据为研究对象,以学习方法为中心;是概率论、线性代数、数值计算、信息论、最优化理论和计算机科学等多个领域的交叉学科。所以本文就先介绍一下机... 查看详情

机器学习基础-线性代数学习笔记

这些知识其实中国的学生上过高中的就都应该学过,但是我不敢说所有的学生都忘了,但是还能有几个还记得呢,这是为什么呢,因为填鸭式的教育方式存在问题,所以说学过和没学过区别不大,我现在有点悔恨当初没有好好学... 查看详情

机器学习:2.机器学习相关数学基础

...理一遍,一定要多加重视。通过观看视频,大家对课程的数学基础部分加深印象。建议大家边看边做笔记,记录要点及所在时间点,以便有必要的时候回看。学习笔记也是作业的一部分。 3.作业要求:1)贴上视频学习笔记,... 查看详情