Наличие двух числовых массивов ( выборок против кластеров ):
data(n_samples, n_featuers)
clusters(n_clusters, n_features)
Цель состоит в том, чтобы вычислить числовой массив индексов ближайших кластеров для каждой выборки:
new_assignments(n_samples)
Ниже приведен код:
def assign_clusters_to_samples(data, clusters, assignments):
# clusters-array of clusters, sample-single sample from the database
def get_index_from_euclidean_distances(clusters, sample):
e_distances = np.sqrt(np.sum(np.power(np.subtract(clusters,sample),2), axis=1))
# return index with the minimal distance
return np.where(e_distances==np.min(e_distances))[0]
new_assignments = np.empty((0,1), int)
# iterate through all samples
for i in range(data.shape[0]):
new_assignments = np.append(new_assignments, get_index_from_euclidean_distances(clusters,data[i]))
# return new assignments and True if there is a difference to last assignments, False otherwise
return new_assignments, find_difference(new_assignments, assignments)
Однако он очень медленный.Как сделать процесс быстрее?Есть ли другие оптимальные способы решения проблемы?
РЕДАКТИРОВАТЬ:
Мой код выше является основной частью алгоритма кластеризации k-средних, который отвечает за 99,9% времени выполнения.Я создаю его с нуля в образовательных целях, и с вашими ответами я получил то, что мне было нужно. (Извините за более раннее редактирование и путаницу, это мой первый вопрос, будущие вопросы будут более конкретными и предоставят всю информацию и данные, необходимые для отладки ивоспроизводимость проблемы)
Спасибо Sobek .Применение np.apply_along_axis
улучшенной производительности с оригинального до apply_along_axis .
Я продолжу строить решение, предложенное Эли Корвиго .
Большое спасибо!