发布时间: 2018-09-20 23:43:11
2.1 线性代数内容介绍
2.1.1 线性代数介绍
线性代数是一门被广泛运用于各个工程技术学科的数学分支,利用线性代数的相关概念和结论,可以极大的简化人工智能里相关公式的推导和表述。线性代数可以将复杂的问题简单化,让我们能够对问题进行高效的数学运算。
在深度学习的背景下,线性代数是一个数学工具,它提供了有助于同时操作数组的技术。它提供了像向量和矩阵这样的数据结构用来保存数字和规则,以便进行加,减,乘,除的运算。
2.1.2 代码实现介绍
numpy 是一款基于 Python 的数值处理模块,在处理矩阵数据方面有很强大的功能与优势。因为线性代数的主要内容就是对矩阵的处理,所以本章节主要的内容都是基于 numpy 进行展开。另外也会涉及到方程组求解,所以也会用到数学科学库 scipy。
2.2 线性代数实现
提前导入相应模块。代码如下:
>>> import numpy as np
>>> import scipy as sp
2.2.1 张量实现
生成元素全为 0 的二维张量,两个维度分别为3,4。
# 代码输入:
>>> np.zeros((3,4))
# 结果输出:
>>> np.array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
生成三维的随机张量,三个维度分别为2,3,4。
# 代码输入:
>>> np.random.rand(2,3,4)
# 结果输出:
>>> array([[[ 0.93187582, 0.4942617 , 0.23241437, 0.82237576],[ 0.90066163,0.30151126,0.89734992,0.56656615],[ 0.54487942,0.80242768,0.477167 ,0.6101814 ]],[[ 0.61176321,0.11454075,0.58316117,0.36850871],[ 0.18480808,0.12397686,0.22586973,0.35246394],[ 0.01192416,0.5990322 ,0.34527612,0.424322 ]]])2.2.2 矩阵实现
在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。
创建一个 3*3 的零矩阵,矩阵这里 zeros 函数的参数是一个 tuple 类型(3,3)。
# 代码输入:
>>> np.mat(np.zeros((3,3)));
# 结果输出:
>>> matrix([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
2.2.3 单位矩阵实现
单位矩阵:对角线元素均为 1,其他位置均为 0 的方阵。实现如下:
# 代码输入:
>>> np.eye(4)
# 结果输出:
>>> array([[ 1., 0., 0., 0.],[ 0.,1.,0.,0.],[ 0.,0.,1.,0.],[ 0.,0.,0.,1.]])2.2.4 reshape 运算
在数学中并没有 reshape 运算,但是在 numpy 和 TensorFlow 等运算库中是一个非常常用的运算,用来改变一个张量的维度数和每个维度的大小,例如一个 10x10 的图片在保存时直接保存为一个包含 100 个元素的序列,在读取后就可以使用 reshape 将其从 1x100 变换为 10x10。示例如下:
# 代码输入:
# 生成一个包含整数 0~11 的向量
>>> x = np.arange(12)
>>> x
# 结果输出:
>>> array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
# 查看数组大小
>>> x.shape
# 结果输出:
>>>(12,)
# 将 x 转换成二维矩阵,其中矩阵的第一个维度为 1
>>> x = x.reshape(1,12)
>>> x
# 结果输出:
>>> array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]])
>>> x.shape
# 结果输出:
>>>(1, 12)
# 将 x 转换 3x4 的矩阵
>>> x = x.reshape(3,4)
>>> x
# 结果输出:
>>> array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
2.2.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 的矩阵并转置
>>> A = np.arange(12).reshape(3,4)
>>> A
# 结果输出:
>>> array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> A.T
# 结果输出:
>>> array([[ 0, 4, 8],[ 1,5, 9],[ 2,6, 10],[ 3,7, 11]])## 生成 2*3*4 的张量
>>> B = np.arange(24).reshape(2,3,4)
>>> B
# 结果输出:
>>> 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 两个维度转置
>>> B.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]]])
2.2.6 矩阵乘法实现
矩阵乘法:记两个矩阵分别为 A 和 B,两个矩阵能够相乘的条件为第一个矩阵的列数等于第二个矩阵的行数。
# 代码输入:
>>> A = np.arange(6).reshape(3,2)
>>> B = np.arange(6).reshape(2,3)
>>> A
# 结果输出:
>>> array([[0, 1],
[2, 3],
[4, 5]])
>>> B
# 结果输出:
>>> array([[0, 1, 2],
[3, 4, 5]])
# 矩阵相乘
>>> np.matmul(A,B)
# 结果输出:
>>> array([[ 3, 4, 5],
[ 9, 14, 19],
[15, 24, 33]])
2.2.7 矩阵对应运算
元素对应运算:针对形状相同张量的运算统称,包括元素对应相乘、相加等,即对两个张量相同位置的元素进行加减乘除等运算。
# 代码输入:
# 创建矩阵
>>> A = np.arange(6).reshape(3,2)
# 矩阵相乘
>>> A*A
# 结果输出:
>>> array([[ 0, 1],
[ 4, 9],
[16, 25]])
>>> A + A
# 结果输出:
>>> array([[ 0, 2],
[ 4, 6],
[ 8, 10]])
2.2.8 逆矩阵实现
只有方阵才有逆矩阵,逆矩阵实现。
# 代码输入:
>>> A = np.arange(4).reshape(2,2)
>>> A
# 结果输出:
>>> array([[0, 1],
[2, 3]])
>>> np.linalg.inv(A)
# 结果输出:
>>> array([[-1.5, 0.5],
[ 1. , 0. ]])
2.2.9 特征值与特征向量
求一个矩阵的特征值和特征向量。
# 代码输入:
>>> import numpy as np #引入 numpy 模块
>>> 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.])
2.2.10 求行列式
求一个矩阵的行列式。
# 代码输入:
>>> E = array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> F = array([[-1, 0, 1],
[ 2, 3, 4],
[ 5, 6, 7]])
# 结果输出:
>>> np.linalg.det(E)
>>> 6.6613381477509402e-16
# 结果输出:
>>> np.linalg.det(F)
>>> 2.664535259100367e-15
2.2.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 = mat(dataMat)
>>> U,Simga,VT = linalg.svd(dataMat)
>>> U
# 结果输出:
>>> matrix([[ -1.77939726e-01, -1.64228493e-02, 1.80501685e-02, 9.53086885e-01, -3.38915095e-02, 2.14510824e-01,
1.10470800e-01],
[ -3.55879451e-01, -3.28456986e-02, 3.61003369e-02,
-5.61842993e-02, -6.73073067e-01, -4.12278297e-01, 4.94783103e-01],
[ -1.77939726e-01, -1.64228493e-02, 1.80501685e-02,
-2.74354465e-01, -5.05587078e-02, 8.25142037e-01, 4.57226420e-01],
[ -8.89698628e-01, -8.21142464e-02, 9.02508423e-02,
-1.13272764e-01, 2.86119270e-01, -4.30192532e-02,
-3.11452685e-01]])
>>> Simga
# 结果输出:
>>>array([ 9.72140007e+00, 5.29397912e+00, 6.84226362e-01, 1.52344501e-15, 2.17780259e-16])
>>> VT
# 结果输出:
>>> matrix([[ -5.81200877e-01, -5.81200877e-01, -5.67421508e-01,
-3.49564973e-02, -3.49564973e-02],
[ 4.61260083e-03, 4.61260083e-03, -9.61674228e-02, 7.03814349e-01, 7.03814349e-01],
[ -4.02721076e-01, -4.02721076e-01, 8.17792552e-01, 5.85098794e-02, 5.85098794e-02],
[ -7.06575299e-01, 7.06575299e-01, -2.22044605e-16, 2.74107087e-02, -2.74107087e-02],
[ 2.74107087e-02, -2.74107087e-02, 2.18575158e-16, 7.06575299e-01, -7.06575299e-01]])
2.2.12 线性方程组求解
求解线性方程组比较简单,只需要用到一个函数(scipy.linalg.solve)就可以了。 比如我们要求以下方程的解,这是一个非齐次线性方程组:
3x_1 + x_2 - 2x_3 = 5 x_1 - x_2 + 4x_3 = -2 2x_1 + 3x_3 = 2.5
# 代码输入:
>>> 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
# 结果输出:
>>> [0.5 4.5 0.5]
上一篇: {HTML5}基础核心-第二节-下