Математика: это кластеризация k-средних?

введите здесь описание изображения

Привет! У меня есть несколько точек на линии. Эти точки не имеют измерения Y, только измерение X. Я разместил их только в измерении Y, потому что это хотело иметь возможность размещать несколько точек в одном и том же месте.

Я хотел бы найти n центроидов (пятен с наибольшей плотностью).

Я разместил, например, центроиды (=зеленые линии), чтобы показать, что я имею в виду. Эти примерные центроиды не были рассчитаны, я только разместил их, угадывая, где они будут.

Прежде чем углубиться в математику, я хотел бы знать, можно ли это решить с помощью k-means-clustering, или я иду в неправильном направлении.

Спасибо.


person tmighty    schedule 17.10.2013    source источник
comment
ИМО, вы просто заходите не на тот сайт! :) Попробуйте с math.stackexchange.com   -  person Adriano Repetti    schedule 17.10.2013
comment
изображение не работает (оно дает красный крест), но с одномерным набором данных, я думаю, вы могли бы создавать кластеры, а затем рисовать точки на кластер (т.е. кластеризовать как ось x и точки как ось Y, возможно линия на оси x для описания центроидов?) см. также: > stackoverflow.com/questions/7869609/   -  person Carst    schedule 17.10.2013
comment
@Adriano Прошу не согласиться: stats.stackexchange.com   -  person Has QUIT--Anony-Mousse    schedule 17.10.2013
comment
@Anony-Mousse, ты прав!   -  person Adriano Repetti    schedule 17.10.2013


Ответы (2)


K-means довольно чувствителен к шуму, а у вас, похоже, много шума. Но да, это может работать в какой-то степени. Кроме того, он не использует то, что ваши данные являются всего лишь одномерными.

Однако мне кажется, что вы хотите выполнить какой-то очень примитивный поиск режима. В 1D наиболее подходящим подходом для вас является Оценка плотности ядра, а затем выберите локальные максимумы плотности .

«Кластерный анализ», конечно, звучит куда более красиво, но, тем не менее, классическая статистика «KDE», скорее всего, даст гораздо лучшие результаты. В частности, вам не нужно заранее исправлять "k", и он будет намного надежнее. шум.

person Has QUIT--Anony-Mousse    schedule 17.10.2013

Вы можете использовать K-means, и на самом деле реализация очень проста:

  1. Выберите необходимое количество кластеров
  2. Выберите k точки случайным образом (вы можете повторить это, чтобы избежать локального оптимума)
  3. Найдите расстояние друг от друга до этих k центров.
  4. Назначить точки ближайшему центру
  5. Для каждого набора баллов рассчитайте среднее
  6. Если среднее значение меняется, переместите центры кластеров к новым средним значениям и перейдите к шагу 3.
  7. В противном случае закончить

Или вы можете использовать Matlab, чтобы сделать это за вас:

k = 2;
rng('default') % For reproducibility
X = [randn(100,1)+ones(100,1);...
     randn(100,1)-ones(100,1)];

opts = statset('Display','final');
[idx,ctrs] = kmeans(X,k,'Distance','city','Replicates',5,'Options',opts);

plot(X(idx==1,1),X(idx==1,1),'r.','MarkerSize',12)
hold on
plot(X(idx==2,1),X(idx==2,1),'b.','MarkerSize',12)
plot(ctrs(:,1),ctrs(:,1),'kx','MarkerSize',12,'LineWidth',2)
plot(ctrs(:,1),ctrs(:,1),'ko','MarkerSize',12,'LineWidth',2)
legend('Cluster 1','Cluster 2','Centroids','Location','NW')
hold off

Я поместил результат по диагонали, чтобы лучше показать его, но реальные данные 1D:

введите здесь описание изображения

person NKN    schedule 08.05.2014