gpt4 book ai didi

python - Scikit Learn KDE 方差增加一

转载 作者:行者123 更新时间:2023-11-28 16:57:34 24 4
gpt4 key购买 nike

我正在尝试使用 sklearn 的 kde 拟合一些正常数据的核密度估计。这是一个例子:

import numpy as np
from sklearn.neighbors.kde import KernelDensity as kde

x = np.random.normal(scale = 2, size = [10000, 1])
np.var(x) # 4.0
test_kde = kde()
test_kde.fit(x)

np.var(test_kde.sample(10000)) # 5.0

方差增加一。我在这里做的事情非常愚蠢吗?

最佳答案

问题是您没有指定正确的带宽 来缩放各个密度函数,这就是您过度平滑估计的密度函数的原因。由于您的示例数据服从正态分布,因此带宽为

>>> h = ((4 * np.std(x)**5) / (3 * len(x)))**(1/5)
>>> h
0.33549590926904804

将是最佳选择。可以找到解释on Wikipedia .

>>> test_kde = kde(bandwidth=h)
>>> test_kde.fit(x)
>>> samples = test_kde.sample(10000)
>>> np.var(samples)
4.068727474888099 # close enough to 4

但为什么我需要这样的缩放?

核密度估计通过使用核函数(通常是正态分布的密度函数)来估计数据分布的密度。一般的想法是,通过对样本参数化的许多密度函数求和,最终会在给定足够样本的情况下逼近原始密度函数:

我们可以为您的数据可视化:

from matplotlib.colors import TABLEAU_COLORS

def gauss_kernel(x, m=0, s=1):
return (1/np.sqrt(2 * np.pi * s**2) * np.e**(-((x - m)**2 / (2*s**2))))

from matplotlib.colors import TABLEAU_COLORS

x_plot = np.linspace(-2, 2, 10)
h = 1

for xi, color in zip(x_plot, TABLEAU_COLORS.values()):
plt.plot(xi, gauss_kernel(xi, m=0, s=2) * 0.001, 'x', color=color)
plt.plot(x, 1 / (len(x) * h) * gauss_kernel((xi - x) / h), 'o', color=color)
plt.plot(xi, (1 / (len(x) * h) * gauss_kernel((xi - x) / h)).sum() * 0.001, 'o', color=color)

true density function, kernels and sum of kernels with h=1

此图显示了 [-2; 中某些点的估计密度和真实密度; 2] 以及每个点的核函数(相同颜色的曲线)。估计的密度只是相应核函数的总和。

可以看到,单个核函数越靠右/靠左,它们的总和越低(因此密度也越低)。要解释这一点,您必须记住我们的原始数据点以 0 为中心,因为它们是从均值为 0 和方差为 2 的正态分布中采样的。因此,离中心越远,> 0 的数据点就越少。因此,这意味着将这些点作为输入的高斯核函数最终会将所有数据点都放在其平坦的尾部之一中,并将它们的权重非常接近于零,这就是为什么该核函数的总和在那里会非常小.也可以说我们正在使用高斯密度函数对数据点进行加窗。

通过设置h=2可以清楚的看到bandwidth参数的影响:

h = 2

for xi, color in zip(x_plot, TABLEAU_COLORS.values()):
plt.plot(xi, gauss_kernel(xi, m=0, s=2) * 0.001, 'x', color=color)
plt.plot(x, 1 / (len(x) * h) * gauss_kernel((xi - x) / h), 'o', color=color)
plt.plot(xi, (1 / (len(x) * h) * gauss_kernel((xi - x) / h)).sum() * 0.001, 'o', color=color)

true density function, kernels and sum of kernels with h=2

各个核函数更加平滑,因此,估计的密度也平滑了很多。这样做的原因在于平滑运算符。内核被称为

1/h K((x - xi)/h)

在高斯核的情况下,这意味着计算均值为 xi 和方差为 h 的正态分布的密度。因此:h越高,每个密度估计越平滑!

在 sklearn 的情况下,可以通过测量密度估计的质量来估计最佳带宽,例如使用网格搜索。 This example告诉你如何。如果您选择了一个好的带宽,您可以很好地估计密度函数:

density function estimates with different bandwidth values

关于python - Scikit Learn KDE 方差增加一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56967554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com