Python 在大数据集上使用smart dot/matmul避免迭代

Python 在大数据集上使用smart dot/matmul避免迭代,python,numpy,Python,Numpy,我正在尝试为MNIST数据集编写一个多类感知器算法 现在我有下面的代码可以工作,但是由于它的迭代次数是60k次,所以工作起来很慢 重量是指尺寸-(785,10) oneVsAllLabeling_ux)函数返回一个向量,该向量在argmax处包含1,在其他位置包含-1。真理标签当然也有同样的形式 使用该算法,我获得了约90%的准确率,安全但缓慢。 在进一步研究这个问题之后,我发现我可以使用数组/矩阵乘法来改进代码 因此,我开始做以下工作: def oneVsAllLabeling(X):

我正在尝试为MNIST数据集编写一个多类感知器算法

现在我有下面的代码可以工作,但是由于它的迭代次数是60k次,所以工作起来很慢

重量是指尺寸-(785,10)

oneVsAllLabeling_ux)函数返回一个向量,该向量在argmax处包含1,在其他位置包含-1。真理标签当然也有同样的形式

使用该算法,我获得了约90%的准确率,安全但缓慢。 在进一步研究这个问题之后,我发现我可以使用数组/矩阵乘法来改进代码

因此,我开始做以下工作:

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是你提到的