线性代作为数学的一个分支,主要研究向量空间以及在向量空间之间的线性变换。
机器学习在很大程度上依赖于线性代数,因此需要了解向量和矩阵,以及它们的特性和运作机制
向量是由大小和方向定义的量。例如,火箭的速度是一个三维向量:它的大小是火箭的速度,它的方向是向上。向量可以由称为标量(scalar)的数字数组表示。每个标量对应于关于每个维度的向量的大小。
例如,假设火箭以一个微小的角度上升:它的垂直速度为5000米/秒,并且以10米/秒的速度朝向东方的速度很小,而朝向北方的速度则为50米/秒。秒。火箭的速度可以用以下向量表示:
velocity = ( 10 50 5000 ) = \begin{pmatrix} 10 \\ 50 \\ 5000 \\ \end{pmatrix} =⎝⎛10505000⎠⎞
注意:按照惯例,向量通常以列的形式呈现。此外,向量名称通常是小写的,以区别于矩阵(我们将在下面讨论)和粗体(如果可能),以区别于简单的标量值。
N个数字的列表也可以表示N维空间中的点的坐标,因此可以将向量表示为简单点而不是箭头。具有1个元素的向量可以表示为轴上的箭头或点,具有2个元素的向量是平面上的箭头或点,具有3个元素的向量是空间中的箭头或点,以及具有N个元素的向量是N维空间中的箭头或点…当然,这很难以想象。
向量在机器学习中有许多用途,最值得注意的是表示观察和预测。例如,假设我们建立了一个机器学习系统,根据我们对它们的了解将视频分为3类(好的,垃圾邮件,钓鱼链接)。对于每个视频,我们会有一个向量来表示,例如:
video = ( 10.5 5.2 3.25 7.0 ) = \begin{pmatrix} 10.5 \\ 5.2 \\ 3.25 \\ 7.0 \end{pmatrix} =⎝⎜⎜⎛10.55.23.257.0⎠⎟⎟⎞
这个矢量可以代表一个持续10.5分钟的视频,但只有5.2%的观众观看超过一分钟,它平均每天获得3.25次观看,并被标记为垃圾邮件的7倍。如您所见,每个轴可能具有不同的含义。
基于此向量,我们的机器学习系统可以预测它是垃圾视频的概率为80%,点击率为18%,2%为好视频。这可以表示为以下向量:
class_probabilities = ( 0.80 0.18 0.02 ) = \begin{pmatrix} 0.80 \\ 0.18 \\ 0.02 \end{pmatrix} =⎝⎛0.800.180.02⎠⎞
在python中,向量可以有很多表示方法,最简单的就是一个数组:
[10.5, 5.2, 3.25, 7.0]
[10.5, 5.2, 3.25, 7.0]
由于我们计划进行大量的科学计算,因此使用NumPy的ndarray
要好得多,它为向量提供了许多方便和优化的基本数学运算实现。例如:
import numpy as np
video = np.array([10.5, 5.2, 3.25, 7.0])
video
array([10.5 , 5.2 , 3.25, 7. ])
向量的大小
video.size
4
向量 v \textbf{v} v 的第 i t h i^{th} ith 元素是 v i \textbf{v}_i vi.
video[2] # 第三个元素
3.25
先导入matpltlib
%matplotlib inline
import matplotlib.pyplot as plt
先画两个简单的二维向量
u = np.array([2, 5])
v = np.array([3, 1])
x_coords, y_coords = zip(u, v)
plt.scatter(x_coords, y_coords, color=["r","b"])
plt.axis([0, 9, 0, 6])
plt.grid()
plt.show()
向量也可以表示为箭头,写一个函数来绘制箭头:
def plot_vector2d(vector2d, origin=[0, 0], **options):
return plt.arrow(origin[0], origin[1], vector2d[0], vector2d[1],
head_width=0.2, head_length=0.3, length_includes_head=True,
**options)
把向量 u 和向量 v 画成箭头:
plot_vector2d(u, color="r")
plot_vector2d(v, color="b")
plt.axis([0, 9, 0, 6])
plt.grid()
plt.show()
来个3D图:
a = np.array([1, 2, 8])
b = np.array([5, 6, 3])
用 matplotlib的 Axes3D
画图:
from mpl_toolkits.mplot3d import Axes3D
subplot3d = plt.subplot(111, projection='3d')
x_coords, y_coords, z_coords = zip(a,b)
subplot3d.scatter(x_coords, y_coords, z_coords)
subplot3d.set_zlim3d([0, 9])
plt.show()
看上去很难判断两天在空间中的具体位置,为了方便,画一个垂直线:
def plot_vectors3d(ax, vectors3d, z0, **options):
for v in vectors3d:
x, y, z = v
ax.plot([x,x], [y,y], [z0, z], color="gray", linestyle='dotted', marker=".")
x_coords, y_coords, z_coords = zip(*vectors3d)
ax.scatter(x_coords, y_coords, z_coords, **options)
subplot3d = plt.subplot(111, projection='3d')
subplot3d.set_zlim([0, 9])
plot_vectors3d(subplot3d, [a,b], 0, color=("r","b"))
plt.show()