#python #data-mining
#python #интеллектуальный анализ данных
Вопрос:
это довольно глупый вопрос, но в основном мои данные разделены на разные кластеры с использованием k-means, это для проекта класса, кстати. У меня все работает, но я должен записывать свои кластеры в файл для каждого ввода, чтобы его можно было протестировать. Мой фактический код занимает около 2-3 минут для запуска, но для записи в файл требуется около 10 минут. У меня 10 000 входов / выходов, и в настоящее время мое время выполнения составляет около n ^ 3. Время на самом деле не имеет значения в том, что касается назначения, но я хотел знать, может ли кто-нибудь помочь мне оптимизировать его, я знаю, что есть разные приемы итерации Python, о которых я не знаю, которые могли бы ускорить это.
Мой k равен 10, поэтому у меня 10 центроидов, в основном я выбираю массив и выбираю один из центроидов, проверяю, есть ли в нем массив, если нет, я перехожу к следующему и так далее. Я делаю это для каждого 10000 ввода, что занимает много времени. Код не очень эффективен
file = open("image.txt", "w")
for point in array:
for x in range(len(centroids)):
for i in centroids[x]:
if np.array_equal(point,i):
file.write(str(x 1) "n")
file.close()
Комментарии:
1. Вероятно, вам нужно сочетание
numpy.intersect1d
(это можно использовать и для поиска пересечения строк 2D-массивов) иnumpy.savetxt
… Вы пытаетесь найти пересечение междуarray
иcentroids
и записать результат в файл?2. Если ваши центроиды представляют собой список, то
for ct in centroids
вместо этого вы сэкономите один уровень вложенности. Я бы также предпочел фактически выполнить операцию пересечения вне файлового буфера.
Ответ №1:
Хорошо, давайте я попробую кое-что почистить. Прокомментируйте и дайте мне знать, если что-то, что я говорю, не применимо. Кроме того, если вам нужно все проверять, возможно, вы не сможете упростить вычисления.
with open("image.txt", "w") as file:
for point in array:
for centroid_index, centroid in enumerate(centroids):
for centroid_point in centroid:
if np.array_equal(point,centroid_point):
file.write(str(centroid_index 1) "n")
Если бы вы могли объяснить мне типы объектов array
, centroids
, и что вы пытаетесь записать в файл, тогда я мог бы дать несколько более конкретных методов.
Комментарии:
1. массив — это массив numpy, в котором хранятся все мои данные, размер 10 000 x 749 Центроидов — это мои кластеры, их 10. Затем каждый кластер содержит разные массивы, которые представляют мои точки. Итак, в основном я должен проверять каждый кластер, а затем проверять каждую точку в этом кластере, чтобы увидеть, соответствует ли какая-либо из них моей текущей точке
2. Хорошо, на самом деле я просто создал массив и добавил значение кластера к каждому индексу, когда назначил точки кластеру. Таким образом, мне нужно только пойти и записать значения массива в файл!
3. Вы все равно должны использовать диспетчер контекста и синтаксис, который я показал. Его более чистый код
Ответ №2:
Эта строка — плохая идея:
for point in array:
Зачем перебирать точки, чтобы найти центроиды?
Просто выводите их по индексу и выполняйте итерации только по центроидам.