矩阵基础

在机器学习中,经常会遇到一些矩阵相关的知识,有些概念特别容易混淆,在这里对这些知识做下总结。

概念

我们先从几个概念说起:

标量(scalar)
一个标量表示一个单独的数,通常使用小写的变量名称x=1x=1

向量(vector)

一个向量表示一组有序排列的数。通常我们赋予向量粗体的小写变量名称,比如 x\mathbf{x} ,或小写字母上面加一个向右的箭头 x\vec{x} 。向量中的元素可以通过带脚标的斜体表示x={x1,x2,...xn}\vec{x}=\{x_1,x_2,...x_n\}

矩阵(matrix)

矩阵是具有相同特征和纬度的对象的集合,表现为一张二维数据表。其意义是一个对象表示为矩阵中的一行,一个特征表示为矩阵中的一列,每个特征都有数值型的取值。矩阵一般使用粗体的大写变量名称,比如AA

张量(tensor)

在某些情况下,我们会讨论坐标超过两维的数组。一般地,一个数组中的元素分布在若干维坐标的规则网格中,我们将其称之为张量。使用 AA 来表示张量“A”。张量AA中坐标为(i,j,k)(i,j,k)的元素记作A(i,j,k)A_{(i,j,k)}

矩阵乘法

向量乘法:

定义两个向量a\vec ab\vec bθ\theta为两个向量的夹角。

内积

点积又叫向量的内积、标量积、数量积、点积、点乘,是一个向量和它在另一个向量上的投影的长度的乘积,是标量。反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大。

向量abab的点积记作:ab\vec{a} \cdot \vec{b}

ab=abcosθ\vec{a} \cdot \vec{b} = |\vec{a}| \cdot |\vec{b}| \cdot cos \theta

几何意义
code

可以使用numpy中的dot()函数进行矩阵的点乘

1
2
3
4
5
6
7
8
9
# 如果处理的是一维数组(向量相乘),则得到的是两数组的内积,即对应位置相乘然后相加
import numpy as np
mat_1 = np.array([1,2,3,4])
mat_2 = np.array([2,1,0,1])
result = np.dot(mat_1,mat_2)
print(f"result:{result}")

# output:
# result:8

外积

向量的外积又叫向量叉乘。

向量a与b的外积a×b\vec{a}×\vec{b}是一个向量,其长度等于|a×b| = |a||b|sin∠(a,b),其方向正交于a与b。并且,(a,b,a×b)构成右手系。(外积是张量积的一种形式)

几何意义

vec

其中θ为向量a和向量b的夹角,如下图所示,c的模即以ab为两条边的平行四边形的面积。

c的方向定义为垂直于ab所构成的平面

code
1
2
3
4
5
6
7
8
result = np.outer(mat_1,mat_2)
print(f"result:\n{result}")

#result:
#[[2 1 0 1]
# [4 2 0 2]
# [6 3 0 3]
# [8 4 0 4]]

对应元素相乘

没有几何意义只有代数意义的向量乘法,也叫做哈达玛积

1
2
3
4
5
result = mat_1*mat_2
print(f"result:\n{result}")

#result:
#[2 2 0 4]

矩阵乘法:

点乘(又叫点积是对应位置相乘)

1
2
3
4
5
6
# 如果是二维数组(矩阵)之间的运算,则得到的是矩阵积(mastrix product)
mat_1 = np.array([1,2,3,4]).reshape(-1,2)
mat_2 = np.array([2,1,0,1]).reshape(-1,2)
print(f"mat_1:\n{mat_1}")
print(f"mat_2:\n{mat_2}")
print(f"*:\n{mat_1*mat_2}")

output:

1
2
3
4
5
6
7
8
9
10
mat_1:
[[1 2]
[3 4]]
mat_2:
[[2 1]
[0 1]]

*:
[[2 2]
[0 4]]

叉乘(矩阵乘法)

1
2
3
4
5
print(f"dot:\n{np.dot(mat_1,mat_2)}")

#dot:
#[[2 3]
# [6 7]]

参考