机器学习实践系列 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万字,明天继续)

原创粉丝点击