Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2014-06-25

K-Means


После линейной регрессии была логистическая регрессия. А потом начались нейросети — Neural Networks. Потом нас учили правильно применять изученные алгоритмы (Advice for Applying Machine Learning). А потом нам рассказали про Support Vector Machines (SVMs) и Kernels.
А потом была неделя посвященная темам Clustering (K-Means) и Dimensionality Reduction (PCA). Тему снижения размерности мы отложим на потом. Сегодня поглядим на алгоритм кластеризации под названием K-Means.

Clustering (кластеризация) это класс проблем из раздела Unsupervised Learning, в отличие от рассмотренных ранее, относящихся к Supervised Learning. Принципиальная разница между этими двумя разделами заключается в том, что в проблемах Supervised Learning данные для обучения всегда содержат ответ (метку, label). Нет, так неясно. Давайте так: в тренировочном наборе данных для обучения распознаванию рукописных цифр всегда есть значение цифры изображенной на распознаваемой картинке. Если еще проще, то машина строит догадку – «это цифра 3», а супервайзер бьет ее по рукам линейкой и рявкает – «дура, это цифра 5», после чего машина корректирует коэффициенты в вычислениях, чтобы следующий раз угадать точнее.

А вот в проблемах Unsupervised Learning никаких готовых ответов нет. Есть только наборы данных и их надо как-то структурировать. Например разложить по кучкам согласно некоей общности характеристик (features). Эти кучки и будут кластеры, а процесс отнесения записей данных в тот или иной кластер — кластеризация.

Так как же делается кластеризация? Один из наиболее употребимых алгоритмов называется «K-Means Algorithm».

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

Теперь машина итеративно, до схождения (или ограничения по количеству циклов/времени) делает два шага:

1. Распределяет точки по кластерам (двум, в примере) по принципу близости к центроиду. Cluster Assignment Step.

2. Двигает центроиды кластеров (точки по плоскости) в центр/среднее положение в кластере (облаке точек). Move Centroid Step.


Всё, вот и весь алгоритм.

Cost Function при этом выглядит как сумма расстояний точек кластера до центроида. Соответственно, задача оптимизации — минимизировать Cost Function на обоих шагах.

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

Теперь вопрос — а как назначить оптимальное количество кластеров? Ответ очевиден — посчитать Cost Function для разного количества кластеров, построить график и заценить, где на графике происходит резкий (относительно) переход. Это будет метод локтя (Elbow Method).

А вообще-то, обычно количество кластеров назначают вручную, исходя из предполагаемого применения результата. Например разбиение размеров футболок по группам (S, M, L, XL) или (S, SM, M, L, XL, XXL) — что лучше для бизнеса продажи футболок — 4 размера для упрощения производства или 6 размеров для более точного подгона одежды по фигуре?

Что любопытно, в практическом задании мы применяли кластеризацию (K-Means) для сжатия картинок. Уменьшалась цветовая палитра (до 16 цветов) и, как итог, размер файла изображения. Приблизительно в шесть (6) раз.
Фактически, пиксели группировались в 16 кластеров в контексте похожести/близости цвета, после чего группам пикселов присваивался некий «средний» для группы цвет.

Получилось забавно.

 


original post http://vasnake.blogspot.com/2014/06/k-means.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (185) web-develop (170) gov.ru (156) video (123) бытовуха (111) sysadm (100) GIS (97) Zope(Plone) (88) Book (81) programming (81) бурчалки (80) грабли (77) development (73) Fun (72) windsurfing (72) Microsoft (64) hiload (62) opensource (58) internet provider (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) language (45) hardware (44) JS (41) curse (40) money (40) driving (39) DBMS (38) bigdata (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) tourism (18) Apache (16) Manager (15) web-browser (15) Никонов (15) happiness (14) music (14) todo (14) PHP (13) weapon (13) HTTP. Apache (12) SSH (12) course (12) frameworks (12) functional programming (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) crypto (11) game (11) map (11) scala (10) HTTPD (9) ODF (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) Photo (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) display (4) holywar (4) nginx (4) pistol (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) USA (3) mount (3) spark (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) font (2) ftp (2) holiday (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Palanga (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) krusader (1) license (1) mindmap (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)

Google+ Followers