Как оценить гауссовские распределения за слоем шума? - PullRequest
0 голосов
/ 09 января 2019

Итак, у меня есть эта гистограмма моих 1-D данных, которая содержит некоторое время перехода в секундах. Данные содержат много шума, но за шумом лежат некоторые пики / гауссианы, которые описывают правильные значения времени. (См. Изображения)

Данные извлекаются из времени перехода людей, идущих между двумя точками с разными скоростями, взятых из нормального распределения скорости ходьбы (среднее значение 1,4 м / с). Иногда между двумя местами может быть несколько путей, которые могут создать несколько гауссиан.

Я хочу извлечь основных гауссиан, которые показаны над шумом. Однако, поскольку данные могут поступать из разных сценариев, но с произвольным числом (скажем, около 0-3) правильных путей / «гауссиан», я не могу по-настоящему использовать GMM (модель гауссовой смеси), потому что это потребует от меня знания количество гауссовых составляющих?.

Я предполагаю / знаю, что правильные распределения времени перехода являются гауссовыми, в то время как шум исходит из другого распределения (хи-квадрат?). Я совершенно новичок в этой теме, поэтому могу ошибаться.

Поскольку я заранее знаю истинное расстояние между двумя точками, я знаю, где должны располагаться средства.

На этом изображении изображены два правильных гауссиана со значениями 250 с и 640 с . (Дисперсия становится выше при более длительных временах)

enter image description here

Это изображение имеет один правильный гауссиан со средним значением 428 с . enter image description here

Вопрос: Есть ли какой-то хороший подход для извлечения гауссиан или, по крайней мере, для значительного уменьшения шума, получаемого с помощью чего-то подобного приведенным выше данным? Я не рассчитываю поймать гауссов, которые тонут в шуме.

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Я бы посоветовал взглянуть на оценку смеси Гаусса

https://scikit -learn.org / стабильный / модули / mixture.html # гмм

«Модель гауссовой смеси - это вероятностная модель, предполагающая, что все точки данных генерируются из смеси конечного числа гауссовых распределений с неизвестными параметрами.»

0 голосов
/ 11 января 2019

Вы можете сделать это, используя Оценка плотности ядра , как указано @Pasa. scipy.stats.gaussian_kde может сделать это легко. Синтаксис показан в приведенном ниже примере, который генерирует 3 гауссовых распределения, накладывает их и добавляет некоторый шум, затем использует gaussian_kde для оценки кривой Гаусса и затем строит все для демонстрации.

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats.kde import gaussian_kde

# Create three Gaussian curves and add some noise behind them
norm1 = np.random.normal(loc=10.0, size=5000, scale=1.1)
norm2 = np.random.normal(loc=5.0, size=3000)
norm3 = np.random.normal(loc=14.0, size=1000)
noise = np.random.rand(8000)*18
norm = np.concatenate((norm1, norm2, norm3, noise))

# The plotting is purely for demonstration
fig = plt.figure(dpi=300, figsize=(10,6))
plt.hist(norm, facecolor=(0, 0.4, 0.8), bins=200, rwidth=0.8, normed=True, alpha=0.3)
plt.xlim([0.0, 18.0])

# This is the relevant part, modifier modifies the estimation,
# lower values follow the data more closesly, higher more loosely
modifier= 0.03
kde = gaussian_kde(norm, modifier)

# Plots the KDE output for demonstration
kde_x = np.linspace(0, 18, 10000)
plt.plot(kde_x, kde(kde_x), 'k--', linewidth = 1.0)
plt.title("KDE example", fontsize=17)
plt.show()

Gaussian KDE example

Вы заметите, что оценка является самой сильной для наиболее выраженного гауссова пика с центром в 10.0, как и следовало ожидать. «Точность» оценки можно изменить, изменив переменную modifier (которая в примере изменяет пропускную способность ядра), передаваемую конструктору gaussian_kde. Более низкие значения дают более «четкую» оценку, а более высокие значения дают «более плавную» оценку. Также обратите внимание, что gaussian_kde возвращает нормализованные значения.

0 голосов
/ 09 января 2019

Я бы подошел к этому, используя Оценка плотности ядра . Я позволю вам оценить плотность вероятности непосредственно из данных, не слишком много предположений о базовом распределении. Изменяя пропускную способность ядра, вы можете контролировать степень сглаживания, которую, как я полагаю, можно настроить вручную путем визуального осмотра, пока не получите то, что соответствует вашим ожиданиям. Пример реализации KDE в python с использованием scikit-learn можно найти здесь .

Пример:

import numpy as np
from sklearn.neighbors import KernelDensity

# x is your original data
x = ...
# Adjust bandwidth to get the smoothness to your liking
bandwidth = ...

kde = KernelDensity(kernel='gaussian', bandwidth=bandwidth).fit(x)
support = np.linspace(min(x), max(x), 1000)
density = kde.score_samples(support)

После оценки отфильтрованного распределения вы можете проанализировать это и определить пики, используя что-то вроде this .

from scipy.signal import find_peaks

# You can tweak with the other arguments of the 'find_peaks' function
# in order to fine-tune the extracted peaks according to your PDF
peaks = find_peaks(density)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...