用于深度学习的线性代数
深度学习是机器学习的一个子域,关注模仿大脑功能和结构的算法 - 人工神经网络。
线性代数是连续的而不是离散的数学形式,许多计算机科学家对它几乎没有经验。对于理解和使用许多机器学习算法,特别是深度学习算法,理解线性代数是非常重要的。
Why Math?
线性代数、概率和微积分是机器学习的“语言”。学习这些主题将有助于对底层算法力学的深入理解,并允许开发新的算法。
当局限于较小的水平时,一切都是深度学习背后的数学。因此,在深入学习和编程之前,必须了解基本的线性代数。
深度学习背后的核心数据结构是标量,矢量,矩阵和张量。以编程方式,让我们用这些解决所有基本的线性代数问题
标量
标量是一个数字,这是一个0阶张量的例子,符号x∈ℝ表示x是一个标量,属于一组实数值ℝ。
深度学习有不同的兴趣点。ℕ表示正整数集合(1,2,3,...)。ℤ表示结合了正值,负值和零值的整数。ℚ表示可以表示为两个整数的一部分的有理数的集合。
在Python中,很少有内置的标量类型是int、float、complex、bytes和Unicode。在NumPy的python库中,有24种新的基本数据类型来描述不同类型的标量。
在Python中定义标量和一些操作:
下面的代码片段解释了对标量的几个算术运算。
# In-Built Scalars
a = 5
b = 7.5
print(type(a))
print(type(b))
print(a + b)
print(a - b)
print(a * b)
print(a / b)
<class 'int'>
<class 'float'>
12.5
-2.5
37.5
0.6666666666666666
以下代码片段检查给定变量是否是标量
import numpy as np
# Is Scalar Function
def isscalar(num):
if isinstance(num, generic):
return True
else:
return False
print(np.isscalar(3.1))
print(np.isscalar([3.1]))
print(np.isscalar(False))
True
False
True
向量
向量是单个数字的有序数组,是一个1阶张量的例子。向量是被称为向量空间的物体的碎片。向量空间可以被看作是一个特定长度(或维)的所有可能向量的全部集合。
用 ℝ^3 表示的三维实值向量空间通常用于从数学角度表示我们对三维空间的现实世界概念。
为了明确确定矢量的必要分量,矢量的第i 个标量元素被写为x [i]。
在深度学习中,向量通常表示特征向量,其原始组件定义特定特征的相关性。这些元素可以包括二维图像中一组像素的强度的相关重要性或者金融工具的横截面的历史价格值。
在Python中定义向量和一些操作:
import numpy as np
# Declaring Vectors
x = [1, 2, 3]
y = [4, 5, 6]
print(type(x))
# This does'nt give the vector addition.
print(x + y)
# Vector addition using Numpy
z = np.add(x, y)
print(z)
print(type(z))
# Vector Cross Product
mul = np.cross(x, y)
print(mul)
<class 'list'>
[1, 2, 3, 4, 5, 6]
[5 7 9]
<class 'numpy.ndarray'>
[-3 6 -3]
矩阵
矩阵是由数字组成的矩形数组,是一个2阶张量的例子。
如果m和n是正整数,即m,n∈ℕ,则m×n矩阵包含m * n个数字,m行n列。完整的m×n矩阵可写为:
将全矩阵组件显示缩写为以下表达式通常很有用:
在Python中,我们使用numpy库来帮助我们创建无数的数组。基本上是矩阵,我们使用矩阵方法,并通过列表,从而定义一个矩阵。
>>> import numpy as np
>>> x = np.matrix([[1,2],[2,3]])
>>> x
matrix([[1, 2],
[2, 3]])
>>> a = x.mean(0)
>>> a
matrix([[1.5, 2.5]])
>>> # Finding the mean with 1 with the matrix x.
>>> z = x.mean(1)
>>> z
matrix([[ 1.5],
[ 2.5]])
>>> z.shape
(2, 1)
>>> y = x - z
matrix([[-0.5, 0.5],
[-0.5, 0.5]])
>>> print(type(z))
<class 'numpy.matrixlib.defmatrix.matrix'>
在Python中定义矩阵和操作:
矩阵加法
矩阵可以添加到标量,向量和其他矩阵。每个操作都有精确的定义。这些技术经常用于机器学习和深度学习,所以值得熟悉它们。
# Matrix Addition
import numpy as np
x = np.matrix([[1, 2], [4, 3]])
sum = x.sum()
print(sum)
# Output: 10
矩阵-矩阵加法
C = A + B (两个相同大小的矩阵A和B)
# Matrix-Matrix Addition
import numpy as np
x = np.matrix([[1, 2], [4, 3]])
y = np.matrix([[3, 4], [3, 10]])
print(x.shape)
# (2, 2)
print(y.shape)
# (2, 2)
m_sum = np.add(x, y)
print(m_sum)
print(m_sum.shape)
"""
Output :
[[ 4 6]
[ 7 13]]
(2, 2)
"""
矩阵标量加法
将给定的标量相加到给定矩阵中的所有元素。
# Matrix-Scalar Addition
import numpy as np
x = np.matrix([[1, 2], [4, 3]])
s_sum = x + 1
print(s_sum)
"""
Output:
[[2 3]
[5 4]]
"""
矩阵标量乘法
将给定的标量乘以给定矩阵中的所有元素。
# Matrix Scalar Multiplication
import numpy as np
x = np.matrix([[1, 2], [4, 3]])
s_mul = x * 3
print(s_mul)
"""
[[ 3 6]
[12 9]]
"""
矩阵乘法
A(mxn)和B(nxp)相乘得出C(mxp)
# Matrix Multiplication
import numpy as np
a = [[1, 0], [0, 1]]
b = [1, 2]
np.matmul(a, b)
# Output: array([1, 2])
complex_mul = np.matmul([2j, 3j], [2j, 3j])
print(complex_mul)
# Output: (-13+0j)
矩阵转置
通过转置,您可以将行向量转换为列向量,反之亦然:
A = [a ij ] mxn
AT = [a ji ] n×m
# Matrix Transpose
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)
"""
[[1 2]
[3 4]]
"""
a.transpose()
print(a)
"""
array([[1, 3],
[2, 4]])
"""
张量
张量的一般实体包含了标量,向量和矩阵。有时,在物理科学和机器学习中,使用张量超过两张量是必要的。
我们使用像tensorflow或PyTorch这样的Python库来声明张量,而不是嵌套矩阵。
在PyTorch中定义一个简单的张量
import torch
a = torch.Tensor([26])
print(type(a))
# <class 'torch.FloatTensor'>
print(a.shape)
# torch.Size([1])
# Creates a Random Torch Variable of size 5x3.
t = torch.Tensor(5, 3)
print(t)
"""
0.0000e+00 0.0000e+00 0.0000e+00
0.0000e+00 7.0065e-45 1.1614e-41
0.0000e+00 2.2369e+08 0.0000e+00
0.0000e+00 0.0000e+00 0.0000e+00
nan nan -1.4469e+35
[torch.FloatTensor of size 5x3]
"""
print(t.shape)
# torch.Size([5, 3])
Python中对张量的算术运算
import torch
# Creating Tensors
p = torch.Tensor(4,4)
q = torch.Tensor(4,4)
ones = torch.ones(4,4)
print(p, q, ones)
"""
Output:
0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
1.6009e-19 4.4721e+21 6.2625e+22 4.7428e+30
3.1921e-09 8.0221e+17 5.1019e-08 8.1121e+17
8.1631e-07 8.2022e+17 1.1703e-19 1.5637e-01
[torch.FloatTensor of size 4x4]
0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
1.8217e-44 1.1614e-41 0.0000e+00 2.2369e+08
0.0000e+00 0.0000e+00 2.0376e-40 2.0376e-40
nan nan -5.3105e+37 nan
[torch.FloatTensor of size 4x4]
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
[torch.FloatTensor of size 4x4]
"""
print("Addition:{}".format(p + q))
print("Subtraction:{}".format(p - ones))
print("Multiplication:{}".format(p * ones))
print("Division:{}".format(q / ones))
"""
Addition:
0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
1.6009e-19 4.4721e+21 6.2625e+22 4.7428e+30
3.1921e-09 8.0221e+17 5.1019e-08 8.1121e+17
nan nan -5.3105e+37 nan
[torch.FloatTensor of size 4x4]
Subtraction:
-1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00
-1.0000e+00 4.4721e+21 6.2625e+22 4.7428e+30
-1.0000e+00 8.0221e+17 -1.0000e+00 8.1121e+17
-1.0000e+00 8.2022e+17 -1.0000e+00 -8.4363e-01
[torch.FloatTensor of size 4x4]
Multiplication:
0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
1.6009e-19 4.4721e+21 6.2625e+22 4.7428e+30
3.1921e-09 8.0221e+17 5.1019e-08 8.1121e+17
8.1631e-07 8.2022e+17 1.1703e-19 1.5637e-01
[torch.FloatTensor of size 4x4]
Division:
0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
1.8217e-44 1.1614e-41 0.0000e+00 2.2369e+08
0.0000e+00 0.0000e+00 2.0376e-40 2.0376e-40
nan nan -5.3105e+37 nan
[torch.FloatTensor of size 4x4]
"""