Как более эффективно записывать кластеры в файл?

#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:
  

Зачем перебирать точки, чтобы найти центроиды?

Просто выводите их по индексу и выполняйте итерации только по центроидам.