У меня есть эта функция, которая является частью файла, который я создал для алгоритма кластеризации K-Means.
def assign_to_cluster_mean_centroid(x_in=x, centroids_in=centroids, n_user=n):
'''This function calculates the euclidean distance between each data point and
a cluster centroid. It then allocates each data point to the centroid that it is the
closest to in distance.'''
distances_arr_re = np.reshape(distance_between(
centroids_in, x_in[0]), (len(centroids_in), len(x_in[0])))
datapoint_cen = []
distances_min = [] # Done if needed
for value in zip(*distances_arr_re):
distances_min.append(min(value))
datapoint_cen.append(np.argmin(value)+1)
clusters = {}
for no_user in range(0, n_user):
clusters[no_user+1] = []
for d_point, cent in zip(x_in[0], datapoint_cen):
clusters[cent].append(d_point)
# Run a for loop and rewrite the centroids
# with the newly calculated means
for i, cluster in enumerate(clusters):
reshaped = np.reshape(clusters[cluster], (len(clusters[cluster]), 2))
centroids[i][0] = sum(reshaped[0:, 0])/len(reshaped[0:, 0])
centroids[i][1] = sum(reshaped[0:, 1])/len(reshaped[0:, 1])
print('Centroids for this iteration are:' + str(centroids))
return datapoint_cen, clusters
Эта функция возвращает два значения: список (datapoint_cen), который содержит все метки, полученные из расстояний, рассчитанных для каждой точки данных до ее ближайшего центроида, а также словарь (кластеры), содержащий каждый кластерс выделенными точками данных для каждого кластера.
Затем у меня есть основной цикл, и я вызываю эту функцию дважды, как показано ниже:
# Create the dataframe for vizualisation
cluster_data = pd.DataFrame({'Birth Rate': x[0][0:, 0],
'Life Expectancy': x[0][0:, 1],
'label': assign_to_cluster_mean_centroid()[0],
'Country': x[1]})
, а также
mean = assign_to_cluster_mean_centroid()[1]
Моя проблема заключается в том, что при повторном вызове функции при присвоении ее переменной «mean» функция пересчитывает все и возвращает новый набор значений для кластеров. Мне нужно извлечь, при втором вызове функции, кластеры первого вызова функции, чтобы мой алгоритм был точным. Любая помощь будет высоко ценится.