Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Большие данные - лекция-9 - обучение без учителя, кластеризация

Anton
April 10, 2019

Большие данные - лекция-9 - обучение без учителя, кластеризация

Обучение без учителя (работа с немаркированными данными), кластеризация: k средних, агломеративная кластеризация, оптимальное число кластеров, области высокой плотности

Обновлено: 16.04.2020
https://vk.com/video53223390_456239448

Anton

April 10, 2019
Tweet

More Decks by Anton

Other Decks in Education

Transcript

  1. Обучение без учителя (работа с немаркированными данными), кластеризация: k средних,

    агломеративная кластеризация, оптимальное число кластеров, области высокой плотности
  2. Для начала # coding=utf-8 import matplotlib.pyplot as plt # симпатичная

    сетка на белом фоне # (без нее русские подписи -> кракозябры в python 2.7) import seaborn as sns sns.set(style='whitegrid')
  3. make_blobs: сгенерировать 3 сферических кластера точек • scikit-learn.org/stable/modules/generated/ sklearn.datasets.make_blobs.html •

    здесь 'y' сразу содержит ответы про принадлежность точек к кластерам, • мы это дальше не используем (нам нужно найти их самим), но здесь он нужен
  4. make_blobs: сгенерировать 3 сферических кластера точек # Сферические кластеры from

    sklearn.datasets import make_blobs X, y = make_blobs(n_samples = 150, n_features=2, centers=3, cluster_std=0.5, shuffle=True, random_state=0) plt.scatter(X[:, 0], X[:, 1], c='orange', marker='o', s=100) #plt.grid() # прячет сетку с sns.set(style='whitegrid') plt.show()
  5. Как измерять подобие между объектами? • Евклидово расстояние между двумя

    точками x и y в m-мерном пространстве: • Квадратичное евклидово расстояние: d(x , y)=√ ∑ j=1 m (x j − y j )2=‖x− y‖ d(x , y)2 =∑ j=1 m (x j − y j )2 =‖x−y‖2
  6. Алгоритм k средних (k-means) • Хотим разбить датасет на k

    групп (кластеров) • Количество кластеров k задаем сами заранее
  7. Алгоритм k средних (k-means) • 1) Случайно выбрать k центроидов

    μ(l) (l = 1...k) [мю эль- тое] из точек образцов • 2) Назначить каждый образец x(i) (i=1...n) самому ближайшему к нему центроиду μ(l) • 3) Переместить каждый центроид в центр образцов, который ему назначили • 4) Повторить шаги 2 и 3, пока назначения кластеров не перестанут меняться, либо не будет достигнут заданный максимальный допуск (внутренний параметр алгоритма поиска центра) или максимальное число итераций
  8. Поиск новых положений центроидов • Внутрикластерная сумма квадратичных ошибок —

    SSE (sum of squared errors): • μ(l) — представительная точка (центроид) для кластера (группы) l [эль] • x(i) — i-я точка выборки • Поиск центроида — задача оптимизации, итеративная минимизация внутрикластерной суммы квадратичных ошибок SSE (градиентный спуск? - минимизация по параметрам — координатам μ j каждого центроида) • Здесь берется сумма всех ошибок по всем кластерам, поэтому параметров всего: m*k SSE=∑ i=1 n ∑ l=1 k w(i ,l)‖x(i)−μ(l)‖2 w(i,l)= {1, x(i)∈кластеруl 0, x(i)∉кластеруl
  9. sklearn.cluster.KMeans [1 0 0 0 1 0 0 1 2

    0 1 2 2 0 0 2 2 1 2 1 0 1 0 0 2 1 1 0 2 1 … 0 1 0 0 1 1 2 1 2 2 2 2 1 2 2 2 0 2 1 2 0 0 1 1 2 2 2 2 1 1] [False True True True False True True False False ... True False False False False False False False False] [ True False False False True False False True False ... False True True False False False False True True] print(y_km) print(y_km == 0) print(y_km == 1)
  10. sklearn.cluster.KMeans plt.scatter(X[y_km == 0, 0], X[y_km == 0, 1], s=100,

    c='lightgreen', marker='s', label=u'кластер 1') plt.scatter(X[y_km == 1, 0], X[y_km == 1, 1], s=100, c='orange', marker='o', label=u'кластер 2') plt.scatter(X[y_km == 2, 0], X[y_km == 2, 1], s=100, c='lightblue', marker='v', label=u'кластер 3') plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], s=250, c='red', marker='*', label=u'центроиды') plt.legend() #plt.grid() # прячет сетку с sns.set(style='whitegrid') plt.show()
  11. Алгоритм k-средних++ • k-средних: размещение исходных центроидов в случайных местах

    • (может дать плохие результаты или замедленную сходимость) • k-средних++ (k-means++): помещение исходных центроидов далеко друг от друга по специальному алгоритму • (дает лучший и более достоверный результат)
  12. Оптимальное количество кластеров • В случае с 2д и 3д

    кластеры можно различить на глаз • При большем количестве измерений доверять интуиции будет всё сложнее Метод локтя: • При росте количества кластеров SSE (внутрикластерная сумма квадратичных ошибкок, она же — искажение, инерция) будет уменьшаться (центроиды все ближе к точкам) • Нужно найти такое количество кластеров, при котором SSE перестает уменьшаться быстро
  13. График локтя from sklearn.cluster import KMeans distorts = [] #

    внутрикластерные искажения (инерции) (SSE) for i in range(1, 11): km = KMeans(n_clusters=i, init='k-means++', n_init=10, max_iter=300, random_state=0) km.fit(X) distorts.append(km.inertia_) plt.plot(range(1, 11), distorts, marker='o') plt.xlabel(u'Число кластеров') plt.ylabel(u'Искажение') plt.show()
  14. Жесткая кластеризация vs мягкая • Жесткая кластеризация: каждый образец в

    наборе принадлежит строго одному кластеру • Мягкая (нечеткая, fuzzy) кластеризация: образец принадлежит одному или более кластеров • Популярный алгоритм нечеткой кластеризации: алгоритм нечетких C-средних
  15. Организация кластеров в виде иерархического дерева • Позволяет строить дендрограммы

    (древовидные визуализации), которые помогают интерпретировать результаты (наблюдать логику алгоритма по шагам) • Не нужно предварительно указывать число кластеров • Два подхода: агломеративный (объедининяющий) и дивизивный (разделяющий)
  16. Дивизивная (разделяющая) кластеризация • Начинаем с единственного кластера (все образцы)

    • Итеративно расщепляем кластер на меньшие кластеры до тех пор, пока каждый кластер не будет содержать один образец • Критерий разделения на каждом этапе: TODO
  17. Агломеративная (объединяющая) кластеризация • Начинаем с каждого образца как отдельного

    кластера • Объединяем близлежащие кластеры, пока не останется один кластер • Два стандартных алгоритма: метод одиночной связи (single linkage) и метод полной связи (complete linkage, он же метод дальнего соседа)
  18. TODO • Подробное описание алгоритма • Построить дендрограмму • Построить

    дендрограмму с привязкой к тепловой карте • Алгоритм k ближайших соседей
  19. sklearn.cluster.AgglomerativeClustering plt.scatter(X[y_ac == 0, 0], X[y_ac == 0, 1], s=100,

    c='lightgreen', marker='o', label=u'кластер 1') plt.scatter(X[y_ac == 1, 0], X[y_ac == 1, 1], s=100, c='orange', marker='s', label=u'кластер 2') plt.scatter(X[y_ac == 2, 0], X[y_ac == 2, 1], s=100, c='lightblue', marker='v', label=u'кластер 3') plt.legend() plt.show()
  20. Сгенерируем два связных (плотных) кластера сложной формы # Кластеры-полумесяцы from

    sklearn.datasets import make_moons X, y = make_moons(n_samples=200, noise=0.05, random_state=0) plt.scatter(X[:, 0], X[:, 1], c='orange', marker='o', s=100) #plt.grid() # прячет сетку с sns.set(style='whitegrid') plt.show()
  21. Алгоритм DBSCAN • Плотностная пространственная кластеризация приложений с присутствием шума

    (density-based sparial clustering of applications with noise, DBSCAN) • Понятие плотности определяется как число точек внутри указанного радиуса ε (окрестность — [эпсилон]) • Не делает допущений о сферичной форме кластеров • Не требует указывать количество кластеров • Способен удалять шумовые точки • Требует ручной подбор параметров плотности • Плохо работает с кластерами разной плотности
  22. Алгоритм DBSCAN: метки для точек • Точка рассматривается как корневая,

    если, по меньшей мере, указанное число окрестных точек (MinPts) попадает в пределы указанного радиуса ε • Граничная точка — точка в пределах радиуса ε корневой точки, имеющая соседей меньше, чем MinPts • Шумовые точки — все остальные точки • Корневые точки являются связными, если они расположены не дальше, чем радиус ε
  23. Алгоритм DBSCAN • Назначить метки всем точкам • Сформировать для

    каждой корневой точки отдельный кластер либо связную группу корневых точек • Назначить каждую граничную точку кластеру соответствующей корневой точки
  24. sklearn.cluster.DBSCAN plt.scatter(X[y_db == 0, 0], X[y_db == 0, 1], s=100,

    c='lightblue', marker='o', label=u'кластер 1') plt.scatter(X[y_db == 1, 0], X[y_db == 1, 1], s=100, c='red', marker='s', label=u'кластер 2') plt.legend() plt.show()
  25. 3 сферических кластера в 3д: n_features=3 # Сферические кластеры 3д

    from sklearn.datasets import make_blobs X, y = make_blobs(n_samples = 150, n_features=3, centers=3, cluster_std=0.5, shuffle=True, random_state=0) from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(X[:, 0], X[:, 1], X[:, 2], c='orange', marker='o', s=100) plt.show()
  26. sklearn.cluster.KMeans: 3Д (по сравнению с 2д без изменений) from sklearn.cluster

    import KMeans km = KMeans(n_clusters=3, init='random', n_init=10, max_iter=300, tol=1e-04, random_state=0) y_km = km.fit_predict(X)
  27. sklearn.cluster.KMeans: 3Д from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax

    = fig.add_subplot(111, projection='3d') ax.scatter(X[y_km == 0, 0], X[y_km == 0, 1], X[y_km == 0, 2], s=100, c='lightgreen', marker='s', label=u'кластер 1') ax.scatter(X[y_km == 1, 0], X[y_km == 1, 1], X[y_km == 1, 2], s=100, c='orange', marker='o', label=u'кластер 2') ax.scatter(X[y_km == 2, 0], X[y_km == 2, 1], X[y_km == 2, 2], s=100, c='lightblue', marker='v', label=u'кластер 3') ax.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], km.cluster_centers_[:, 2], s=350, c='red', marker='*', label=u'центроиды') plt.legend() plt.show()
  28. Применение • Извлечь неожиданную информацию из датасета (если кластеры окажутся

    достаточно плотными) • Кластеризация абонентов — автоматическое формирование целевой группы • Группировки пользователей в социальной сети • Распознавание образов?