作图直观理解Parzen窗估计(附Python代码)
<h2 id="1简介">1.简介</h2><p>Parzen窗估计属于<strong>非参数估计</strong>。所谓非参数估计是指,已知样本所属的类别,但未知总体概率密度函数的形式,要求我们直接推断概率密度函数本身。</p>
<blockquote>
<p>对于不了解的可以看一下https://zhuanlan.zhihu.com/p/88562356</p>
</blockquote>
<p><strong>下面仅对《模式分类》(第二版)的内容进行简单探讨和代码实现</strong></p>
<p>ps:实验三是球形高斯哈,</p>
<h2 id="2窗函数">2.窗函数</h2>
<p><img src="https://img2020.cnblogs.com/blog/2052305/202010/2052305-20201021105610323-1942448824.png" alt="" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/2052305/202010/2052305-20201021105623876-1364461199.png" alt="" loading="lazy"></p>
<p>我们不去过多探讨什么是窗函数,只需简单理解这种估计的思想即可。</p>
<p>假设一种情况,你正在屋里看模式分类,结果天降正义掉下来一盆乒乓球,掉的哪里都是,你觉得这是天意,如果很多乒乓球都掉在了一个位置,那么那个位置下一次必掉屠龙宝刀,你想通过估计屋子里乒乓球密度,找出这个位置,那么如何估计呢?</p>
<p>假设你的屋里正好铺了地砖,每块地砖的大小都相同。你此时灵机一动,我只需要<strong>统计每块地砖上的乒乓球个数</strong>,有最多乒乓球的地砖就是屠龙宝刀的位置。</p>
<p>这似乎听起来很简单,的确,就是这么简单。我们回头看一下公式(9),<strong>其中<span class="math inline">\(
\varphi \left( \mathbf{u} \right)\)</span>其实就是判断某个乒乓球是否在某个地砖上的一个函数</strong>,这里的<span class="math inline">\(\mathbf{u}\)</span>是 <strong>乒乓球相对地砖中心的位置</strong>。</p>
<p>这里<span class="math inline">\(\mathbf{u}\)</span>是<span class="math inline">\(\mathbf{x}-\mathbf{x}_{\mathbf{i}}\)</span>,<span class="math inline">\(\mathbf{x}\)</span>是地砖中心的位置,而<span class="math inline">\(\mathbf{x_i}\)</span>是乒乓球的位置。</p>
<p><img src="https://img2020.cnblogs.com/blog/2052305/202010/2052305-20201021105648553-1792555828.png" alt="" loading="lazy"></p>
<p>那么公式(9)就显而易见了,如上图所示,你屋子里一块地砖的边长为<span class="math inline">\({h}\)</span>,红色乒乓球在地砖内,蓝色乒乓球没有在地砖内,判断的条件显然就是向量<span class="math inline">\(\mathbf{x}-\mathbf{x}_{\mathbf{i}}\)</span>的每个元素是否小于<span class="math inline">\(\frac{1}{2}h\)</span>,我们可以直接对<span class="math inline">\(\mathbf{x}-\mathbf{x}_{\mathbf{i}}\)</span>乘以<span class="math inline">\(\frac{1}{h}\)</span>,这样我们的窗函数就可以写成公式(9)的样子,只需要看参数<span class="math inline">\(\mathbf{u}=\frac{\mathbf{x}-\mathbf{x}_{\mathbf{i}}}{h}\)</span>的每个元素是否小于<span class="math inline">\(\frac{1}{2}\)</span>即可。</p>
<p>然后呢? 到这里工作差不多就结束了,我们看哪块地砖上乒乓球最多就行。</p>
<p>对于某块中心在<span class="math inline">\(\mathbf{x}\)</span>的地砖,地砖上的乒乓球个数<span class="math inline">\(k\)</span>就是公式(10)</p>
<p>有了每块地砖上的乒乓球个数,概率密度的估计就很简单了。</p>
<p></p><div class="math display">\[p\left( \mathbf{x} \right) =\frac{k}{nV}\quad V=h^d
\]</div><p></p><p>一共<span class="math inline">\(n\)</span>个球,有<span class="math inline">\(k\)</span>个球落在某个地砖上,地砖的面积为<span class="math inline">\(V=h^2\)</span>(别忘了地砖是二维空间),那<span class="math inline">\(p(\mathbf{x})\)</span>就出来了。</p>
<p>到这里,公式(11)也不需要我说什么了吧</p>
<ul>
<li>这里所写的窗函数表示超立方体,而不是超球体,判断条件也不是点到中心的距离小于2/h,而是点坐标的每个元素都小于2/h。</li>
</ul>
<h2 id="3大地砖和小地砖">3.大地砖和小地砖</h2>
<p>假设<strong>400</strong>个乒乓球在你房间的大致分为两堆,它们的分布可近似为</p>
<p></p><div class="math display">\[\left( x_1\sim N\left(-3,4 \right) ,y_1\sim N\left(4,36 \right) \right)
\\
\left( x_2\sim N\left( 5, 4 \right),y_2\sim N\left(-4,25 \right) \right)
\\
\]</div><p></p><p>乒乓球位置如下图所示</p>
<p><img src="https://img2020.cnblogs.com/blog/2052305/202010/2052305-20201021105704391-1055755634.png" alt="" loading="lazy"></p>
<p>你为了更好的估计乒乓球的密度,用魔法不断更改着地砖的大小,如下图所示,地砖的边长分别为8、5、2,黄点为坐标为(1,4)的地砖所包含的乒乓球,红点为地砖中心。我们可以看到随着<span class="math inline">\(h\)</span>的不断变化,每个地砖所包含的乒乓球数量是不同的。</p>
<p><img src="https://img2020.cnblogs.com/blog/2052305/202010/2052305-20201021105709666-493266145.png" alt="" loading="lazy"></p>
<p>下面我们可以看到三种不同大小的地砖估计出来的概率密度,如下图所示:</p>
<p><img src="https://img2020.cnblogs.com/blog/2052305/202010/2052305-20201021105718616-1987165302.png" alt="" loading="lazy"></p>
<p>所以说。。咳咳,这里直接放原话。</p>
<p><img src="https://img2020.cnblogs.com/blog/2052305/202010/2052305-20201021105722515-999277157.png" alt="" loading="lazy"></p>
<h2 id="4一盆球和无限球">4.一盆球和无限球</h2>
<p>假设我们不再是400个球,我们有。。400000个球,怎么样,真·天降正义,首先乒乓球的分布是这样的:</p>
<p><img src="https://img2020.cnblogs.com/blog/2052305/202010/2052305-20201021105730303-1066823705.png" alt="" loading="lazy"></p>
<p>我们再次用边长为8、5、2的地砖对乒乓球进行概率密度估计,如下图所示</p>
<p><img src="https://img2020.cnblogs.com/blog/2052305/202010/2052305-20201021105742867-222859934.png" alt="" loading="lazy"></p>
<p>说白了其实都差不多,显而易见的事情,这里再放出一个原话</p>
<p><strong>当n趋近于无穷大时,<span class="math inline">\(p_n(x)\)</span>将收敛于光滑的<span class="math inline">\(p(x)\)</span>曲线</strong></p>
<h2 id="代码附录">代码附录</h2>
<p>jupyter格式</p>
<p>环境:python 3.7</p>
<pre><code class="language-python">#%%
# 生成数据
import matplotlib.pyplot as plt
%matplotlib auto
import numpy as np
n = 200000
datax = np.hstack([np.random.randn(n)*2-3,
np.random.randn(n)*2+5])
datay = np.hstack([np.random.randn(n)* 6+4,
np.random.randn
(n)*5-4])
xi = np.array()
xv,yv = datax,datay
pos = np.vstack()
</code></pre>
<pre><code class="language-python">#%%
# 散点图
plt.figure(1)
plot_pos = 131
for h in :
plt.subplot(plot_pos)
plot_pos += 1
Vn = h ** 2
u = (pos - xi.reshape(-1,1))/h # u = (x - xi)/h
ix,iy = pos[:,(abs(u)<=0.5).all(axis=0)]
plt.xlim([-10,12])
plt.ylim([-15,18])
plt.title("h="+str(h))
plt.scatter(xv,yv,s=0.01)
plt.scatter(ix,iy)
plt.scatter(xi,xi,c='r')
plt.show()
</code></pre>
<pre><code class="language-python">#%%
# 三维概率密度图 和 等高线图
def px(x):
u = (pos - x.reshape(-1,1))/ h # u = (x - xi)/h
ix,iy = pos[:,(abs(u)<=0.5).all(axis=0)]
k = len(ix)
return k / (Vn * n)
w = 50
gx = gy = np.linspace(-10,10,w)
gxv,gyv = np.meshgrid(gx,gy)
fgxv = gxv.ravel()
fgyv = gyv.ravel()
plt.figure(3)
plot_pos = 321
for i in :
h = i
fpx = np.array().T])
fpx = fpx.reshape(w,w)
ax = plt.subplot(plot_pos,projection='3d')
plot_pos += 1
ax.plot_surface(gxv,gyv,fpx,cmap='GnBu')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('h='+str(h))
ax = plt.subplot(plot_pos)
plot_pos += 1
ax.contour(gxv,gyv,fpx)
plt.show()
</code></pre><br><br>
来源:https://www.cnblogs.com/aminor/p/13851150.html
頁:
[1]