我有以下代码片段:

def func1(self, X, y):
    #X.shape = (455,13)
    #y.shape = (455)

    num_examples, num_features = np.shape(X)
    self.weights = np.random.uniform(-1 / (2 * num_examples), 1 / (2 * num_examples), num_features)

    while condition:
        new_weights = np.zeros(num_features)
        K = (np.dot(X, self.weights) - y)

        for j in range(num_features):
            summ = 0

            for i in range(num_examples):
                summ += K[i] * X[i][j]

            new_weights[j] = self.weights[j] - ((self.alpha / num_examples) * summ)

        self.weights = new_weights

这个代码太慢了。有什么我能做的优化吗?

最佳答案

您可以有效地使用np.einsum()请参阅下面的测试版本:

def func2(X, y):
    num_examples, num_features = np.shape(X)
    weights = np.random.uniform(-1./(2*num_examples), 1./(2*num_examples), num_features)

    K = (np.dot(X, weights) - y)

    return weights - alpha/num_examples*np.einsum('i,ij->j', K, X)

10-08 17:45