How do I perform Numpy optimizations for this code?

I have the following piece of code:

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

      

This code is too slow. Is there some kind of optimization I can do?

+3


source to share


2 answers


You can use effectively np.einsum()

. See test version below:



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)

      

+4


source


You can get new_weights

directly using matrix-multiplication

using np.dot

like this -



new_weights = self.weights- ((self.alpha / num_examples) * np.dot(K[None],X))

      

+2


source







All Articles