Это довольно общий вопрос 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-средства в действии