В этом уроке мы узнаем о «Python Scipy Gaussian_Kde», чтобы вы могли строить графики, интегрировать, выполнять повторную выборку и другие вещи с помощью гауссовского KDE.
- Что такое KDE?
- Пропускная способность
- Сингулярная матрица
- Метод Integr_kde()
- Метод logpdf()
- График
- Метод pdf()
- Метод resample()
Что такое KDE?
Оценка плотности ядра (KDE) — это метод, который в некотором смысле доводит идею Gaussian до ее логического завершения. KDE использует смесь с одним гауссовским компонентом на точку, создавая оценку плотности, которая принципиально непараметрична.
Ядро, определяющее форму распределения, размещенного в каждом месте, и полоса пропускания ядра, регулирующая размер ядра в каждой точке, являются свободными параметрами оценки плотности. На практике доступно множество ядер, которые мы можем использовать для оценки плотности ядра.
Gaussian_Kde — это использование гауссовских ядер для представления оценки плотности ядра. Функцию плотности вероятности (PDF) случайной величины можно оценить непараметрическим способом с использованием оценки плотности ядра. В Gaussian_Kde можно использовать как одномерные, так и многомерные данные.
Автоматический расчет пропускной способности является частью этого. Бимодальные или мультимодальные распределения часто бывают слишком гладкими, унимодальное распределение обеспечивает наилучшую оценку.
Python Scipy содержит класс gaussian_kde() в модуле scipy.stats для представления оценки плотности ядра относительно гауссовских ядер.
Синтаксис:
scipy.stats.gaussian_kde(dataset, bw_method=None, weights=None)
Где параметры:
- dataset (array_data): оценка точек на основе данных. Это одномерный массив при работе с одномерными данными, в противном случае — двумерный массив с формой.
- bw_method (string): этот подход используется для определения пропускной способности средства оценки. Это может быть вызываемая константа, скалярная константа, «Скотт» или «Сильвермен». Если это скаляр, он сразу же будет использоваться как kde.factor. Если это вызываемый объект, он должен принимать только гауссов экземпляр kde и возвращать скаляр. Скотт используется, если нет(по умолчанию).
- Weights (array_data): веса точек данных. Форма здесь должна соответствовать форме набора данных. Считается, что выборки имеют одинаковый вес, если значение «Нет»(по умолчанию).
Давайте рассмотрим пример, выполнив следующие шаги.
Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
import numpy as np from scipy.stats import gaussian_kde
Создайте случайные данные в двух измерениях, используя ручную функцию Measure_mdl.
def measure_mdl(s): m1_ = np.random.normal(size=s) m2_ = np.random.normal(scale=0.5, size=s) return m1_+m2_, m1_-m2_ m1_, m2_ = measure_mdl(2000) x_min = m1_.min() x_max = m1_.max() y_min = m2_.min() y_max = m2_.max()
Используя данные, оцените плотность ядра, используя приведенный ниже код.
X_, Y_ = np.mgrid[x_min:x_max:100j, y_min:y_max:100j] positions_ = np.vstack([X_.ravel(), Y_.ravel()]) values_ = np.vstack([m1_, m2_]) kernel_ = gaussian_kde(values_) Z_ = np.reshape(kernel_(positions_).T, X_.shape)
Постройте график приведенных выше данных, используя приведенный ниже код.
import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.imshow(np.rot90(Z_), cmap=plt.cm.gist_earth_r, extent=[x_min, x_max, y_min, y_max]) ax.plot(m1_, m2_, 'k.', markersize=2) ax.set_xlim([x_min, x_max]) ax.set_ylim([y_min, y_max]) plt.show()
Пропускная способность
При попытке просмотреть ваши дистрибутивы важно выбрать полосу пропускания. К сожалению, большинство людей просто вызывают обычную функцию для создания карты плотности, не учитывая пропускную способность.
В результате сюжет может неправильно отображать информацию, что может привести к ложным выводам. Давайте более подробно рассмотрим выбор полосы пропускания и определим, как сделать графики плотности более точными.
Как выбор полосы пропускания влияет на плавность графика:
- Недостаточное сглаживание происходит из-за узкой полосы пропускания. Это означает, что график плотности будет напоминать набор отдельных пиков.
- Чрезмерное сглаживание является результатом широкой полосы пропускания: оно означает, что любые характеристики неунимодального распределения будут скрыты, а график плотности будет представлять собой унимодальное распределение.
Недостаточное или чрезмерное сглаживание возникает в результате неправильного выбора полосы пропускания. Реальность в обеих ситуациях скрыта от нас. Эта проблема заставляет нас задаться вопросом: «Как я могу заранее определить хорошее значение пропускной способности?».
Нам нужен алгоритм, который выбирает идеальное значение полосы пропускания, избегая при этом как чрезмерного, так и недостаточного сглаживания. Название такого алгоритма — селектор полосы пропускания. Python Scipy принимает параметр bw_method для этого типа алгоритма со значениями, такими как Silverman и Scott.
Чтобы получить лучшую кривую сглаживания, мы могли бы использовать любой из методов или алгоритмов, описанных в приведенных выше публикациях, в соответствии с нашими потребностями, и эти два алгоритма очень известны для выбора полосы пропускания.
Сингулярная матрица
Матрица с нулевым определителем называется сингулярной. Кроме того, у такой матрицы отсутствует обратная. Здесь, в этом разделе, мы попытаемся вычислить гауссово KDE, используя сингулярную матрицу.
Импортируйте необходимые библиотеки или методы.
import numpy as np from scipy.stats import gaussian_kde
Создайте сингулярную матрицу.
sing_mat = np.array([[3.,6.],[2.,4.]])
Теперь вычислите гауссово значение KDE.
gaussian_kde(sing_mat)
В выводе отображается ошибка LinAlgError: сингулярная матрица, поэтому мы можем вычислить гауссову KDE, используя данные, которые по своей природе являются сингулярной матрицей.
Метод Integr_kde()
У gaussian_kde() есть метод Integr_kde() для вычисления интеграла произведения оценки плотности ядра на другую.
Синтаксис:
gaussian_kde.integrate_kde(other)
Где параметрother является экземпляром другого KDE, а метод возвращает скалярные значения.
Давайте рассмотрим пример, выполнив следующие шаги.
Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.
%matplotlib inline from scipy import stats import numpy as np import matplotlib.pyplot as pl
Сгенерируйте образец данных.
sample_data = [-19.41275116, -17.4594738, -17.4553103, -13.28406452, -10.77305, -10.48179997, -10.4761126, -9.7904519, -9.78305023, -9.44148, -7.85222277, -7.8498553, -5.10130727, 1.55761078, 1.87479, 1.88314794, 2.7612791]
Создайте экземпляр Gaussian KDE.
bw_ = 1. / np.std(sample_data) gkde = stats.gaussian_kde(dataset=sample_data, bw_method=bw_)
Теперь получите доступ к методу Integr_kde() и передайте указанный выше экземпляр kde gkde в качестве другого экземпляра методу для вычисления интеграла.
gkde.integrate_kde(gkde)
Из вывода видно, что интегральное значение оценки плотности ядра равно 0,0659. Вот как можно вычислить интеграл KDE с помощью метода Integr_kde() объекта Python Scipy gaussian_kde.
Метод logpdf()
Объект gaussain_kde имеет метод logpdf() для вычисления файла журнала в формате pdf с использованием предоставленных точек данных.
Давайте рассмотрим пример, используя тот же код, который мы использовали в подразделе «Python Scipy Gaussian_Kde».
Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
import numpy as np from scipy.stats import gaussian_kde
Создайте случайные данные в двух измерениях, используя ручную функцию Measure_mdl.
def measure_mdl(s): m1_ = np.random.normal(size=s) m2_ = np.random.normal(scale=0.5, size=s) return m1_+m2_, m1_-m2_ m1_, m2_ = measure_mdl(2000) x_min = m1_.min() x_max = m1_.max() y_min = m2_.min() y_max = m2_.max()
Используя данные, оцените плотность ядра, используя приведенный ниже код.
X_, Y_ = np.mgrid[x_min:x_max:100j, y_min:y_max:100j] positions_ = np.vstack([X_.ravel(), Y_.ravel()]) values_ = np.vstack([m1_, m2_]) kernel_ = gaussian_kde(values_)
Теперь вычислите PDF-файл журнала kernel_, предоставив данные в виде values_ методу logpdf(), используя приведенный ниже код.
print(kernel_.logpdf(values_))
График
Мы уже узнали о том, как вычислять гауссов KDE и его параметры, здесь, в этом разделе, мы вычислим и построим гауссовский KDE, используя образцы данных.
Импортируйте необходимые библиотеки или методы, используя приведенный ниже код Python.
%matplotlib inline from scipy import stats import numpy as np import matplotlib.pyplot as pl
Сгенерируйте образец данных, используя приведенный ниже код.
sample_data = [-19.41275116, -17.4594738, -17.4553103, -13.28406452, -10.77305, -10.48179997, -10.4761126, -9.7904519, -9.78305023, -9.44148, -7.85222277, -7.8498553, -5.10130727, 1.55761078, 1.87479, 1.88314794, 2.7612791]
Создайте экземпляр Gaussian KDE.
bw_ = 1. / np.std(sample_data) gkde = stats.gaussian_kde(dataset=sample_data, bw_method=bw_)
Теперь рассчитайте Gaussian KDE.
grid_size = 250 g_x_ = np.linspace(-25, 6, grid_size) gkde_val = gkde(g_x_)
Постройте Gaussian KDE, используя приведенный ниже код.
plt.plot(g_x_, gkde_val, label="Gaussian KDE Plot")
Метод pdf()
Объект gaussain_kde имеет метод pdf() для оценки прогнозируемого PDF-файла с использованием предоставленных точек данных.
Давайте рассмотрим пример, используя тот же код, который мы использовали в подразделе «Python Scipy Gaussian_Kde».
Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
import numpy as np from scipy.stats import gaussian_kde
Создайте случайные данные в двух измерениях, используя ручную функцию Measure_mdl.
def measure_mdl(s): m1_ = np.random.normal(size=s) m2_ = np.random.normal(scale=0.5, size=s) return m1_+m2_, m1_-m2_ m1_, m2_ = measure_mdl(2000) x_min = m1_.min() x_max = m1_.max() y_min = m2_.min() y_max = m2_.max()
Используя данные, оцените плотность ядра.
X_, Y_ = np.mgrid[x_min:x_max:100j, y_min:y_max:100j] positions_ = np.vstack([X_.ravel(), Y_.ravel()]) values_ = np.vstack([m1_, m2_]) kernel_ = gaussian_kde(values_)
Теперь вычислите PDF-файл kernel_, предоставив данные в виде values_ методу pdf(), используя приведенный ниже код.
print(kernel_.pdf(values_))
Метод resample()
Объект gaussian_kde имеет метод resample для случайного извлечения набора данных из рассчитанного PDF-файла.
Синтаксис:
gaussian_kde.resample(size=None, seed=None)
Где параметры:
- size (int): количество выборок, которые необходимо взять. Размер равен фактическому количеству выборок в базовом наборе данных, если размер не указан.
- seed (int, numpy.random.Generator): Numpy.random используется, если начальное число равно None (или np.random). Он использует синглтон RandomState. Используется новый экземпляр RandomState и заполняется начальным значением, если начальное значение является целым числом. Если генератор или экземпляр случайного состояния, содержащий начальное число, уже существует, он используется.
Метод resample() возвращает образец набора данных типа ndarray.
Здесь мы будем использовать пример примера, который мы сделали в приведенном выше подразделе «Python Scipy Gaussian_Kde».
Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
import numpy as np from scipy.stats import gaussian_kde
Создайте случайные данные в двух измерениях, используя ручную функцию Measure_mdl.
def measure_mdl(s): m1_ = np.random.normal(size=s) m2_ = np.random.normal(scale=0.5, size=s) return m1_+m2_, m1_-m2_ m1_, m2_ = measure_mdl(2000) x_min = m1_.min() x_max = m1_.max() y_min = m2_.min() y_max = m2_.max()
Используя данные, оцените плотность ядра и выполните повторную выборку данных.
X_, Y_ = np.mgrid[x_min:x_max:100j, y_min:y_max:100j] positions_ = np.vstack([X_.ravel(), Y_.ravel()]) values_ = np.vstack([m1_, m2_]) kernel_ = gaussian_kde(values_) print(kernel_.resample())
Таким образом, в этом уроке мы узнали о гауссовском KDE, рассчитали PDF-файл журнала, интегрировали KDE, нарисовали или повторно выполнили выборку значений данных KDE, а также построили график гауссовского KDE. Мы также рассмотрели темы, перечисленные ниже.