Сравнение наборов двумерных данных / диаграмм рассеяния - PullRequest
6 голосов
/ 05 февраля 2011

У меня есть 2000 наборов данных, каждый из которых содержит чуть более 1000 2D-переменных.Я рассчитываю на кластеризацию этих наборов данных в 20-100 кластеров на основе сходства.Однако у меня возникли проблемы с поиском надежного метода сравнения наборов данных.Я испробовал несколько (довольно примитивных) подходов и провел множество исследований, но, похоже, не могу найти ничего подходящего для того, что мне нужно делать.

Я разместил изображение ниже из 3 комплектовиз моих данных, построенных.Данные ограничены 0-1 по оси y и находятся в диапазоне ~ 0-0.10 по оси x (на практике, но теоретически могут быть больше 0,10).

Форма и относительные пропорциииз данных, вероятно, самые важные вещи для сравнения.Однако, абсолютные местоположения каждого набора данных также важны.Другими словами, чем ближе относительное положение каждой отдельной точки к отдельным точкам другого набора данных, тем больше они будут похожи, и тогда необходимо будет учитывать их абсолютные позиции.

Зеленый и красный должны бытьсчитается очень разным, но толчок приходит к толчку, они должны быть больше похожи, чем синий и красный.

http://img153.imageshack.us/img153/6730/screenshot20110204at004.png

Я пытался:

  • сравнивать на основе общего среднего и отклонения
  • разбивать переменные на координатные области (т.е.(0–0,10, 0–0,10), (0,10–0,20, 0,10–0,20) ... (0,9–1,0, 0,9–1,0)) и сравнивайте сходство на основе общих точек в регионах
  • попытался измерить среднее евклидово расстояние до ближайших соседей среди наборов данных

Все они дали ошибочные результаты.Самый близкий ответ, который я мог найти в своем исследовании, был « Подходящие метрики подобия для множества наборов 2D координат ».Тем не менее, ответ, данный там, предлагает сравнить среднее расстояние между ближайшими соседями от центроида, которое, я не думаю, будет работать для меня как направление, так же важно, как расстояние для моих целей.

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

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

Несмотря на то, что Велисарий хорошо ответил на это, вот пара комментариев:

, если бы вы могли уменьшить каждый набор на 1000 баллов до 32 кластеров по 32 балла в каждом (или 20 х 50 или ...)Тогда вы можете работать в 32-пространстве вместо 1000-пространства.Для этого попробуйте K-означает кластеризацию ;см. также SO вопросов / с тегами / k-means .

Один способ измерить расстояние между наборами A, B (точек, кластеров) состоит в том, чтобы взять ближайшие пары, как это:

def nearestpairsdistance( A, B ):
    """ large point sets A, B -> nearest b each a, nearest a each b """
        # using KDTree, http://docs.scipy.org/doc/scipy/reference/spatial.html
    Atree = KDTree( A )
    Btree = KDTree( B )
    a_nearestb, ixab = Btree.query( A, k=1, p=p, eps=eps )  # p=inf is fast
    b_nearesta, ixba = Atree.query( B, k=1, p=p, eps=eps )
    if verbose:
        print "a_nearestb:", nu.quantiles5(a_nearestb)
        print "b_nearesta:", nu.quantiles5(b_nearesta)
    return (np.median(a_nearestb) + np.median(b_nearesta)) / 2
        # means are sensitive to outliers; fast approx median ?

Вы могли бы затем кластеризовать свои 2000 точек в 32 пространствах до 20 кластерных центров за один выстрел:

centres, labels = kmeans( points, k=20, iter=3, distance=nearestpairsdistance )

(обычное евклидово расстояние не сработало бы)здесь вообще.)

Пожалуйста, продолжайте - расскажите нам, что сработало в конце, а что нет.

1 голос
/ 06 февраля 2011

в два этапа

1) Первое: отличить блюз.

Рассчитать среднее расстояние до ближайшего соседа, вплоть до отсечки. Выберите обрезку, например, черное расстояние на следующем изображении:

enter image description here

Синие конфигурации, поскольку они более рассеяны, дадут вам результаты, намного превосходящие красные и зеленые.

2) Второе: разграничить красные и зеленые

Не учитывайте все точки, расстояние до ближайшего соседа которых больше, чем что-то меньшее (например, одна четверть предыдущего расстояния). Кластеризация на близость, чтобы получить кластеры вида:

enter image description here и enter image description here

Откажитесь от кластеров с менее чем 10 очками (или около того). Для каждого кластера запустите линейное приближение и рассчитайте ковариации. Средняя ковариация для красного будет намного выше, чем для зеленого, так как зеленые в этом масштабе очень выровнены.

Вот, пожалуйста.

НТН!

...