AI之路,第二篇:python数学知识2
第二篇:python数学知识2
线性代数
导入相应的模块;
>>> import numpy as np (数值处理模块)
>>> import scipy as sp
1,张量实现;
生成元素全为0 的二维张量,两个维度分别3,4.
>>> np.zeros((3,4))
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
>>>
生成三维的随机张量,三个维度分别是2,3,4;
>>> np.random.rand(2,3,4)
array([[[0.38758731, 0.5499685 , 0.54972813, 0.57450416],
[0.35331611, 0.16655625, 0.12040096, 0.90553467],
[0.30474903, 0.381874 , 0.371502 , 0.79308308]],
[[0.21948554, 0.39107485, 0.96109378, 0.62545556],
[0.79382549, 0.94084427, 0.25833607, 0.03340559],
[0.53158233, 0.9919193 , 0.98290661, 0.34611917]]])
>>>
2, 矩阵实现;(Matrix 矩阵)
创建一个3*3 的零矩阵,矩阵这里zeros函数的参数是一个tuple类型
>>> np.mat(np.zeros((3,3)))
matrix([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
>>>
3,单位矩阵实现;
单位矩阵,对角线元素均为1, 其他位置均为0 的方阵;
>>> np.eye(4)
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
>>>
4,reshape运算
用来改变一个张量的维度数和每个维度的大小;
例: 一个10*10的图片保存时直接存为一个包含100个元素的序列, 在读取后就可以使用reshape将其从1*100变成10*10;
生成一个包含整数0-11的向量;
>>> x = np.arange(12)
>>> x
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> x.shape #查看数组大小
(12,)
>>> x = x.reshape(1,12) #将x转换成二维矩阵,其中矩阵的第一个维度为1
>>> x
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]])
>>> x.shape #查看数组大小
(1, 12)
>>> x = x.reshape(3,4) # 将x转换3*4的矩阵
>>> x
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>>
5,转置实现;
向量和矩阵的转置是交换行列顺序,而三维及其以上张量的转置就需要指定转换维度;
生成包含5个元素的向量x并将其转置;
>>> x = np.arange(5).reshape(1,-1)
>>> x
array([[0, 1, 2, 3, 4]])
>>> x.T
array([[0],
[1],
[2],
[3],
[4]])
>>>
#生成3*4的矩阵并转置
>>> y = np.arange(12).reshape(3,4)
>>> y
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> y.T
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
#生成2*3*4的张量;
>>> A = np.arange(24).reshape(2,3,4)
>>> A
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
#将B的0,1两个维度转置
>>> A.transpose(1,0,2)
array([[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 8, 9, 10, 11],
[20, 21, 22, 23]]])
>>>
6,矩阵乘法实现
矩阵乘法:记两个矩阵分别为A和B,两个矩阵能够相乘的条件为第一个矩阵的列数等于第二个矩阵的行数;
>>> x = np.arange(6).reshape(3,2)
>>> y = np.arange(6).reshape(2,3)
>>> x
array([[0, 1],
[2, 3],
[4, 5]])
>>> y
array([[0, 1, 2],
[3, 4, 5]])
矩阵相乘
>>> np.matmul(x,y)
array([[ 3, 4, 5],
[ 9, 14, 19],
[15, 24, 33]])
>>>
7,矩阵对应运算
元素对应运算: 针对形状相同张量的运算统称,包括元素对应相乘,相加等;即对两个张量相同位置的元素进行加减乘除等运算。
>>> x = np.arange(6).reshape(3,2) #创建矩阵
>>> x
array([[0, 1],
[2, 3],
[4, 5]])
>>> x*x #矩阵相乘
array([[ 0, 1],
[ 4, 9],
[16, 25]])
>>> x+x #矩阵相加
array([[ 0, 2],
[ 4, 6],
[ 8, 10]])
>>>
8,逆矩阵实现;
只有方阵才有逆矩阵,逆矩阵实现。
>>> x = np.arange(4).reshape(2,2)
>>> x
array([[0, 1],
[2, 3]])
>>> np.linalg.inv(x)
array([[-1.5, 0.5],
[ 1. , 0. ]])
9,特征值与特征向量
求一个矩阵的特征值和特征向量;
>>> x = np.diag((1,2,3)) #写入对角阵x
>>> x #输出对角阵x
array([[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])
>>> a,b = np.linalg.eig(x) #特征值赋值给a,对应特征向量赋值给b;
>>> a #特征值 1,2,3
array([1., 2., 3.])
>>> b #特征向量
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
>>>
10,求行列式;
求一个矩阵的行列式;
>>> e = np.array([[1,2,3], \
... [4,5,6], \
... [7,8,9]])
>>> f = np.array([[-1,0,1], \
... [2,3,4], \
... [5,6,7]])
>>> np.linalg.det(e)
0.0 #有误,6.6.。。。。
>>> np.linalg.det(f)
2.664535259100367e-15
>>> np.linalg.det(e)
0.0#错
11,奇异值分解实现;
构建一个矩阵,然后对其进行奇异值分解;
>>> dataMat = [[1,1,1,0,0],[2,2,2,0,0],[1,1,1,0,0],[5,5,5,0,0],[1,1,0,2,2]]
>>> dataMat = np.mat(dataMat)
>>> U,Simga,VT = np.linalg.svd(dataMat)
>>> U
matrix([[-1.78064631e-01, -2.34744938e-02, 9.82557191e-01,
2.55992727e-02, -4.08409122e-02],
[-3.56129261e-01, -4.69489876e-02, -8.88026466e-02,
9.28675681e-01, 2.53635904e-02],
[-1.78064631e-01, -2.34744938e-02, -7.22652741e-02,
-4.96207581e-02, -9.79825212e-01],
[-8.90323153e-01, -1.17372469e-01, -1.46537325e-01,
-3.66665975e-01, 1.93987789e-01],
[-1.30700450e-01, 9.91421904e-01, 1.38777878e-16,
-2.30284541e-16, -5.20417043e-18]])
>>> Simga
array([9.71946559e+00, 2.92095680e+00, 1.55006458e-15, 7.75255049e-17,
2.80852393e-33])
>>> VT
matrix([[-5.81380112e-01, -5.81380112e-01, -5.67932825e-01,
-2.68945754e-02, -2.68945754e-02],
[ 9.02829499e-02, 9.02829499e-02, -2.49133882e-01,
6.78833664e-01, 6.78833664e-01],
[-7.95884448e-01, 5.42563216e-01, 2.53321232e-01,
6.33303080e-02, 6.33303080e-02],
[-1.42877918e-01, -5.99559264e-01, 7.42437182e-01,
1.85609295e-01, 1.85609295e-01],
[-0.00000000e+00, 1.54864761e-16, -1.48501146e-16,
7.07106781e-01, -7.07106781e-01]])
>>>
12,线性方程组求解
>>> from scipy.linalg import solve
>>> a = np.array([[3,1,-2],[1,-1,4],[2,0,3]])
>>> b = np.array([5,-2,2.5])
>>> x = solve(a,b)
>>> x
array([0.5, 4.5, 0.5])
>>>
>>>