Spec-Zone.ru › scikit-learn

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

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

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

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

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

hist_to_kde

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

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

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

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

Оценка плотности ядра в scikit-learn реализована в оценщике KernelDensity, который использует дерево шаров или 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

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

digits_kde

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

Примеры

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

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

Spec-Zone.ru

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