Как ускорить разработанный алгоритм kNN - PullRequest
0 голосов
/ 30 апреля 2020

Я только начинаю изучать python, я написал алгоритм kNN с использованием кластеризации и неравенства треугольников, но он медленнее, чем грубый. Я вижу, что код плохой, но я не могу переписать его. Может быть, вы можете рассказать, как ускорить программу?

def distance(x, y):
    if method == 'euclidean':
    return np.sqrt(np.sum((x-y)**2))  

k-means используется для тренировочного набора. Точки сортируются по расстоянию до центров.

def k_means(X, c):

    kmeans = KMeans(n_clusters=c).fit(X)
    centroids = kmeans.cluster_centers_

    distr = np.zeros((len(X), 3))
    distr[:, 0] = X[:, 0]
    distr[:, 1] = kmeans.predict(X)

    for i in range(len(X)):
        distr[i, 2] = distance(distr[i, 0], centroids[int(distr[i, 1])]) 

    distr = distr[distr[:, 2].argsort()[::-1]]

    return distr, centroids

kNN используется для тестового набора, поиск k соседей из обучающего набора.

def kNN(X, distr, cent, k=2):
    result = []

    for i in range(len(X)):
        c_d = np.zeros((len(cent), 2))
        c_d[:, 0] = np.arange(len(cent))
        knn = []

        for j in range(len(cent)):
            c_d[j, 1] = distance(X[i], cent[j])
        c_d = c_d[c_d[:, 1].argsort()]

        for temp_cl in range(len(cent)):
            P = distr[distr[:, 1] == c_d[temp_cl, 0]]

            for j in range(len(P)):
                if len(knn) < k:
                    d = distance(X[i], P[j, 0])
                    knn.append([P[j, 0], d])

                else:
                    d_max = max(knn[:][1])
                    if d_max <= abs(c_d[temp_cl, 1] - P[j, 2]):
                        break
                    else:
                        d = distance(X[i], P[j, 0])
                        if d_max > d:
                            m = np.where(d_max)[0]
                            knn[m[0]][0] = P[j, 0]
                            knn[m[0]][1] = d

        result.append(knn)
    result = np.array(result)
    indexes = result[:, :, 0]
    distances = result[:, :, 1]

    return indexes, distances
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...