在深入学习机器学习,开启人工智能算法设计之前,有许多需要事先掌握的知识,最重要的是数学知识和编程能力,而且要把这两者有机结合起来,以备今后实现各类算法做好准备。
python是如今广为传颂的科学计算程序开发语言,有优势或缺点在这里不想追溯,毕竟没有一种万能工具能解决所有问题,我们只把它当成一种工具就好了。我想把自己学习、实践机器学习知识的体会通过这个博客记录下来,分享出去,其中的问题和错误希望看到的朋友给予批评指正。
先把之前整理过的,使用python numpy库完成线性代数常用计算的部分记录一下。
执行下面程序前,需要安装python 和numpy库,推荐使用anaconda 3或更高版本。安装过程请参看anaconda官网文档。
每个人都有自己偏爱的python编程环境,或繁或简都是可以的。在这里推荐使用anaconda 3集成的jupyter notebook,能够在浏览器上编写和调试代码,简单方便。
线性代数里的主要内容包括:
二次型等
由于行列式可以认为是方阵的一种特殊计算表达方式,所以下面从矩阵的创建开始。
如果仅使用于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 np
a = 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]]
如果要计算某个行列式,首先你要先把对应的矩阵先创建出来,然后运用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.1 返回方阵的对角线
import numpy as np
a = 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.1 矩阵加/减
import numpy as np
a = 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 np
a = np.linspace(1,16,16).reshape(4,4)
c = 5*a
print(c)
结果为:
array([[ 5., 10., 15., 20.],
[ 25., 30., 35., 40.],
[ 45., 50., 55., 60.],
[ 65., 70., 75., 80.]])
4.3 计算对角线上元素之和,主对角元素之和也称为迹
import numpy as np
a = 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 np
a = 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 np
a = 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 np
a = 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 np
d = 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 np
a = 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万字,明天继续)