Найдите граничные точки массива numpy для инициализации центроидов kmeans

Я работаю над реализацией алгоритма kmeans в python. Я тестирую новые способы инициализации своих центроидов и хотел реализовать их и посмотреть, как это повлияет на кластер.

Моя идея состоит в том, чтобы выбрать точки данных из моего набора данных таким образом, чтобы центроиды были инициализированы краевыми точками моих данных.

Пример простого примера 2 атрибута:

Допустим, это мой входной массив

input = array([[3,3], [1,1], [-1,-1], [3,-3], [-1,1], [-3,3], [1,-1], [-3,-3]])

Графический пример ввода

Из этого массива я хотел бы выбрать точки ребер, которые будут [3,3] [-3,-3] [-3,3] [3,-3]. Итак, если мой k равен 4, эти точки будут выбраны

В данных, с которыми я работаю, есть 4 и 9 атрибутов и около 300 точек данных в моем наборе данных.

примечание: я не нашел решения, когда k ‹> краевых точек, но если k > краевых точек, я думаю, что я бы выбрал эти 4 точки, а затем попытался разместить остальные вокруг центральной точки графика.

Я также подумал о том, чтобы найти максимум и минимум для каждого столбца и оттуда попытаться найти края моего набора данных, но у меня нет представления об эффективном способе определения краев из этих значений.

Если вы считаете, что эта идея не сработает, я хотел бы услышать, что вы хотите сказать.

Вопросы

  1. Есть ли у numpy такая функция для получения индексов точек данных на краю моего набора данных?
  2. Если нет, то как мне найти эти краевые точки в моем наборе данных?

person Thor    schedule 25.11.2017    source источник
comment
Что вы подразумеваете под краевыми точками?   -  person akilat90    schedule 25.11.2017
comment
Извините, если я был неясен, под краевыми точками я подразумеваю точки данных, которые в наборе данных включают максимум/минимум атрибута, что делает их самыми удаленными от центра. Я обновил вопрос изображением, которое, я надеюсь, лучше объясняет это.   -  person Thor    schedule 25.11.2017


Ответы (1)


Используйте scipy и парные расстояния, чтобы узнать, насколько далеко каждый из них находится от другого:

from scipy.spatial.distance import pdist, squareform
p=pdist(input)

Затем используйте sqaureform, чтобы преобразовать вектор p в матричную форму:

s=squareform(pdist(input))

Затем используйте numpy argwhere, чтобы найти индексы, где значения максимальны или экстремальны, а затем найдите эти индексы во входном массиве:

input[np.argwhere(s==np.max(p))]

array([[[ 3,  3],
        [-3, -3]],

       [[ 3, -3],
        [-3,  3]],

       [[-3,  3],
        [ 3, -3]],

       [[-3, -3],
        [ 3,  3]]])

Полный код будет:

from scipy.spatial.distance import pdist, squareform
p=pdist(input)
s=squareform(p)
input[np.argwhere(s==np.max(p))]
person skrubber    schedule 25.11.2017
comment
Спасибо тебе за это. Это в направлении того, что я хотел. Я пробую ваш код, но получаю некоторые проблемы, продолжу этот подход arr[argwhere(p==max(p))] приводит к ошибке значения: | ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all() - person Thor; 25.11.2017
comment
arr равен вводу? - person skrubber; 25.11.2017
comment
да: обр = массив([[3,3], [1,1], [-1,-1], [3,-3], [-1,1], [-3,3], [1 ,-1], [-3,-3]]) - person Thor; 25.11.2017
comment
у меня работает с обр. ранее пропущена закрывающая скобка для argwhere. отредактировано. Проверь сейчас. - person skrubber; 25.11.2017
comment
Хотел бы я иметь другой способ поделиться этим. Это код, с которым я работаю, и полученная ошибка прокомментирована ниже: общий код - person Thor; 25.11.2017
comment
Хорошо, я вижу проблему, одинаковое имя переменной для квадратной формы и pdist, если я делаю p=pdist(arr);s=squareform(p);arr[argwhere(s==max(p))], это работает! Я обновил ваш комментарий и принял его. Большое спасибо! - person Thor; 25.11.2017
comment
Готово, нужно добавить больше изменений, чтобы я мог изменить это. добавлен сводный код - person Thor; 25.11.2017
comment
Давайте продолжим это обсуждение в чате. - person Thor; 25.11.2017