文章地址
https://blog.csdn.net/yxs9527/article/details/83749549
概述
>>> 每個點都有一個核函數,如選定高斯核函數,核函數下面積為1
>>> 離的近的點概率高
>>> 每個點的核密度累加
>>> 累加出的曲線下的面積為點的數量,除以點的數量就實現了,曲線下面積的歸一化
已知n個點,使用概率密度估計求整體的概率密度分布。
用盒子模型求解(直方圖求解)
X=[2, 22, 42, 62, 82, 102, 122, 142,162, 182, 202 , 222],最簡單的我們可以直接使用直方圖來進行概率估計。每一個點用一個盒子來替代,那么此時我們有3個參數需要人工確定:
盒子長我們分別設定0.5????
盒子右邊界設定為[0-0.5]和[0.25-0.75]兩種情況分別討論如下兩個圖所示。
盒子高度為1/n=1/12 ,n為數據的總數
那么我們,利用盒子累加的方式,畫圖如下所示,則方塊的高地為密度的一直估計:
可以看出,當你的右邊界設定不同的時候,產生的概率密度估計差異非常大,單峰和雙峰的區別。
暴露了一下的一些不足:
1.盒子長度對結果影響太大
2.盒子的邊界對結果影響太大
3.不平滑
以盒子為核的核密度估計
盒子模型不是圍繞著點來展開,而是圍繞區間范圍的展開,它是區間范圍頻數累加,這就是直方圖了,上面三點總結的就是直方圖的弱點。
如果不圍繞著區間范圍而是圍繞著點來展開,也就是說把核函數設置為盒子,我們稱之為盒子核,
而且盒子的中心點和就是數據點,盒子寬度仍然是固定的,高度是1/12
那就是下面這樣的:
這個我們則可以稱為以盒子為核的核密度估計。它解決了區間段劃分對核密度估計的影響。但仍然存在以下問題:
1. 不平滑
2. 盒子長度不好確定
基于此,我們可以選擇出更加平滑的核進行密度估計,比如高斯核,則可以有效解決問題1,即不平滑的問題。
高斯核概率密度估計
我們使用高斯核來進行密度估計,則唯一需要確定的參數就是帶寬,即盒子長度,同樣也是正態分布的標準差。我們設為0.1,則高斯核密度估計可以如下進行:
對每一個點都產生一個高斯分布,u=點坐標,σ=0.1,則可以得到如下的核密度估計,總體的密度估計則為每一個點的密度估計總和,注意的是因為所有的密度概率函數積分等1,所有我們得到的子正態分布的概率即覆蓋的面積為1/12才行。
因為h=0.1導致不平滑,所以我們用h=0.5來替代,但是有導致另外一問題,即遠離了真實的最優值,我們需要一些方法去確認最優h,則可以使用最小化MASE。
理論上存在一個最小化mean square error的一個h。h的選取應該取決于N,當N越大的時候,我們可以用一個比較小的h,因為較大的N保證了即使比較小的h也足以保證區間內有足夠多的點用于計算概率密度。因而,我們通常要求當N→∞,h→0。比如,在這里可以推導出,最優的h應該是N的-1/5次方乘以一個常數,也就是。對于正態分布而言,可以計算出c=1.05×標準差。
關于h的確定可以查看這篇博客
http://blog.csdn.net/chixuezhihun/article/details/73928749
自適應帶寬的核密度估計可以參考維基百科:https://en.wikipedia.org/wiki/Variable_kernel_density_estimation
推薦帖子:http://blog.sina.com.cn/s/blog_62b37bfe0101homb.html
參考資料
https://en.wikipedia.org/wiki/Kernel_density_estimation
https://www.zhihu.com/question/20212426/answer/74989607
https://en.wikipedia.org/wiki/Variable_kernel_density_estimation
http://www.tuicool.com/articles/EVJnI3
袁修開,呂震宙,池巧君. 基于核密度估計的自適應重要抽樣可靠性靈敏度分析.西北工業大學學報.Vol.26 No.3.2008.6.
應用例子:
https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python
g = sns.pairplot(train[['Survived', u'Pclass', u'Age', u'Sex',u'Parch', u'Fare', u'Embarked',
? ? ? u'FamilySize', u'Title']], hue='Survived', palette = 'seismic',height=1.2,diag_kind = 'kde',diag_kws=dict(shade=True, kernel='gau',bw=1.0),plot_kws=dict(s=10) )
g.set(xticklabels=[])