生活中所说的“空间”,就是我们所处的地方,它有三个维度,它里面有各种物体,这些物体各自遵守着一定的运动规则——注意,“空间”非“空”——或者说,这个空间制定了某些规则,里面的物体必须遵循。有时候我们也会画出一个相对小的范围,在这个范围内的对象类型单一,且遵循统一的规律,比如这几年风靡各地的“创客空间”,其中的对象就是喜欢创造的人,他们遵循的规律就是“创造,改变世界”。诚然,由人组成的“空间”总是很复杂的,超出了本书的研究范畴,我们下面要研究的是由向量组成的“空间”,即“向量空间”。
假设平面直角坐标系中两个向量:
如图所示,如果要将这两个向量相加,可以按照中学物理所学习的“平行四边形”法则,得到了向量,其端点坐标如图中所标示。
“平行四边形”法则是几何方法,如果用代数方法计算,则可以这么做:
即对应坐标的数字相加——这其实就是中学物理中学习过的“正交分解法”。
显然,对于集合,所有的向量都遵循上述加法运算法则。
此外,如果用一个数值乘以某个向量,例如,则得到图1-2-3所示:
1-2-3
所得到的向量与原来的向量方向相同,但长度是原来的倍。其计算过程,可以如此:
因为这里的是标量(标量也称为“数量”),因此这种标量与向量相乘称为“数量乘法”。
显然,对于集合,所有的向量都遵循上述数量乘法运算法则。
在数学中,我们将集合称为一个向量空间,也称为线性空间。
上述加法和数量乘法运算法则,不仅仅在中成立,在中也同样成立。
★和是的两个向量: 是一个标量,它们遵循如下运算法则:
”
从上面的运算不难看出,加法和数量乘法的结果,还都是中的向量,我们称是加法封闭和数量乘法封闭。
根据向量空间的加法和数量乘法运算法则,可以得到如下8条推论,它们都是某个向量空间中向量所遵循的运算法则。
★设:向量,,,标量,,则:
”
特别注意,不是标量,而是指元素都是的向量,称为零向量,例如中的,即坐标系原点。
以上表示向量的时候,写成了一列,这种称为列向量。此外,也可以写成一行,如,那样,称为行向量。有时为了书写方便,会把列向量写成,T表示转置。
在程序中,创建行向量或者列向量,一般以NumPy数组实现。
import numpy as np
u = np.array([1, 6, 7])
u
输出:
array([1, 6, 7])
这里创建的一维数组u,就可以表示行向量。如果要创建列向量,可以这样操作:
v = u.reshape(-1,1)
v
输出:
array([[1],
[6],
[7]])
此外,在Pandas的DataFrame对象中,每一列(即每个特征)都可以认为是一个列向量。
在机器学习中,向量无处不在,可以说只要有计算,就离不开向量。为何?这是因为向量能够让提升运算速度。如下所示,我们创建一个由随机整数组成的列表:
import random
lst = [random.randint(1, 100) for i in range(100000)]
如果要计算列表中每个整数的平方,用Python循环语句可以这样执行(图1-2-4显示结果是在AI Studio中运行的结果):
1-2-4
用循环语句,耗时30毫秒。如果将列表转化为向量,完成同样的计算,结果如何?
1-2-5
图1-2-5所示结果显示,转化为数组(行向量)后,运行速度有了明显提高(注意:在AI Studio运行上述代码,所得运行时长可能有错差异,此结果仅供参考,读者也可以编写计时函数,在本地测量不同计算方式所耗费时长)。
所以,“向量化”是机器学习中的一个重要技巧,例如在自然语言处理(NLP)中,统计文本中的词的出现次数,就是NLP中常见的一种向量化,即创建词向量。
from sklearn.feature_extraction.text import CountVectorizer
vectorizer=CountVectorizer() # (1)
corpus=["mathematics machine learn", "learn python learn mathematics"] # (2)
cor_vec = vectorizer.fit_transform(corpus) # (3)
vectorizer.get_feature_names() # (4)
输出:
['learn', 'machine', 'mathematics', 'python']
在上述代码中,使用Scikit-Learn中的CountVectorizer创建词向量。(1)创建词向量模型;(2)是待分析的语料库,其中包含两条文本;(3)利用词向量模型对语料库进行训练转换,得到词向量对象。(4)显示所得模型特征,即语料库中都有哪些词语。
print(cor_vec)
输出:
(0, 2) 1
(0, 1) 1
(0, 0) 1
(1, 2) 1
(1, 0) 2
(1, 3) 1
1-2-6
还可以用DataFrame对象表示向量化结果:
import pandas as pd
df = pd.DataFrame(cor_vec.toarray(), columns=vectorizer.get_feature_names())
df
输出:
learn machine mathematics python
0 1 1 1 0
1 2 0 1 1
上述输出结果显示了每个文本的词语数量统计结果。在本示例中,每个文本的词语比较少,在真实的项目中,每个文本的词语会很多,如果多个文本,就会出现很多个特征,对于某一个文本而言,会出现在很多特征的值是0。
除了将词语出现次数进行向量化之外,在NLP中,还会实现TF-IDF向量化和哈希向量化,具体内容请参阅《数据准备和特征工程》(电子工业出版社)。