机器学习的向量化技巧

在实现一些机器学习(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向量化实现的形式。

相关推荐