2.8. Оценка плотности

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

Оценка плотности — очень простая концепция, и большинство людей уже знакомы с одним распространенным методом оценки плотности: гистограммой.

2.8.1. Оценка плотности: гистограммы

Гистограмма — это простая визуализация данных, в которой определены ячейки и подсчитано количество точек данных в каждой ячейке. Пример гистограммы можно увидеть в верхнем левом углу следующего рисунка:

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

Интуитивно можно представить себе гистограмму как стек блоков, по одному блоку на точку. Укладывая блоки в соответствующее пространство сетки, мы восстанавливаем гистограмму. Но что, если вместо того, чтобы складывать блоки в регулярную сетку, мы центрируем каждый блок в той точке, которую он представляет, и суммируем общую высоту в каждом месте? Эта идея приводит к нижней левой визуализации. Возможно, это не так чисто, как гистограмма, но тот факт, что данные определяют расположение блоков, означает, что это гораздо лучшее представление базовых данных.

Эта визуализация является примером оценки плотности ядра , в данном случае с ядром в форме цилиндра (т. Е. Квадратным блоком в каждой точке). Мы можем восстановить более плавное распределение, используя более гладкое ядро. На нижнем правом графике показана оценка плотности ядра Гаусса, в которой каждая точка вносит свой вклад в общую кривую Гаусса. В результате получается гладкая оценка плотности, которая выводится из данных и функционирует как мощная непараметрическая модель распределения точек.

2.8.2. Оценка плотности ядра

Оценка плотности ядра в scikit-learn реализована в оценщике KernelDensity, который использует Ball Tree или KD Tree для эффективных запросов ( их обсуждение см. В разделе «Ближайшие соседи» ). Хотя в приведенном выше примере для простоты используется одномерный набор данных, оценка плотности ядра может выполняться в любом количестве измерений, хотя на практике проклятие размерности приводит к ухудшению его производительности в больших измерениях.

На следующем рисунке 100 точек взяты из бимодального распределения, и оценки плотности ядра показаны для трех вариантов ядер:

Понятно, как форма ядра влияет на гладкость полученного распределения. Оценщик плотности ядра scikit-learn можно использовать следующим образом:

>>> from sklearn.neighbors import KernelDensity
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> kde = KernelDensity(kernel='gaussian', bandwidth=0.2).fit(X)
>>> kde.score_samples(X)
array([-0.41075698, -0.41075698, -0.41076071, -0.41075698, -0.41075698,
       -0.41076071])

Здесь мы использовали kernel='gaussian', как показано выше. Математически ядро ​​- это положительная функция $K(x;h)$ который контролируется параметром полосы пропускания $h$. Учитывая эту форму ядра, оценка плотности в точкеy в группе точек $x_i; i=1\cdots N$ дан кем-то:
$$\rho_K(y) = \sum_{i=1}^{N} K(y — x_i; h)$$

Полоса пропускания здесь действует как параметр сглаживания, управляя компромиссом между смещением и дисперсией в результате. Большая полоса пропускания приводит к очень плавному (т.е. с большим смещением) распределению плотности. Малая полоса пропускания приводит к негладкому (т.е. с высокой дисперсией) распределению плотности.

KernelDensity реализует несколько распространенных форм ядра, которые показаны на следующем рисунке:

Форма этих ядер следующая:

  • Гауссово ядро ​​(kernel = 'gaussian') $K(x; h) \propto \exp(- \frac{x^2}{2h^2})$
  • Ядро Tophat (kernel = 'tophat') $K(x; h) \propto 1$
  • Ядро Епанечникова (kernel = 'epanechnikov') $K(x; h) \propto 1 — \frac{x^2}{h^2}$
  • Экспоненциальное ядро ​​(kernel = 'exponential') $K(x; h) \propto \exp(-x/h)$
  • Линейное ядро ​​(kernel = 'linear') $K(x; h) \propto 1 — x/h$
  • Ядро косинуса (kernel = 'cosine') $K(x; h) \propto \cos(\frac{\pi x}{2h})$ если $x < h$

Оценщик плотности ядра может использоваться с любой из допустимых метрик расстояния (см. DistanceMetric список доступных метрик), хотя результаты должным образом нормализованы только для евклидовой метрики. Одна особенно полезная метрика — расстояние Хаверсина, которое измеряет угловое расстояние между точками на сфере. Вот пример использования оценки плотности ядра для визуализации геопространственных данных, в данном случае распределения наблюдений за двумя разными видами на южноамериканском континенте:

Еще одно полезное применение оценки плотности ядра — изучение непараметрической генеративной модели набора данных с целью эффективного извлечения новых выборок из этой генеративной модели. Вот пример использования этого процесса для создания нового набора рукописных цифр с использованием гауссова ядра, изученного на проекции данных PCA:

«Новые» данные состоят из линейных комбинаций входных данных с вероятностными весами с учетом модели KDE.

Примеры