机器学习实践系列 1 线性代数计算的python实现
来源:互联网 发布:小甲鱼c语言教程 编辑:程序博客网 时间:2024/05/18 12:30
在深入学习机器学习,开启人工智能算法设计之前,有许多需要事先掌握的知识,最重要的是数学知识和编程能力,而且要把这两者有机结合起来,以备今后实现各类算法做好准备。
python是如今广为传颂的科学计算程序开发语言,有优势或缺点在这里不想追溯,毕竟没有一种万能工具能解决所有问题,我们只把它当成一种工具就好了。我想把自己学习、实践机器学习知识的体会通过这个博客记录下来,分享出去,其中的问题和错误希望看到的朋友给予批评指正。
先把之前整理过的,使用python numpy库完成线性代数常用计算的部分记录一下。
一、环境准备
1. 编码工具
执行下面程序前,需要安装python 和numpy库,推荐使用anaconda 3或更高版本。安装过程请参看anaconda官网文档。
2.编程环境
每个人都有自己偏爱的python编程环境,或繁或简都是可以的。在这里推荐使用anaconda 3集成的jupyter notebook,能够在浏览器上编写和调试代码,简单方便。
二、线性代数中常用计算的实现
线性代数里的主要内容包括:
- 行列式
- 矩阵
- 向量
- 线性方程
- 线性空间
二次型等
由于行列式可以认为是方阵的一种特殊计算表达方式,所以下面从矩阵的创建开始。
1.矩阵的创建
如果仅使用于python+numpy,那么创建矩阵有如下方法:
import numpy as np#下列矩阵均由numpy ndarray对象存放'''构造矩阵方法1 得到一个3*3矩阵'''a = np.array([[1,2,-4],[-2,2,1],[-3,4,-2]],dtype=np.float64)'''构造矩阵方法2,得到一个3*3矩阵'''b = b = np.arange(11,20).reshape(3,3)'''构造矩阵方法3,得到一个3*3的全0矩阵'''c = np.zeros((3,3))'''构造矩阵方法4,得到一个3*3的全1矩阵'''d = np.ones((3,3))'''构造矩阵方法5,得到一个3*3的从1到9线性均匀分布的3*3的矩阵'''e = np.linspace(1,9,9).reshape(3,3)'''构造矩阵方法6,得到一个3*3的单位矩阵'''f = np.eye(3,dtype=int)print(a)print(b)print(c)print(d)print(e)print(f)
运行后结果如下:
[[ 1. 2. -4.] [-2. 2. 1.] [-3. 4. -2.]][[11 12 13] [14 15 16] [17 18 19]][[ 0. 0. 0.] [ 0. 0. 0.] [ 0. 0. 0.]][[ 1. 1. 1.] [ 1. 1. 1.] [ 1. 1. 1.]][[ 1. 2. 3.] [ 4. 5. 6.] [ 7. 8. 9.]][[1 0 0] [0 1 0] [0 0 1]]
如果要建立随机数矩阵,可以用numpy中的random模块,有下列方法:
import numpy as npa = np.random.rand(4,3)b = np.random.randint(1,100,(4,4))print(a)print(b)输出结果为:[[ 0.82181056 0.90892419 0.7925167 ] [ 0.78454205 0.53208353 0.50467863] [ 0.41581293 0.32967551 0.13403763] [ 0.68428216 0.38660852 0.65485223]][[ 5 81 69 48] [71 67 37 63] [99 64 94 8] [97 9 9 61]]#还可以自定义设立随机数种子,RandomState里的数字可以是32位二进制的任意整数、None或一个数组my=np.random.RandomState([123,123,333])c = my.rand(3,4)d = my.randint(1,20,(3,4))print(c)print(d)结果为:[[ 0.5047555 0.24418547 0.8384022 0.67247537] [ 0.68275279 0.83532539 0.92314775 0.38936819] [ 0.80516984 0.78074428 0.69678646 0.10246203]][[ 6 15 7 13] [ 5 15 6 19] [15 2 14 12]]
2. 行列式的计算
如果要计算某个行列式,首先你要先把对应的矩阵先创建出来,然后运用numpy库中的linalg.det()来计算。例如:
import numpy as np#计算矩阵行列式a = np.array([[1,2,-4],[-2,2,1],[-3,4,-2]],dtype=np.int32)det_value = np.linalg.det(a)print(det_value)
运行后,结果为-14
3. 矩阵中元素的获取
3.1 返回方阵的对角线
import numpy as npa = np.array([[1,2,-4],[-2,2,1],[-3,4,-2]],dtype=np.int32)'''返回方阵的对角线'''adiag = np.diag(a)print(adiag)print(np.diag(a,1))#住对角线上面的一条部分对角线print(np.diag(a,-1))#住对角线下面的一条部分对角线)
运行后输出为:
[ 1. 2. -2.][ 2. 1.][-2. 4.]
4. 矩阵相关计算
4.1 矩阵加/减
import numpy as npa = np.linspace(1,16,16).reshape(4,4)b = np.linspace(11,26,16).reshape(4,4)print(a+b)print(b-a)结果为:array([[ 12., 14., 16., 18.], [ 20., 22., 24., 26.], [ 28., 30., 32., 34.], [ 36., 38., 40., 42.]])array([[ 10., 10., 10., 10.], [ 10., 10., 10., 10.], [ 10., 10., 10., 10.], [ 10., 10., 10., 10.]])
4.2 矩阵与数相乘
import numpy as npa = np.linspace(1,16,16).reshape(4,4)c = 5*aprint(c)结果为:array([[ 5., 10., 15., 20.], [ 25., 30., 35., 40.], [ 45., 50., 55., 60.], [ 65., 70., 75., 80.]])
4.3 计算对角线上元素之和,主对角元素之和也称为迹
import numpy as npa = np.array([[1,2,-4],[-2,2,1],[-3,4,-2]],dtype=np.float64)'''计算对角线上元素之和'''diagsum = np.trace(a)print(diagsum)
结果为1.0
4.4 计算矩阵与矩阵的乘积
import numpy as npa = np.array([[1,2,-4],[-2,2,1],[-3,4,-2]],dtype=np.float64)'''矩阵dot乘积'''adot = np.dot(a,a)print(adot)运行结果为:[[ 9. -10. 6.] [ -9. 4. 8.] [ -5. -6. 20.]]
4.5 计算矩阵的转置
import numpy as npa = np.array([[1,2,-4],[-2,2,1],[-3,4,-2]],dtype=np.float64)'''计算矩阵的转置'''a_T = np.linalg.inv(a)print(a_T)
4.6 求矩阵的秩(rank)
import numpy as npa = np.array([[1,2,-4],[-2,2,1],[-3,4,-2]],dtype=np.float64)'''求矩阵的秩rank'''rankofa = np.linalg.matrix_rank(a)print(rankofa)
4.7 计算矩阵的逆矩阵、伴随矩阵
#计算某个方阵的逆矩阵import numpy as npd = np.random.randint(1,100,(4,4))e = np.linalg.inv(d)print(d)print(e)运行结果为:[[26 70 25 33] [77 65 97 34] [45 56 36 52] [36 26 67 47]][[-0.03586354 0.01596751 0.04105832 -0.03179641] [ 0.02552074 0.0010049 -0.01347506 -0.00373719] [ 0.01336591 0.00288302 -0.0302851 0.02203676] [-0.00570144 -0.01689618 0.01917774 0.01628457]]#求伴随矩阵可以用公式: A的逆矩阵 = 1/|A| * A的伴随矩阵f = np.linalg.det(d)*np.linalg.inv(d)
4.8 计算方阵的特征值和特征向量
import numpy as npa = np.array([[1,2,-4],[-2,2,1],[-3,4,-2]],dtype=np.float64)'''计算方阵的特征值和特征向量'''r1,r2 = np.linalg.eig(a)print(r1)print(r2)
(还差1万字,明天继续)
- 机器学习实践系列 1 线性代数计算的python实现
- 机器学习实践系列之1 - dlib
- 【机器学习系列】logistic回归python实现
- Python机器学习实践指南 笔记(1)-Python机器学习的生态系统
- 机器学习算法与Python实践(1)
- 机器学习所需的线性代数知识
- 机器学习需要的线性代数知识
- 机器学习需要的线性代数知识
- 机器学习所需要的线性代数
- C++实现的线性代数矩阵计算
- 机器学习中的线性代数
- 线性代数,机器学习,笔记!!!
- 机器学习--线性代数基础
- 机器学习笔记--线性代数
- 机器学习 数学知识 线性代数
- 机器学习线性代数介绍
- Python机器学习及实践:
- 机器学习笔记(二)矩阵和线性代数 例:用Python实现SVD分解进行图片压缩
- Python 用队列,广度遍历文件夹
- Vue组件通信
- openCV Python学习笔记(二)画几何
- Java跨域问题
- jn-时间控件查询问题(控件不带时分秒,但是查询要包含当天)修改完成
- 机器学习实践系列 1 线性代数计算的python实现
- 如何在Ubuntu的服务器安装mongodb并开启远程连接
- 几种常用编程语言的编程思想和方法
- 基于opencv的人脸识别
- 其他
- mongodb主从用户权限管理
- android面试题总结(一)
- 【Openjudge】中缀表达式的值
- 集合类:单列集合--Collection