Spec-Zone.ru › scikit-learn

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

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

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

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

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

hist_to_kde

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

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

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

2.8.2. Оценивание плотности с помощью ядер

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

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

kde_1d_distribution

Очевидно, что форма ядра влияет на гладкость полученного распределения. Оцениватель плотности с помощью ядер в 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)\]

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

За это сглаживание отвечает параметр bandwidth. Его можно задать вручную или использовать методы оценки Скотта и Сильвермана.

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

kde_kernels

Математические выражения для ядер

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

  • Гауссово ядро (kernel = 'gaussian')

    \(K(x; h) \propto \exp(- \frac{x^2}{2h^2} )\)

  • Прямоугольное ядро (kernel = 'tophat')

    \(K(x; h) \propto 1\) если \(x < h\)

  • Ядро Епанечникова (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\) если \(x < h\)

  • Косинусное ядро (kernel = 'cosine')

    \(K(x; h) \propto \cos(\frac{\pi x}{2h})\) если \(x < h\)

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

species_kde

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

digits_kde

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

Примеры

  • Простое одномерное оценивание плотности с помощью ядер: вычисление простых оценок плотности с помощью ядер в одном измерении.
  • Оценивание плотности с помощью ядер: пример применения оценивания плотности с помощью ядер для обучения генеративной модели набора рукописных цифр и получения новых выборок из этой модели.
  • Оценка плотности распределения видов с помощью ядер: пример оценивания плотности с помощью ядер и метрики расстояния по гаверсинусу для визуализации геопространственных данных

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/modules/density.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API