Алгоритм кластеризации

275
11 июня 2017, 18:38

Входные данные: это набор объектов, природа появления которых - есть суть процесса выделения контура конкретного тела на изображении. На промежуточном шаге мы имеем прямоугольник, который описывает этот контур - здесь как-раз рассчитываются величины, которые являются параметрами объектов, подлежащих кластеризации, а именно:
- h, высота прямоугольника;
- (x,y), центр масс (коррдинаты);
- σ, среднеквадратичное отклонение, как мера, показывающая "как далеко" отдельно взятая точка может находится от центра масс, находясь при этом в пределах текущего контура.

Что сделано: разбил точки на кластеры следующим образом: берем первую точку p(i), запоминаем соответствующее ей значение σ(i), смотрим следующую точку p(i+1) - если выполянется условие abs( p(i) - p(i+1) ) <= σ(i) - то считаем, что эти точки можем объеденить в один кластер, иначе - делаем вывод, что появилась точка из другого кластера и т.д.

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

 double h_mean = 0.0f;
 for( std::size_t i = 0; i < _cluster.size(); ++i )
     h_mean += _cluster[i].height();
 h_mean /= _cluster.size();

Мне кажется, я делаю неправильно/не совсем верно - подскажите, пожалуйста, как сделать правильно/усовершенствовать этот алгоритм.

(В тегах C++ - потому как пишу на плюсах, прошу не ругаться)

READ ALSO
Создание COM DLL, регистрация с помощью regsvr32

Создание COM DLL, регистрация с помощью regsvr32

Нужен пример создания dll на языке C++, которая бы регистриролась бы с помощью regsvr32, и её можно было бы подключить к проекту на VB5

201
сортировка большого файла

сортировка большого файла

задача: удалить дубли (строки) из текстового файла (1 - 4GB), OS: Windows 7 x64, ОЗУ: 8GB, Perl (v524

323