Разделите точки данных на кластеры и взяв среднее значение для каждого кластера - PullRequest
0 голосов
/ 01 июля 2018

Предположим, у меня есть некоторые данные в матрице 2x4 (4 точки данных, 2 функции)

X = np.array([[4,3,5,6], = [x1 x2 x3 x4]
              [7,4,6,5]]) 

«Ближайшая» матрица 3x4, которая указывает ближайший кластер k к каждой точке данных x. (3 кластера, 4 точки данных)

C = [[1 0 1 0]
     [0 0 0 1]
     [0 1 0 0]]

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

Моя идея состояла в том, чтобы построить матрицу, которая бы выглядела так:

idea = [[x1 0  x3 0 ]
        [0  0  0  x4]
        [0  x2 0  0 ]]

Суммирование его элементов по столбцам с последующим делением на соответствующие элементы в np.sum(c,axis=1), поскольку среднее должно учитывать только те точки данных, которые принадлежат этому кластеру (т. Е. Не нули).

Окончательный ожидаемый результат в этом примере должен быть матрицей 3x2:

output = [(x1+x3)/2  = [ [4.5 6.5]
           x4            [6   5  ]
           x2       ]    [3   4  ]]
  1. Я даже не смог построить матрицу, похожую на мою idea матрицу.
  2. Я не знаю, является ли это наиболее эффективным способом решения этой проблемы

Я хочу избегать использования циклов for.

1 Ответ

0 голосов
/ 01 июля 2018

Вот векторизованная реализация вашей стратегии:

X = np.array([[4, 3, 5, 6],[7, 4, 6, 5]])
C = np.array([[1, 0, 1, 0], [0, 0, 0, 1], [0, 1, 0, 0]])
output = X @ C.T / np.sum(C, axis=1)

print(output)
# => [[4.5 6.  3. ]
#    [[6.5 5.  4. ]]

Поскольку ваши точки в X являются столбцами, я подумал, что более естественно, чтобы столбцы выходных данных были центрами масс кластеров. Вы можете транспонировать результат, если предпочитаете иначе.

...