机器学习5——非参数估计
非参数估计
- 在参数估计中我们已经提到,想要估计后验概率 P ( ω i ∣ x ) = p ( x ∣ ω i ) p ( ω i ) p ( x ) P\left(\omega_i \mid x\right)=\frac{p\left(x \mid \omega_i\right) p\left(\omega_i\right)}{p(x)} P(ωi∣x)=p(x)p(x∣ωi)p(ωi), 就需要估计类条件概率 p ( x ∣ ω i ) p\left(x \mid \omega_i\right) p(x∣ωi)。在参数估计中,我们假定了它的分布形式,然后使用了不同估计方法去估计这种分布的参数。但是这种方法是有缺陷的,因为事先假定了分布形式(贝叶斯估计假设了参数的分布形式,而极大似然估计没有。但它们两者都需要知晓,或者假定数据的分布形式。),当 p ( x ∣ ω i ) p(x \mid \omega_i) p(x∣ωi) 没有特定形式时,我们需要非参数方法,核心思想是“让数据自己说话”。我们将通过两种方法来估计概率密度:Parzen窗口和K近邻估计。
从样本频率引入概率密度
-
首先考虑最简单的情况,样本x是一维的,那么我们将x的取值范围分成k个等间隔的区间,统计每个区间内样本的个数,由此计算每个区间的概率密度。这就是直方图法。现在考虑复杂一点的情况,当 x x x 是 d d d 维向量的时候,我们对每个维度的量都分成 k k k 个等间隔的区间,于是我们将整个空间分成了 k d k^d kd 个小空间,每个小空间的体积定义为: V = ∏ i = 1 d V=\prod_{i=1}^d V=∏i=1d value i _i i ,其中value e i e_i ei 为第 i i i 维分量的每个区间的大小。
假设总样本数为 N N N ,每个小空间内样本数为 q i q_i qi ,那么每个小空间的概率密度(注意不是概率)也可以计算出来了,为 q i N V \frac{q_i}{N V} NVqi可以注意到,小区间的大小选择与估计的效果是密切相连的。如果区域选择过大,会导致最终估计出来的概率密度函数非常粗糙;如果区域的选择过小,可能会导致有些区域内根本没有样本或者样本非常少,这样会导致估计出来的概率密度函数很不连续。所以,随着样本数的增加,区域的体积应该尽可能小,同时又必须保证区域内有充分多的样本,但是每个区域的样本数有必须是总样本数的很小的一部分。
-
我们常常希望能够估计某个样本点在特定区域内的概率密度。给定一个未知的概率密度函数 p ( x ) p(\mathbf{x}) p(x),我们想估计一个小区域 R \mathcal{R} R 中的概率:
P ( x ∈ R ) = ∫ R p ( x ) d x P(\mathbf{x} \in \mathcal{R}) = \int_{\mathcal{R}} p(\mathbf{x}) \, d\mathbf{x} P(x∈R)=∫Rp(x)dx
若 R \mathcal{R} R 足够小,密度近似为常数,有:
P ( x ∈ R ) ≈ p ( x ) V R P(\mathbf{x} \in \mathcal{R}) \approx p(\mathbf{x}) V_{\mathcal{R}} P(x∈R)≈p(x)VR
其中 V R V_{\mathcal{R}} VR 为该区域的体积。这一思想类似于在空间中“围住”样本点,通过样本的分布来反推其密度。 -
给定一个含有 n n n 个样本的数据集:
D = { x 1 , x 2 , . . . , x n } D = \{\mathbf{x}_1, \mathbf{x}_2, ..., \mathbf{x}_n\} D={x1,x2,...,xn}
我们可以通过统计落在区域 R \mathcal{R} R 中的样本数 k R k_{\mathcal{R}} kR,来估计该区域的概率:
P ( x ∈ R ) ≈ k R n P(\mathbf{x} \in \mathcal{R}) \approx \frac{k_{\mathcal{R}}}{n} P(x∈R)≈nkR
代入上面的公式:
p ( x ) ≈ k R / n V R p(\mathbf{x}) \approx \frac{k_{\mathcal{R}} / n}{V_{\mathcal{R}}} p(x)≈VRkR/n
这就是一种基于频率的概率密度(注意, k R / n k_{\mathcal{R}} / n kR/n是概率,再除以体积得到的是概率密度)估计方法,是直方图法的数学基础。 -
为了保证上式能随着样本量增加而收敛到真实密度函数 p ( x ) p(\mathbf{x}) p(x),需要满足以下 三个收敛性条件:
-
区域体积收缩:
lim n → ∞ V n = 0 \lim_{n \to \infty} V_n = 0 n→∞limVn=0 -
包含足够多样本:
lim n → ∞ k n = ∞ \lim_{n \to \infty} k_n = \infty n→∞limkn=∞ -
比例合理收敛:
lim n → ∞ k n n = 0 \lim_{n \to \infty} \frac{k_n}{n} = 0 n→∞limnkn=0
这三个条件共同确保估计的稳定性和准确性,避免过拟合或欠拟合。
-
-
Parzen窗口和K近都基于公式: p n ( x ) = k n / n V n p_n(\mathbf{x})=\frac{k_n / n}{V_n} pn(x)=Vnkn/n,但控制的参数不同。
- Parzen窗口:固定区域体积 V n V_n Vn,计算落入区域的样本数 k n k_n kn。
- K近邻:固定样本数 k n k_n kn,调整区域体积 V n V_n Vn 直到包含 k n k_n kn 个样本。
Parzen窗口
-
Parzen窗口通过固定一个区域(通常是超立方体),然后数有多少样本落在这个区域来估计密度。
-
核心内容:
-
Parzen窗口:固定区域体积 V n V_n Vn,计算样本数 k n k_n kn。
-
超立方体:假设区域是一个 d d d 维超立方体,每条边长为 h n h_n hn,体积为: V n = h n d V_n = h_n^d Vn=hnd
-
窗口函数:用一个函数(也叫核函数)来判断样本是否落在区域内。
-
窗口函数举例:
-
φ ( u ) = { 1 if ∣ u j ∣ ≤ 1 / 2 , j = 1 , 2 , … , d 0 otherwise \varphi(\mathbf{u})= \begin{cases}1 & \text { if }\left|u_j\right| \leq 1 / 2, j=1,2, \ldots, d \\ 0 & \text { otherwise }\end{cases} φ(u)={10 if ∣uj∣≤1/2,j=1,2,…,d otherwise
这定义了一个以原点为中心的单位超立方体
-
φ ( x h n ) = { 1 if ∣ x j ∣ ≤ h n / 2 0 otherwise \varphi\left(\frac{\mathbf{x}}{h_n}\right)= \begin{cases}1 & \text { if }\left|x_j\right| \leq h_n / 2 \\ 0 & \text { otherwise }\end{cases} φ(hnx)={10 if ∣xj∣≤hn/2 otherwise
这定义了一个以原点为中心,边长为hn的超立方体
-
φ ( x − x i h n ) = { 1 ∣ x − x i ∣ ≤ h n / 2 0 otherwise \varphi\left(\frac{\mathbf{x}-\mathbf{x_i}}{h_n}\right)= \begin{cases}1 & \left|x-x_i \right| \leq h_n / 2 \\ 0 & \text { otherwise }\end{cases} φ(hnx−xi)={10∣x−xi∣≤hn/2 otherwise
这定义了一个以 x \mathbf{x} x为中心,边长为hn的超立方体
-
φ ( u ) \varphi(\mathbf{u}) φ(u) 可以是任何满足 ∫ p ( u ) d u = 1 \int p(\mathbf{u}) d\mathbf{u} = 1 ∫p(u)du=1 的概率密度函数,比如高斯分布。
-
-
-
样本计数: k n = ∑ i = 1 n φ ( x − x i h n ) k_n = \sum_{i=1}^n \varphi\left(\frac{\mathbf{x} - \mathbf{x}_i}{h_n}\right) kn=∑i=1nφ(hnx−xi)
-
代入公式,得到Parzen窗口密度估计: p n ( x ) = k n / n V n = 1 n V n ∑ i = 1 n φ ( x − x i h n ) p_n(\mathbf{x}) = \frac{k_n / n}{V_n} = \frac{1}{n V_n} \sum_{i=1}^n \varphi\left(\frac{\mathbf{x} - \mathbf{x}_i}{h_n}\right) pn(x)=Vnkn/n=nVn1∑i=1nφ(hnx−xi)
-
那么这个 p n ( x ) p_n(\mathbf{x}) pn(x)是一个pdf函数吗?答案是肯定的,我们可以对其积分来验证其积分值是否为1:
Set ( x − x i ) / h n = u \left(\boldsymbol{x}-\boldsymbol{x}_{\boldsymbol{i}}\right) / h_n=\boldsymbol{u} (x−xi)/hn=u.
∫ 1 n ∑ i = 1 n 1 V n φ ( x − x i h n ) d x = 1 n ∑ i = 1 n ∫ 1 V n φ ( x − x i h n ) d x = 1 n ∑ i = 1 n ∫ φ ( u ) d u \int \frac{1}{n} \sum_{i=1}^n \frac{1}{V_n} \varphi\left(\frac{\mathbf{x}-\mathbf{x}_i}{h_n}\right) d \mathbf{x}=\frac{1}{n} \sum_{i=1}^n \int \frac{1}{V_n} \varphi\left(\frac{\mathbf{x}-\mathbf{x}_i}{h_n}\right) d \mathbf{x}=\frac{1}{n} \sum_{i=1}^n \int \varphi(\mathbf{u}) d \mathbf{u} ∫n1i=1∑nVn1φ(hnx−xi)dx=n1i=1∑n∫Vn1φ(hnx−xi)dx=n1i=1∑n∫φ(u)du
注意由于u是d维向量,每一维乘上 h n h_n hn后再微分变成 h n d h_n^d hnd。 -
这个核函数也可以换成高斯核,这样样本点对于概率密度估计的影响会更加平滑。
-
**选择窗口体积:**那为什么要调整 V n V_n Vn 呢?
因为:
- 当样本 太少时:你不能让窗口太小,否则几乎没有样本落进去,估计的密度都是零。
- 当样本 变多时:你需要减小窗口体积,让估计更细致、更精确(避免“过度平滑”)。
这就引出了一个“平衡问题”:窗口体积不能太大,也不能太小,必须随样本数 n n n 适当变化。
我们希望:
- V n → 0 V_n \to 0 Vn→0,这样估计才更精确(更细致)
- 同时要求 n V n → ∞ n V_n \to \infty nVn→∞,这样每个窗口中样本数量才不会趋近于 0,避免噪声太大
一个合理的选择是:
V n = V 1 n ⇒ h n ∝ n − 1 / ( 2 d ) V_n = \frac{V_1}{\sqrt{n}} \quad \Rightarrow \quad h_n \propto n^{-1/(2d)} Vn=nV1⇒hn∝n−1/(2d)
这保证了:
- 随着 n → ∞ n \to \infty n→∞,窗口在收缩(更精细)
- 但收缩得不会太快,仍有足够样本进入窗口
V 1 V_1 V1 是一个常数,它代表了当样本数 n = 1 n=1 n=1 时的窗口体积。这个常数是窗口体积 V n V_n Vn 的初始值,随着样本数 n n n 的增加,窗口体积 V n V_n Vn 会根据公式 V n = V 1 n V_n=\frac{V_1}{\sqrt{n}} Vn=nV1 进行调整。
这个公式确保了窗口体积 V n V_n Vn 随着样本数 n n n 的增加而减小,但减小的速度不会太快,以保证每个窗口中仍然有足够的样本数量,避免估计的噪声太大。同时,随着 n → ∞ n \rightarrow \infty n→∞ ,窗口体积 V n V_n Vn 趋近于 0 ,使得估计更加精确。
-
对公式的本质理解:
一、统计直觉:它在做什么?
本质: 在你关心的点 x \mathbf{x} x 周围画一个“窗子”,看看这个窗子里有多少训练样本落进去,从而估计这里的“样本密集程度”。
就像你用手电筒照一个区域,统计这个区域里有多少人。照的人越多,这里就越“热闹”,概率密度就越高。
二、几何视角:滑动的小球数数器
想象你手上有一个可以滑动的球(或超球体),你把这个球放在空间的每一个点 x \mathbf{x} x,然后数数这个球中包含了多少样本点。再把这个数除以球的体积和样本总数,就得到这点的密度。
Parzen窗的“核函数”就是这个球的权重分布图:
- 如果是均匀核(uniform kernel),就是“球体内=1,外面=0”;
- 如果是高斯核(Gaussian kernel),则表示你允许更远的点也有影响,但越远影响越小。
三、回到概率密度的定义:单位体积上的概率质量
概率密度的经典定义是:
p ( x ) = lim δ → 0 P ( x 附近的概率 ) δ p(x) = \lim_{\delta \to 0} \frac{P(x \text{附近的概率})}{\delta} p(x)=δ→0limδP(x附近的概率)
而 Parzen窗方法正是用样本来“估计”这个概率,并用固定大小的窗口来近似这个极限过程:
p n ( x ) = 估计的落在窗口内的概率质量 窗口体积 p_n(x) = \frac{\text{估计的落在窗口内的概率质量}}{\text{窗口体积}} pn(x)=窗口体积估计的落在窗口内的概率质量
用核函数来“平滑计数”,代替硬性地“数多少个落进来”。
四、从核方法的哲学看本质
Parzen窗方法其实是最早的“核方法”之一。它遵循一种核心思想:
“不去猜一个分布函数的具体形式(比如高斯、多项式),而是直接让数据告诉我们在哪儿‘密’、在哪儿‘稀’。”
这种方法被称为 非参数估计(non-parametric estimation),因为它不假设概率密度函数的任何形式。
在后来的核密度估计、核SVM、核回归中都可以看到它的哲学延续。
k n-Nearest Neighbor
-
k-NN 的本质是:根据目标点附近的 k 个训练样本来估计它所属的概率分布或类别。相比 Parzen 方法(固定体积 V n V_n Vn,统计落入样本数),k-NN 固定样本数 k n k_n kn,根据数据自动确定体积 V n V_n Vn,更具自适应性。
-
如何用k-NN估计后验概率 P ( ω i ∣ x ) P(\omega_i \mid \mathbf{x}) P(ωi∣x):
后验概率公式: P n ( ω i ∣ x ) = P n ( x , ω i ) ∑ j = 1 c P n ( x , ω j ) = k i k n P_n(\omega_i \mid \mathbf{x}) = \frac{P_n(\mathbf{x}, \omega_i)}{\sum_{j=1}^c P_n(\mathbf{x}, \omega_j)} = \frac{k_i}{k_n} Pn(ωi∣x)=∑j=1cPn(x,ωj)Pn(x,ωi)=knki
- k i k_i ki: k n k_n kn 中属于类别 ω i \omega_i ωi 的最近邻样本数。
- k n k_n kn:总的最近邻样本数。
核心思想就是为了判断X的类别,取出最贴近它的K个样本,根据这K个样本中该类别的比例来判断X属于该类别的概率。注意!!这是KNN估计后验概率的公式,不是估计密度函数的公式!!!
-
K值选择:
大 k k k:- 决策边界平滑,噪声的影响被抵消。
- 但 k k k 太大(比如 k = N k = N k=N)会导致过度简化,总是预测多数类。
小 k k k: - 决策边界精细,但容易受噪声影响
距离度量
-
距离度量属性:
- 非负性: D ( a , b ) ≥ 0 D(\mathbf{a}, \mathbf{b}) \geq 0 D(a,b)≥0。
- 自反性: D ( a , b ) = 0 D(\mathbf{a}, \mathbf{b}) = 0 D(a,b)=0 当且仅当 a = b \mathbf{a} = \mathbf{b} a=b。
- 对称性: D ( a , b ) = D ( b , a ) D(\mathbf{a}, \mathbf{b}) = D(\mathbf{b}, \mathbf{a}) D(a,b)=D(b,a)。
- 三角不等式: D ( a , b ) + D ( b , c ) ≥ D ( a , c ) D(\mathbf{a}, \mathbf{b}) + D(\mathbf{b}, \mathbf{c}) \geq D(\mathbf{a}, \mathbf{c}) D(a,b)+D(b,c)≥D(a,c)。
-
闵可夫斯基距离:
∥ x ∥ p = ( ∑ i = 1 d ∣ x i ∣ p ) 1 / p \|\mathbf{x}\|_p=\left(\sum_{i=1}^d\left|x_i\right|^p\right)^{1 / p} ∥x∥p=(i=1∑d∣xi∣p)1/p- 常见形式:
- L 1 L_1 L1 范数(曼哈顿距离): L 1 ( a , b ) = ∑ i = 1 d ∣ a i − b i ∣ L_1(\mathbf{a}, \mathbf{b}) = \sum_{i=1}^d |a_i - b_i| L1(a,b)=∑i=1d∣ai−bi∣
- L 2 L_2 L2 范数(欧几里得距离): L 2 ( a , b ) = ∑ i = 1 d ( a i − b i ) 2 L_2(\mathbf{a}, \mathbf{b}) = \sqrt{\sum_{i=1}^d (a_i - b_i)^2} L2(a,b)=∑i=1d(ai−bi)2
- L ∞ L_\infty L∞ 范数(棋盘距离): L ∞ ( a , b ) = max ( ∣ a i − b i ∣ ) L_\infty(\mathbf{a}, \mathbf{b}) = \max(|a_i - b_i|) L∞(a,b)=max(∣ai−bi∣)
- 常见形式: