非参数估计——Parzen窗与k近邻估计

       在做分类问题时,有时候需要使用样本的概率密度函数来求其后验概率。但是很多情况下并不知道其概率密度函数的形式(即样本的分布未知),此时就需要对样本进行非参数估计,来求解其概率密度函数。

       求解未知分布样本的概率密度函数的一种方法是:\(n\)个样本点中,在某点周围取一个区间\(R_{n}\),计算区间\(R_{n}\)的体积\(V_{n}\)以及落在\(R_{n}\)中的样本的个数\(k_{n}\),然后就可以求出该点处的概率密度:

\[p(\boldsymbol{x})=\frac{(k_{n}/n)}{V_{n}}\quad \quad \quad(1)\]

       Parzen窗方法就是一种非参数估计的方法,它的主要思想是选取一个窗函数\(\varphi(\boldsymbol{u})\),通过该窗函数来统计落在所取区间中的样本个数\(k_{n}\),然后通过公式(1)得到某个点的概率密度。一种窗函数\(\varphi(\boldsymbol{u})\)定义如下:

\[\varphi(\boldsymbol{u})= \begin{cases} \\ 1 \qquad |u_{j}| \leq 0.5; \qquad j = 1,...,d \\\\\\\\ \\ 0 \qquad 其它 \end{cases}\]

其中\(d\)表示空间的维度。若取区间\(R_{n}\)为一个超立方体,它的边长为\(h_{n}\),则可以通过如下表达式计算\(k_{n}\)

\[k_{n} = \sum _{i=1} ^{n}\varphi(\frac {\boldsymbol{x}- \boldsymbol{x_{i}}}{h_{n}})\]

因此样本中某点\(\boldsymbol{x}\)处的概率密度为:

\[p(\boldsymbol{x}) = \frac{1}{n} \sum _{i=1} ^{n} \frac{1}{h^d _{n}} \varphi(\frac {\boldsymbol{x}- \boldsymbol{x_{i}}}{h_{n}})\]

       Parzen窗方法的代码实现如下,其中参数\(Data\)为样本总体,\(X\)为需要求概率密度的点坐标,\(h\)为参数,\(d\)为样本空间的维度,\(f\)为窗函数\(\varphi(\boldsymbol{u})\)

def Parzen(Data, X, h, d, f) :
    Prob = []
    n = len(Data)
    for x in X :
        p = 0.0
        for s in Data :
            p += f((s-x)/h)
        Prob.append(p / (n * (h**d)))
    return np.array(Prob) 

如下代码是上述\(\varphi(\boldsymbol{u})\)函数的实现,即判断当前样本点是否落在了所取的超立方体空间中:

def cube(u) :
    T = abs(u)
    if all(t <= 0.5 for t in T) :
        return 1
    else :
        return 0

       窗函数\(\varphi(\boldsymbol{u})\)的形式可以有很多方式,但必须满足如下的性质,以此保证最终求解的概率密度函数是合理的。

\[\varphi(\boldsymbol{u}) \geq 0 \quad 以及 \quad \int \varphi(\boldsymbol{u})d\boldsymbol{u} = 1\]

例如当样本空间为一维时,我们可以也定义窗函数是一个高斯函数:

\[\varphi(\boldsymbol{u})= \frac{1}{\sqrt{2 \pi}} e^{-u^{2}/2}\]

       Parzen窗方法是给定区间的范围\(h_{n}\),求落在区间的样本点个数\(k_{n}\),以此估计概率密度。除了Parzen窗方法外,k近邻估计也可以实现对概率密度函数的估计,与Parzen窗方法不同的是,k近邻估计是先给定要取的样本点的个数\(k_{n}\),然后求点\(\boldsymbol{x}\)附近包含\(k_{n}\)个样本的区间的范围\(h_{n}\),最后通过公式(1)求解概率密度。如下是k近邻估计的实现代码,其中参数\(f\)为求解两个点直接距离的函数。

def knn(Data, X, kn, d, f) :
    t = kn / len(Data)
    Prob = []
    for x in X :
        dis = []
        for s in Data :
            dis.append(f(x,s))
        dis.sort()
        v = (dis[kn] * 2) ** d
        Prob.append(t/v)
    return np.array(Prob)

        下图是通过Parzen窗方法和k近邻估计对某个样本(二维正态分布样本随机采样获得)概率密度函数的估计结果。

nonparam

以上两种非参数估计的Python实现可以在我的GitHub中获取到。


1.参考文档:

       [1]. 模式分类              Richard O.Duda 等著       李宏东 等译

转载于:https://www.cnblogs.com/alants/p/10552242.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Parzen法是一种常见的非参数估计方法,用于估计概率密度函数。其基本思想是将一个函数放置在每个数据点上,然后将所有函数的贡献加起来得到估计值。具体来说,对于一个给定的函数 $K(x)$ 和一个数据点 $x_i$,估计值 $\hat{f}(x)$ 可以表示为: $$\hat{f}(x)=\frac{1}{n}\sum_{i=1}^n\frac{1}{h^d}K\left(\frac{x-x_i}{h}\right)$$ 其中,$n$ 是样本数量,$d$ 是数据维数,$h$ 是口大小,$K(x)$ 是函数,通常选择高斯函数或矩形函数。 在实验中,我们需要注意以下几点: 1. 口大小的选择:口大小 $h$ 的选择会影响到估计结果的准确性和平滑度。如果选择过小的口,估计值会受到噪声的影响,导致过拟合;如果选择过大的口,估计值会过于平滑,导致欠拟合。通常可以通过交叉验证来选择合适的口大小。 2. 函数的选择:函数的选择同样会影响到估计结果的准确性和平滑度。高斯函数能够更好地处理连续变量,而矩形函数则适用于离散变量。在实际应用中,也可以根据具体情况选择其他的函数。 3. 样本数量的影响:样本数量的增加会使得估计值更加准确,但同时也会增加计算复杂度。因此,在实际应用中需要根据实际情况选择合适的样本数量。 4. 多维数据的处理:在处理多维数据时,需要考虑到维数灾难的问题。随着数据维数的增加,需要的样本数量也会呈指数级增长。因此,在实际应用中需要使用一些技巧来降低维数,比如降维、特征选择等。 总之,Parzen法是一种常用的非参数估计方法,理论基础坚实,实现简单,但需要根据实际情况选择合适的口大小和函数,并注意处理多维数据时的维数灾难问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值