2013-11-13 2 views
12

Я искал scipy и sklearn для алгоритмов кластеризации для конкретной проблемы, которую у меня есть. Мне нужно каким-то образом характеризовать популяцию N частиц в k группах, где k не обязательно известно, и в дополнение к этому не известны априорные длины связывания (аналогично этому question).Алгоритмы кластеризации Python

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

Вот пример того, что dbscan найти: dbscanfail

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

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

ответ

7

Я нашел тот, который не требует априорной информации/догадок и очень хорошо подходит к тому, что я прошу. Он называется Mean Shift и находится в SciKit-Learn. Это также относительно быстро (по сравнению с другими алгоритмами, такими как Affinity Propagation).

Вот пример того, что он дает:

MeanShiftResults

Я также хочу отметить, что в документации говорится, что он не может хорошо масштабируется.

+1

В зависимости от ядра Mean Shift вы можете немного ускорить его. Вот достойный пост, описывающий некоторые оптимизации, которые вы можете использовать, чтобы сделать средний сдвиг более масштабируемым. http://sociograph.blogspot.com/2011/11/accessible-introduction-to-mean-shift.html – mattnedrich

+0

Спасибо за информацию - я проверю это. – astromax

+1

MeanShift требует «пропускной способности» в качестве входного сигнала, не звучит как «NO a priori» для меня? –

1

Вы можете попробовать минимальное остовное дерево (алгоритм zahn), а затем удалить самый длинный край, похожий на альфа-формы. Я использовал его с триангуляцией delaunay и вогнутым корпусом: http://www.phpdevpad.de/geofence. Вы также можете попробовать иерархический кластер, например, clusterfck.

+0

Имеются ли какие-либо варианты реализации? – astromax

+0

clusterfck - библиотека js с k-средством и иерархическим кластером. Он вычисляет ближайшего соседа. – Bytemain

+0

Это библиотека javascript? Я не уверен, что смогу использовать это вообще. – astromax

1

Ваш участок указывает, что вы выбрали параметр minPtsспособ слишком маленький.

Посмотрите на ОПТИКУ, которая больше не нуждается в параметре epsilon DBSCAN.

+0

Да, для этой картины то, что вы говорите, верно - я играл с минимальными точками и эпсилон, но безрезультатно. Я проверю ОПТИКУ. У вас есть ссылка? – astromax

+0

Это в Википедии, и включен в ELKI. –

+0

Спасибо - я действительно надеялся на функцию/библиотеку python вместо Java. – astromax

2
  • При использовании DBSCAN может быть полезно для масштабирования/нормализации данных или расстояния заранее, так что оценка эпсилон будет относительным.

  • Существует реализация в DBSCAN - Я думаю, что его один Anony-мусс где обозначается как «плавающий вокруг» -, который приходит с функцией эпсилон оценивани. Он работает, пока его не подают с большими наборами данных.

  • Есть несколько incomplete versions ОПТИКИ в github.Возможно, вы можете найти его, чтобы адаптировать его для своей цели. Еще пытается выяснить, какой эффект minPts имеет, используя один и тот же метод извлечения. enter image description here

Смежные вопросы