Рефакторинг алгоритма K-средних в python с использованием numpy - PullRequest
0 голосов
/ 20 апреля 2019

Я изучаю алгоритм K-средних в python и сделал этот код интуитивно понятным и хочу предложения по его оптимизации и рефакторингу.

for i in range(N):
        for j in range(K):
               averages[i, j] = np.linalg.norm(trips[i] - centroids[j])**2

        for i in range(N):
                assigns[i] = int(np.argmin(averages[i]))

        for i in range(K):

                temp = np.zeros([F])
                temp = np.expand_dims(temp, axis=0)

                for j in range(N):
                        if(int(assigns[j]) == i):
                                temp = np.insert(temp, 0, trips[j], axis=0);

                temp = temp[:-1, :]

                if(temp.shape[0] > 0):
                        centroids[i] = temp.sum(axis=0) / temp.shape[0]

Спасибо!

1 Ответ

0 голосов
/ 21 апреля 2019

Вы можете использовать понимание списка, оно должно немного ускориться:

for i1 in range(N):
        averages[i1] = [np.linalg.norm(trips[i1] - centroids[j])**2 for j in range(K)]

        assigns = [int(np.argmin(averages[i2])) for i2 in range(N)]

        for i3 in range(K):
                temp = np.zeros([F])
                temp = np.expand_dims(temp, axis=0)

                for j in range(N):
                        if(int(assigns[j]) == i3):
                                temp = np.insert(temp, 0, trips[j], axis=0)

                temp = temp[:-1, :]

                if(temp.shape[0] > 0):
                        centroids[i3] = temp.sum(axis=0) / temp.shape[0]

Я переименовал некоторые индексы, поэтому я не знаю, правильно ли я выбрал правильные в формулах.В любом случае, я не рекомендую использовать один и тот же индекс во вложенных циклах, это может привести к трудностям при поиске.

...