如何对这段代码进行Numpy优化?

3
我有以下代码片段:
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

这段代码运行速度太慢了。有没有什么优化方法可以做?

什么是“条件”? - unutbu
@unutbu,“迭代次数 > 0”。 - Denis
1
那么 while 循环是无限的吗? - unutbu
@unutbu,不是的。我只是从示例中删除了“counter”。 - Denis
2
你真的想在for j循环内部重置summ=0吗?这样做会丢弃for j循环的每次迭代所做的所有工作,除了当j等于num_features-1时的最后一次迭代。 - unutbu
显示剩余3条评论
2个回答

4
您可以高效地使用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)

2
您可以使用np.dot进行矩阵乘法,直接获取new_weights,如下所示-
new_weights = self.weights- ((self.alpha / num_examples) * np.dot(K[None],X))

1
谢谢你的帮助!看起来你的代码是正确的,但比Saullo Castro的代码慢了一点。 - Denis
1
@Denis 是的,einsum 似乎是优化解决方案的最佳选择! - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接