Какова лучшая практика кодирования для хранения записей итераций / производительности? - PullRequest
0 голосов
/ 03 марта 2020

Это довольно общий вопрос c, но я все еще не понимаю, как к этому подойти. Предположим, у меня есть начальный вектор, и он служит отправной точкой перед любым l oop. Я хотел бы сохранить историю векторов и ошибок, чтобы оживить производительность алгоритма.

              initial vector | error |
iteration 0 | updat_0 vector | error |
iteration 1 | updat_1 vector | error |
iteration 2 | updat_2 vector | error | if stop conditions are met --> return updat_1 vector

Является ли эта логика c правильной?

ОБНОВЛЕНИЕ: Код ниже работает, как я и ожидал, но, возможно, его можно улучшить (некоторые вычисления повторяются). Я с нетерпением жду ваших мнений и советов (рассмотрите другие возможные критерии остановки, например, без изменений или увеличения ошибки).

def K_means_2(data, n_clusters=3, ini_method='++', max_iter=10, show=True):

    centroids_hist = []
    error_hist = []

    if ini_method == '++':
        centroids = plus_plus_fast(data, n_clusters)
    else:
        centroids = data[np.random.RandomState(0).choice(data.shape[0], n_clusters, replace=False)]

    distance = compute_distance(centroids, data) 
    assignment = np.argmin(distance, axis=0)
    error = np.array([distance[centroid][np.where(assignment==centroid)].sum() for centroid in range(centroids.shape[0])])

    centroids_hist.append(centroids)
    error_hist.append(error)

    iteration = 0
    done = False
    while done is not True:
        centroids_new = np.array([data[assignment == centroid].mean(axis=0) for centroid in range(centroids.shape[0])])

        # stop criteria
        if iteration >= max_iter or np.all(centroids_new == centroids):
                done = True
        else:
            centroids = centroids_new
            distance = compute_distance(centroids, data) 
            assignment = np.argmin(distance, axis=0)
            error = np.array([distance[centroid][np.where(assignment==centroid)].sum() for centroid in range(centroids.shape[0])])

            centroids_hist.append(centroids)
            error_hist.append(error)
            iteration += 1

return np.array(centroids_hist), np.array(error_hist)

centroids_hist, error_hist = K_means_2(A, n_clusters=3, ini_method='random', max_iter=10, show=False)

K-средства в действии

...