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

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

3a855e4e8dd144b8942da2463831a067?s=47 Anton
April 10, 2019

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

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

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

3a855e4e8dd144b8942da2463831a067?s=128

Anton

April 10, 2019
Tweet

Transcript

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

    агломеративная кластеризация, оптимальное число кластеров, области высокой плотности
  2. Источники • Python и машинное обучение, Себастьян Рашка

  3. Для начала # coding=utf-8 import matplotlib.pyplot as plt # симпатичная

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

    здесь 'y' сразу содержит ответы про принадлежность точек к кластерам, • мы это дальше не используем (нам нужно найти их самим), но здесь он нужен
  5. 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()
  6. None
  7. Как измерять подобие между объектами? • Евклидово расстояние между двумя

    точками 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
  8. Алгоритм k средних (k-means) • Хотим разбить датасет на k

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

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

    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
  11. sklearn.cluster.Kmeans scikit-learn.org/stable/modules/generated/ sklearn.cluster.KMeans.html 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)
  12. 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)
  13. 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()
  14. n_clusters=3

  15. n_clusters=2

  16. n_clusters=1

  17. n_clusters=4

  18. Алгоритм k-средних++ • k-средних: размещение исходных центроидов в случайных местах

    • (может дать плохие результаты или замедленную сходимость) • k-средних++ (k-means++): помещение исходных центроидов далеко друг от друга по специальному алгоритму • (дает лучший и более достоверный результат)
  19. k-means++ from sklearn.cluster import KMeans km = KMeans(n_clusters=3, init='k-means++', n_init=10,

    max_iter=300, random_state=0) y_km = km.fit_predict(X)
  20. Оптимальное количество кластеров • В случае с 2д и 3д

    кластеры можно различить на глаз • При большем количестве измерений доверять интуиции будет всё сложнее Метод локтя: • При росте количества кластеров SSE (внутрикластерная сумма квадратичных ошибкок, она же — искажение, инерция) будет уменьшаться (центроиды все ближе к точкам) • Нужно найти такое количество кластеров, при котором SSE перестает уменьшаться быстро
  21. График локтя 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()
  22. Нормальный вариант (локоть): n_clusters=3

  23. Жесткая кластеризация vs мягкая • Жесткая кластеризация: каждый образец в

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

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

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

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

    дендрограмму с привязкой к тепловой карте • Алгоритм k ближайших соседей
  28. sklearn.cluster.AgglomerativeClustering scikit-learn.org/stable/modules/generated/ sklearn.cluster.AgglomerativeClustering.html from sklearn.cluster import AgglomerativeClustering ac = AgglomerativeClustering(n_clusters=3,

    affinity='euclidean', linkage='complete') y_ac = ac.fit_predict(X)
  29. 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()
  30. n_clusters=3

  31. n_clusters=2

  32. n_clusters=1

  33. n_clusters=4

  34. Локализация областей высокой плотности (кластеризация данных произвольной формы)

  35. Сгенерируем два связных (плотных) кластера сложной формы # Кластеры-полумесяцы 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()
  36. None
  37. KMeans (n_clusters=2)

  38. AgglomerativeClustering (n_clusters=2)

  39. Алгоритм DBSCAN • Плотностная пространственная кластеризация приложений с присутствием шума

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

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

    каждой корневой точки отдельный кластер либо связную группу корневых точек • Назначить каждую граничную точку кластеру соответствующей корневой точки
  42. sklearn.cluster.DBSCAN • scikit-learn.org/stable/modules/generated/ sklearn.cluster.DBSCAN.html Критерии корневой точки (параметры плотности): •

    eps — радиус ε • min_samples — число окрестных точек (MinPts)
  43. sklearn.cluster.DBSCAN from sklearn.cluster import DBSCAN db = DBSCAN(eps=0.2, min_samples=5, metric='euclidean')

    y_db = db.fit_predict(X)
  44. 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()
  45. DBSCAN

  46. DBSCAN: eps=1.0 min_samples=5

  47. DBSCAN: eps=1.1 min_samples=5

  48. DBSCAN: eps=2.0 min_samples=5

  49. 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()
  50. None
  51. 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)
  52. 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()
  53. None
  54. None
  55. Самостоятельно • Оценка качества кластеризации (силуэтные графики) • Графовые алгоритмы

    кластеризации
  56. Применение • Извлечь неожиданную информацию из датасета (если кластеры окажутся

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

    и провести кластеризацию