机器学习的向量化技巧
在实现一些机器学习(ML)算法时计算两个矩阵之间的L2距离是一个常见的步骤,就像kNN分类一样,我们需要计算所有训练和测试例子之间的L2距离。如果有Ntr训练样例和Nte测试例子,这一步应该产生Nte x Ntr矩阵,其中每个元素(i, j)是第i个测试示例和第j个训练示例之间的距离。在下面的实现中,Xtrain是(5000,2304)矩阵,ytrain是(5000,1)矩阵。Xtest是(500,2304)矩阵,ytest是(500,1)矩阵。由于大小表明有5000个训练样本和500个测试样本。
现在我有以下提到的各种实现找到L2距离:
1) 2 ‘for’ loops (NO 向量化)
2) 1 ‘for’ loop (PARTIAL向量化)
3) NO ‘for’ loop (FULL 向量化)
1) 2 ‘for’ loops (NO 向量化)
num_test = Xtest.shape[0]
num_train = Xtrain.shape[0]
dists = np.zeros((num_test, num_train))
for i in range(num_test):
for j in range(num_train):
dists[i, j] = np.sqrt(np.sum((X[i] - self.X_train[j])**2))
pass
print(dists)
NO向量化所花费的时间= 34.99秒
2) 1 ‘for’ loop (PARTIAL向量化)
num_test = Xtest.shape[0]
num_train = Xtrain.shape[0]
dists = np.zeros((num_test, num_train))
for i in range(num_test):
Xte = X[i, np.newaxis]
dists[i, :] = np.sqrt(np.sum((Xte - Xtrain)**2, axis = 1))
print(dists)
部分向量化算法所花费的时间= 17.18秒
3) NO ‘for’ loop (FULL 向量化)
num_test = Xtest.shape[0]
num_train = Xtrain.shape[0]
dists = np.zeros((num_test, num_train))
dists = np.sqrt(-2 * np.dot(Xtest, Xtrain.T) + np.sum(Xtrain ** 2, axis=1) + (np.sum(Xtest ** 2, axis=1))[:, np.newaxis])
完全向量化alog所需的时间= 0.44秒
可以清楚地看到,FULLY向量化实现表现最佳。 p和q之间的欧几里德距离就是这个位移向量的欧几里德长度:
这相当于:
这就是用于FULLY向量化实现的形式。