Python 在大数据集上使用smart dot/matmul避免迭代
我正在尝试为MNIST数据集编写一个多类感知器算法 现在我有下面的代码可以工作,但是由于它的迭代次数是60k次,所以工作起来很慢 重量是指尺寸-(785,10) oneVsAllLabeling_ux)函数返回一个向量,该向量在argmax处包含1,在其他位置包含-1。真理标签当然也有同样的形式 使用该算法,我获得了约90%的准确率,安全但缓慢。 在进一步研究这个问题之后,我发现我可以使用数组/矩阵乘法来改进代码 因此,我开始做以下工作:Python 在大数据集上使用smart dot/matmul避免迭代,python,numpy,Python,Numpy,我正在尝试为MNIST数据集编写一个多类感知器算法 现在我有下面的代码可以工作,但是由于它的迭代次数是60k次,所以工作起来很慢 重量是指尺寸-(785,10) oneVsAllLabeling_ux)函数返回一个向量,该向量在argmax处包含1,在其他位置包含-1。真理标签当然也有同样的形式 使用该算法,我获得了约90%的准确率,安全但缓慢。 在进一步研究这个问题之后,我发现我可以使用数组/矩阵乘法来改进代码 因此,我开始做以下工作: def oneVsAllLabeling(X):
def oneVsAllLabeling(X):
idx = np.argmax(X, axis=1)
mask = np.zeros(X.shape, dtype=bool)
mask[np.arange(len(idx)),idx] = 1
out = 2 * mask - 1
return out.astype(int)
def zeroOneError(prediction):
tester = np.zeros((1, CLASSES))
good_prediction = len(np.where(prediction == tester))
return len(prediction) - good_prediction
def preceptronModelFitting(data, weights, labels, to_print, epoch=None):
prediction = np.matmul(data, weights)
prediction = oneVsAllLabeling(prediction)
diff = (prediction - labels) / 2
error = zeroOneError(diff)
accuracy = error / len(data)
if to_print:
print("Epoch: {}. Loss: {}. Accuracy: {}".format(epoch, error, accuracy))
return prediction, error, accuracy
def multiClassPLA2(train_data, train_labels, test_data, test_labels, weights):
predicted_output = np.zeros((1, CLASSES))
train_loss_vec = np.array([])
train_accuracy_vec = np.array([])
test_loss_vec = np.array([])
test_accuracy_vec = np.array([])
for epoch in range(EPOCH):
# randomize the data before each epoch
train_data, train_labels = randomizeData(train_data, train_labels)
train_prediction, train_error, train_accuracy = preceptronModelFitting(train_data, weights, train_labels, to_print=False)
return weights
调用preceptronModelFitting()后,我得到一个大小为(60k,10)的矩阵,每个条目的形状如下:
train_prediction[0]=[0,0,1,0,0,-1,0,0,0,0]
数据的形状为(60k785)
现在我需要做的是,如果可能的话,将每一行与每个数据项相乘并求和,这样总的来说,我得到的是一个矩阵大小(785,10),我可以用它更新旧的权重集
这几乎等同于我在非高效算法中所做的,唯一的区别是我更新每个新数据项的权重,而不是在看到所有数据之后
谢谢 好的,你完成了大部分工作,甚至你的标题中也有部分答案
np.matmul(X.T, truth - prediction)
使用这个,它将在一行中得到你想要的。
请注意,这是基于一个事实,事实上,真理、预测、X都是你提到的。好的,你完成了大部分工作,甚至你的标题中也有部分答案
np.matmul(X.T, truth - prediction)
使用这个,它将在一行中得到你想要的。
注意,这是基于一个事实,事实上,真理,预测,X是你提到的