Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何估计噪声层后面的高斯分布?_Python_Matplotlib_Statistics_Signal Processing_Distribution - Fatal编程技术网

Python 如何估计噪声层后面的高斯分布?

Python 如何估计噪声层后面的高斯分布?,python,matplotlib,statistics,signal-processing,distribution,Python,Matplotlib,Statistics,Signal Processing,Distribution,所以我有这个一维数据的柱状图,它包含一些以秒为单位的过渡时间。数据包含大量噪声,但噪声后面有一些峰值/高斯,它们描述了正确的时间值。(见图片) 该数据是根据正常步行速度分布(平均速度为1.4m/s)中不同速度的两个地点之间步行的过渡时间获取的。有时,两个位置之间可能存在多条路径,这可能会产生多个高斯 我想提取噪声上方显示的基本高斯。然而,由于数据可能来自不同的场景,但具有任意数量(比如说0-3)的正确路径/高斯分布,我不能真正使用GMM(高斯混合模型),因为这需要我知道高斯成分的数量 我假设/知

所以我有这个一维数据的柱状图,它包含一些以秒为单位的过渡时间。数据包含大量噪声,但噪声后面有一些峰值/高斯,它们描述了正确的时间值。(见图片)

该数据是根据正常步行速度分布(平均速度为1.4m/s)中不同速度的两个地点之间步行的过渡时间获取的。有时,两个位置之间可能存在多条路径,这可能会产生多个高斯

我想提取噪声上方显示的基本高斯。然而,由于数据可能来自不同的场景,但具有任意数量(比如说0-3)的正确路径/高斯分布,我不能真正使用GMM(高斯混合模型),因为这需要我知道高斯成分的数量

我假设/知道正确的过渡时间分布是高斯分布,而噪声来自其他分布(卡方?)。我对这个话题很陌生,所以我可能完全错了

因为我事先知道两点之间的地面真值距离,所以我知道方法应该位于何处

这张图像有两个正确的高斯,平均值为250秒和640秒。(时间越长,差异越大)

此图像有一个正确的高斯分布,平均值为428s。

问题:
有没有一些好的方法来检索高斯分布,或者至少在给定类似上述数据的情况下显著降低噪声?我不希望捕捉淹没在噪声中的高斯噪声。

我将使用。我允许您直接从数据估计概率密度,而无需对基础分布进行太多假设。通过更改内核带宽,您可以控制应用的平滑程度,我假设可以通过目视检查手动调整平滑程度,直到获得满足您期望的内容。可以找到一个使用
scikitlearn
在python中实现KDE的示例

例如:

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)
一旦估计了过滤后的分布,您就可以分析该分布并使用类似的方法识别峰值


免责声明:这或多或少是一个高层次的回答,因为你的问题也是高层次的。我假设您知道自己在代码方面做什么,并且只是在寻找想法。但是,如果您需要任何特定的帮助,请向我们展示一些代码和您迄今为止尝试过的内容,以便我们能够更具体。

我建议您看看高斯混合估计

“高斯混合模型是一种概率模型,它假设所有数据点都是由具有未知参数的有限个高斯分布的混合生成的。”

您可以使用@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()


您将注意到,正如您所期望的,对于以
10.0
为中心的最明显的高斯峰值,估计值最强。可以通过更改传递给
gaussian_kde
构造函数的
modifier
变量(该变量在示例中修改内核带宽)来修改估计的“锐度”。较低的值将产生“更清晰”的估计,较高的值将产生“更平滑”的估计。还要注意,
gaussian_kde
返回标准化值

几点意见。(1) 从问题的描述和可用的数据来看,高斯分量看起来并不匹配。我想你需要的东西是歪斜的,可能两端都被截断了。(2) 我敢肯定,人们已经研究过混合模型,在混合模型中,组分的数量与每个组分的参数一起被推断出来。我认为网络搜索应该能找到一些相关的资源。我以前看过GMM并做过实验,但这需要我知道我使用了多少高斯分量。在我的情况下,可能会有所不同。它也不能很好地处理噪声,因为它不是真正的高斯(我认为)。你们知道有并没有办法克服这个问题吗?很好的答案,代码示例作为补充!然而,我对如何从生成的pdf(?)中检索峰值非常感兴趣。有什么特别的方法吗?太好了!但我不确定如何从pdf函数中检索峰值。我已经用一个代码示例更新了这个问题,你能建议一种方法吗?不需要从生成的PDF中重新采样数据。您所需要做的就是找到PDF本身的峰值。为此,可以使用
scipy.signal.find_peaks
功能。我会更新我的答案,让它更清楚。
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()