Набор данных для бессмысленного «Ближайшего соседа»?

В статье «Когда имеет значение «ближайший сосед»?» мы читаем: «Мы показываем, что при определенных общих условиях (с точки зрения распределения данных и запросов или рабочей нагрузки) по мере увеличения размерности расстояние до ближайшего соседа приближается к расстоянию до самого дальнего соседа. Другими словами, контраст в расстояниях до разных точек данных становится несуществующим. Определенные нами условия, в которых это происходит, намного шире, чем предположение о независимых и одинаково распределенных (IID) измерениях, которое предполагает другая работа».

Мой вопрос в том, как мне создать набор данных, который напоминает этот эффект? Я создал три точки, каждая из которых имеет 1000 измерений со случайными числами в диапазоне от 0 до 255 для каждого измерения, но точки создают разные расстояния и не воспроизводят то, что упомянуто выше. Кажется, что изменение размеров (например, 10, 100 или 1000 размеров) и диапазонов (например, [0,1]) ничего не меняет. Я все еще получаю разные расстояния, которые не должны быть проблемой, например. алгоритмы кластеризации!


person U66    schedule 27.12.2016    source источник


Ответы (2)


Я думаю, что бумага правильная. Во-первых, ваш тест: одной из проблем с вашим тестом может быть то, что вы используете слишком мало баллов. Я использовал 10000 точек, и ниже приведены мои результаты (равномерно распределенные точки в [0,0 ... 1,0] во всех измерениях). При DIM=2 min/max различаются почти в 1000 раз, при DIM=1000 они отличаются только в 1,6 раза, при DIM=10000 в 1,248 раза. Так что я бы сказал, что эти результаты подтверждают гипотезу статьи.

DIM/N = 2 / 10000
min/avg/max= 1.0150906548224441E-5 / 0.019347838262624064 / 0.9993862941797146    
DIM/N = 10 / 10000.0
min/avg/max= 0.011363500131326938 / 0.9806472676701363 / 1.628460468042207
DIM/N = 100 / 10000
min/avg/max= 0.7701271349716637 / 1.3380320375218808 / 2.1878136533925328
DIM/N = 1000 / 10000
min/avg/max= 2.581913326565635 / 3.2871335447262178 / 4.177669393187736
DIM/N = 10000 / 10000
min/avg/max= 8.704666143050158 / 9.70540814778645 / 10.85760200249862

DIM/N = 100000 / 1000 (N=1000!)
min/avg/max= 30.448610133282717 / 31.14936583713578 / 31.99082677476165

Я предполагаю, что объяснение таково: давайте возьмем три случайно сгенерированных вектора, A, B и C. Общее расстояние основано на сумме расстояний каждой отдельной строки этих векторов. Чем больше размерностей имеют векторы, тем больше общая сумма разностей будет приближаться к общему среднему. Другими словами, крайне маловероятно, что вектор C во всех элементах имеет большее расстояние от A, чем другой вектор B от A. С увеличением размеров C и B будут иметь все более близкое расстояние до A (и друг от друга).

Мой тестовый набор данных был создан следующим образом. Набор данных, по сути, представляет собой куб со значениями от 0,0 до 1,0 в каждом измерении. Координаты были созданы с равномерным распределением по всем измерениям от 0,0 до 1,0. Пример кода (N=10000, DIM=[2..10000]):

public double[] generate(int N, int DIM) {
    double[] data = new double[N*DIM];
    for (int i = 0; i < N; i++) {
        int pos = DIM*i;
        for (int d = 0; d < DIM; d++) {
            data[pos+d] = R.nextDouble();
        }
    }
    return data;
}

Следуя уравнению, приведенному внизу принятого ответа здесь, мы получаем:

d=2 -> 98460

d=10 -> 142.3

d=100 -> 1.84

d=1,000 -> 0.618

d=10,000 -> 0.247

d = 100 000 -> 0,0506 (при использовании N = 1000)

person TilmannZ    schedule 03.01.2017
comment
Здравствуйте, см. здесь , само расстояние должно увеличиваться, но относительное расстояние уменьшается. - person U66; 04.01.2017
comment
Я думаю, что ваша ссылка не работает. Мои результаты показывают, что расстояние увеличивается (как вы говорите), а разница в расстоянии уменьшается. Что вы подразумеваете под «относительным» расстоянием? - person TilmannZ; 04.01.2017
comment
Плохо, что это настоящая ссылка . См. выбранный ответ и комментарии. - person U66; 04.01.2017
comment
Насколько я понимаю "относительное расстояние", именно это и показывают мои эксперименты, оно уменьшается с 0,999999.. (DIM=2) до 0,6178.... (DIM=1000). Я обновлю ответ лучшим описанием создания набора данных. - person TilmannZ; 04.01.2017
comment
спасибо за предоставление реального кода и примера, это соответствует моим собственным экспериментам. - person U66; 04.01.2017

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

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

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

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


Изменить о:

расстояния для каждой точки стали больше с большим количеством измерений!!!!

это ожидаемо, поскольку чем выше размерность пространства, тем оно разреженнее, а значит, тем больше расстояние. Более того, это ожидаемо, если подумать, например, о евклидовом расстоянии, которое становится тем больше, чем больше размеры.

person gsamaras    schedule 28.12.2016
comment
Я задал этот вопрос также в разделе статистики см. как я объяснил там, я также использовал многомерное нормальное распределение до 1600 измерений и провел несколько экспериментов. Это распределение должно создавать сферические формы, но я не только не получил этого эффекта, но и увидел, что разница между минимальным и максимальным расстоянием для каждой точки становилась больше с увеличением размеров!!!! - person U66; 28.12.2016
comment
Я обновил свой ответ на основе вашего комментария. Надеюсь это поможет. Кстати, если вы нашли этот ответ полезным, пожалуйста, примите ответ. Обратите внимание, что вы не можете проголосовать за ваш вопрос, как это сделал я, из-за вашей низкой репутации. - person gsamaras; 28.12.2016