Как сгенерировать эту форму в Matlab? - PullRequest
2 голосов
/ 03 декабря 2011

В Matlab, как создать два кластера случайных точек, как на следующем графике.Можете ли вы показать мне сценарии / код?

Target shape

Ответы [ 3 ]

5 голосов
/ 03 декабря 2011

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

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

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

C1 = [0 0];   % center of the circle
C2 = [-5 7.5];
R1 = [8 10];  % range of radii
R2 = [8 10];
A1 = [1 3]*pi/2; % [rad] range of allowed angles
A2 = [-1 1]*pi/2;

nPoints = 500;

urand = @(nPoints,limits)(limits(1) + rand(nPoints,1)*diff(limits));
randomCircle = @(n,r,a)(pol2cart(urand(n,a),urand(n,r)));

[P1x,P1y] = randomCircle(nPoints,R1,A1);
P1x = P1x + C1(1);
P1y = P1y + C1(2);

[P2x,P2y] = randomCircle(nPoints,R2,A2);
P2x = P2x + C2(1);
P2y = P2y + C2(2);

figure
plot(P1x,P1y,'or'); hold on;
plot(P2x,P2y,'sb'); hold on;
axis square

Это дает:

Outcome

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

2 голосов
/ 03 декабря 2011

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

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

Как уже было сказано, традиционные инструменты кластеризации, такие как k-means, потерпят неудачу. К счастью, в наборе инструментов для обработки изображений уже есть хорошие инструменты для этих целей. Я мог бы предложить преобразовать график в изображение, используя заполненные точки для построения точек. Убедитесь, что точки достаточно большие, чтобы они касались друг друга в кластере с некоторым перекрытием. Затем используйте инструменты для расширения / эрозии, если необходимо, чтобы убедиться, что любые небольшие трещины заполнены, но не заходите так далеко, чтобы кластеры слились. Наконец, используйте инструменты сегментации региона, чтобы выделить кластеры. После этого преобразуйте обратно из пиксельных единиц изображения в ваши пространственные единицы, и вы выполнили свою задачу.

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

2 голосов
/ 03 декабря 2011

К-значит не даст вам то, что вы хотите.

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

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

Для достижения вашей цели:

  • Использовать нелинейный алгоритм кластеризации.
  • Применение нелинейного преобразования к вашим входным данным. (Возможно, не осуществимо).

Вы можете найти список алгоритмов нелинейной кластеризации здесь . В частности, посмотрите эту ссылку на странице кластеризации MST. Ваша точная форма появляется на четвертой странице PDF вместе со сравнением того, что происходит с K-Means.

Для существующего кода MATLAB вы можете попробовать эту реализацию Kernel K-Means . Также ознакомьтесь с Clustering Toolbox .

...