日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

核密度估计python_非参数估计:核密度估计KDE

發(fā)布時(shí)間:2024/10/8 python 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 核密度估计python_非参数估计:核密度估计KDE 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

核密度估計(jì)Kernel Density Estimation(KDE)概述

密度估計(jì)的問(wèn)題

由給定樣本集合求解隨機(jī)變量的分布密度函數(shù)問(wèn)題是概率統(tǒng)計(jì)學(xué)的基本問(wèn)題之一。解決這一問(wèn)題的方法包括參數(shù)估計(jì)和非參數(shù)估計(jì)。

參數(shù)估計(jì)

參數(shù)估計(jì)又可分為參數(shù)回歸分析和參數(shù)判別分析。在參數(shù)回歸分析中,人們假定數(shù)據(jù)分布符合某種特定的性態(tài),如線性、可化線性或指數(shù)性態(tài)等,然后在目標(biāo)函數(shù)族中尋找特定的解,即確定回歸模型中的未知參數(shù)。在參數(shù)判別分析中,人們需要假定作為判別依據(jù)的、隨機(jī)取值的數(shù)據(jù)樣本在各個(gè)可能的類別中都服從特定的分布。經(jīng)驗(yàn)和理論說(shuō)明,參數(shù)模型的這種基本假定與實(shí)際的物理模型之間常常存在較大的差距,這些方法并非總能取得令人滿意的結(jié)果。

非參數(shù)估計(jì)方法

由于上述缺陷,Rosenblatt和Parzen提出了非參數(shù)估計(jì)方法,即核密度估計(jì)方法。由于核密度估計(jì)方法不利用有關(guān)數(shù)據(jù)分布的先驗(yàn)知識(shí),對(duì)數(shù)據(jù)分布不附加任何假定,是一種從數(shù)據(jù)樣本本身出發(fā)研究數(shù)據(jù)分布特征的方法,因而,在統(tǒng)計(jì)學(xué)理論和應(yīng)用領(lǐng)域均受到高度的重視。

核密度估計(jì)(kernel density estimation)是在概率論中用來(lái)估計(jì)未知的密度函數(shù),屬于非參數(shù)檢驗(yàn)方法之一,由Rosenblatt (1955)和Emanuel Parzen(1962)提出,又名Parzen窗(Parzen window)。Ruppert和Cline基于數(shù)據(jù)集密度函數(shù)聚類算法提出修訂的核密度估計(jì)方法。

核密度估計(jì)在估計(jì)邊界區(qū)域的時(shí)候會(huì)出現(xiàn)邊界效應(yīng)。

[https://zh.wikipedia.org/zh-hans/核密度估計(jì)]

因此,一句話概括,核密度估計(jì)Kernel Density Estimation(KDE)是在概率論中用來(lái)估計(jì)未知的密度函數(shù),屬于非參數(shù)檢驗(yàn)方法之一。

在密度函數(shù)估計(jì)中有一種方法是被廣泛應(yīng)用的——直方圖。如下圖中的第一和第二幅圖(名為Histogram和Histogram, bins shifted)。直方圖的特點(diǎn)是簡(jiǎn)單易懂,但缺點(diǎn)在于以下三個(gè)方面:密度函數(shù)是不平滑的;密度函數(shù)受子區(qū)間(即每個(gè)直方體)寬度影響很大,同樣的原始數(shù)據(jù)如果取不同的子區(qū)間范圍,那么展示的結(jié)果可能是完全不同的。如下圖中的前兩個(gè)圖,第二個(gè)圖只是在第一個(gè)圖的基礎(chǔ)上,劃分區(qū)間增加了0.75,但展現(xiàn)出的密度函數(shù)卻看起來(lái)差異很大;直方圖最多只能展示2維數(shù)據(jù),如果維度更多則無(wú)法有效展示。

核密度估計(jì)有多種內(nèi)核,圖3(Tophat Kernl Density)為不平滑內(nèi)核,圖4(Gaussian Kernel Density,bandwidth=0.75)為平滑內(nèi)核。在很多情況下,平滑內(nèi)核(如高斯核密度估計(jì),Gaussian Kernel Density)使用場(chǎng)景較多。

雖然采用不同的核函數(shù)都可以獲得一致性的結(jié)論(整體趨勢(shì)和密度分布規(guī)律性基本一致),但核密度函數(shù)也不是完美的。除了核算法的選擇外,帶寬(bandwidth)也會(huì)影響密度估計(jì),過(guò)大或過(guò)小的帶寬值都會(huì)影響估計(jì)結(jié)果。如上圖中的最后三個(gè)圖,名為Gaussian Kernel Density,bandwidth=0.75、Gaussian Kernel Density,bandwidth=0.25、Gaussian Kernel Density,bandwidth=0.55.

核密度估計(jì)的應(yīng)用場(chǎng)景

股票、金融等風(fēng)險(xiǎn)預(yù)測(cè):在單變量核密度估計(jì)的基礎(chǔ)上,可以建立風(fēng)險(xiǎn)價(jià)值的預(yù)測(cè)模型。通過(guò)對(duì)核密度估計(jì)變異系數(shù)的加權(quán)處理,可以建立不同的風(fēng)險(xiǎn)價(jià)值的預(yù)測(cè)模型。

密度估計(jì)中應(yīng)用較多的算法是高斯混合模型以及基于近鄰的核密度估計(jì)。高斯混合核密度估計(jì)模型更多會(huì)在聚類場(chǎng)景中應(yīng)用。

[核密度估計(jì)Kernel Density Estimation(KDE)]

核密度分析可用于測(cè)量建筑密度、獲取犯罪情況報(bào)告,以及發(fā)現(xiàn)對(duì)城鎮(zhèn)或野生動(dòng)物棲息地造成影響的道路或公共設(shè)施管線。可使用 population 字段根據(jù)要素的重要程度賦予某些要素比其他要素更大的權(quán)重,該字段還允許使用一個(gè)點(diǎn)表示多個(gè)觀察對(duì)象。例如,一個(gè)地址可以表示一棟六單元的公寓,或者在確定總體犯罪率時(shí)可賦予某些罪行比其他罪行更大的權(quán)重。對(duì)于線要素,分車道高速公路可能比狹窄的土路產(chǎn)生更大的影響,高壓線要比標(biāo)準(zhǔn)電線桿產(chǎn)生更大的影響。[ArcGIS中的介紹]

熱力圖大家一定聽說(shuō)過(guò),其實(shí)熱力圖就是核密度估計(jì)。

總而言之,核密度就是用來(lái)估計(jì)密度的,如果你有一系列空間點(diǎn)數(shù)據(jù),那么核密度估計(jì)往往是比較好的可視化方法

核密度估計(jì)

所謂核密度估計(jì),就是采用平滑的峰值函數(shù)(“核”)來(lái)擬合觀察到的數(shù)據(jù)點(diǎn),從而對(duì)真實(shí)的概率分布曲線進(jìn)行模擬。

核密度估計(jì)(Kernel density estimation),是一種用于估計(jì)概率密度函數(shù)的非參數(shù)方法,

為獨(dú)立同分布F的n個(gè)樣本點(diǎn),設(shè)其概率密度函數(shù)為f,核密度估計(jì)為以下:

h>0為一個(gè)平滑參數(shù),稱作帶寬(bandwidth),也看到有人叫窗口。

Kh(x) = 1/h K(x/h).?為縮放核函數(shù)(scaled Kernel)。

核密度函數(shù)的原理比較簡(jiǎn)單,在我們知道某一事物的概率分布的情況下,如果某一個(gè)數(shù)在觀察中出現(xiàn)了,我們可以認(rèn)為這個(gè)數(shù)的概率密度很大,和這個(gè)數(shù)比較近的數(shù)的概率密度也會(huì)比較大,而那些離這個(gè)數(shù)遠(yuǎn)的數(shù)的概率密度會(huì)比較小。

基于這種想法,針對(duì)觀察中的第一個(gè)數(shù),我們可以用K去擬合我們想象中的那個(gè)遠(yuǎn)小近大概率密度。對(duì)每一個(gè)觀察數(shù)擬合出的多個(gè)概率密度分布函數(shù),取平均。如果某些數(shù)是比較重要的,則可以取加權(quán)平均。需要說(shuō)明的一點(diǎn)是,核密度的估計(jì)并不是找到真正的分布函數(shù)。

Note:?核密度估計(jì)其實(shí)就是通過(guò)核函數(shù)(如高斯)將每個(gè)數(shù)據(jù)點(diǎn)的數(shù)據(jù)+帶寬當(dāng)作核函數(shù)的參數(shù),得到N個(gè)核函數(shù),再線性疊加就形成了核密度的估計(jì)函數(shù),歸一化后就是核密度概率密度函數(shù)了。

以下面3個(gè)數(shù)據(jù)點(diǎn)的一維數(shù)據(jù)集為例:5, 10, 15

繪制成直方圖是這樣的:?????????????????????????????????????????????????? 而使用KDE則是:

KDE核函數(shù)k(.)

理論上,所有平滑的峰值函數(shù)均可作為KDE的核函數(shù)來(lái)使用,只要對(duì)歸一化后的KDE而言(描繪在圖上的是數(shù)據(jù)點(diǎn)出現(xiàn)的概率值),該函數(shù)曲線下方的面積和等于1即可。

只有一個(gè)數(shù)據(jù)點(diǎn)時(shí),單個(gè)波峰下方的面積為1,存在多個(gè)數(shù)據(jù)點(diǎn)時(shí),所有波峰下方的面積之和為1。概而言之,函數(shù)曲線需囊括所有可能出現(xiàn)的數(shù)據(jù)值的情況。

常用的核函數(shù)有:矩形、Epanechnikov曲線、高斯曲線等。這些函數(shù)存在共同的特點(diǎn):在數(shù)據(jù)點(diǎn)處為波峰;曲線下方面積為1。

單個(gè)數(shù)據(jù)點(diǎn)(只有一個(gè)數(shù)據(jù)時(shí))所對(duì)應(yīng)的這些核函數(shù)

矩形

Epanechnikov曲線

高斯曲線

sklearn中實(shí)現(xiàn)的核函數(shù)

sklearn核函數(shù)形式

Gaussian kernel (kernel?=?'gaussian')

Tophat kernel (kernel?=?'tophat')

?if?

Epanechnikov kernel (kernel?=?'epanechnikov')

Exponential kernel (kernel?=?'exponential')

Linear kernel (kernel?=?'linear')

?if?

Cosine kernel (kernel?=?'cosine')

?if?

[Kernel Density Estimation?]

wekipedia上各種核函數(shù)的圖形

均勻核函數(shù) k(x)=1/2,-1≤x≤1 加入帶寬h后: kh(x)=1/(2h),-h≤x≤h

三角核函數(shù) k(x)=1-|x|,-1≤x≤1 加入帶寬h后: kh(x)=(h-|x|)/h^2,-h≤x≤h

伽馬核函數(shù) kxi(x)=[x^(α-1)exp{-xα/xi}]/[(xi/α)^α.Γ(α)]

高斯核函數(shù)K(x,xc)=exp(-||x-xc||^2/(2*σ)^2)其中xc為核函數(shù)中心,σ為函數(shù)的寬度參數(shù)

[https://zh.wikipedia.org/zh-hans/%E6%A0%B8%E5%AF%86%E5%BA%A6%E4%BC%B0%E8%AE%A1]

不同內(nèi)核的比較

Epanechnikov 內(nèi)核在均方誤差意義下是最優(yōu)的,效率損失也很小。

由于高斯內(nèi)核方便的數(shù)學(xué)性質(zhì),也經(jīng)常使用?K(x)=??(x),?(x)為標(biāo)準(zhǔn)正態(tài)概率密度函數(shù)。

對(duì)于多個(gè)數(shù)據(jù)點(diǎn)的KDE曲線:由于相鄰波峰之間會(huì)發(fā)生波形合成,因此最終所形成的曲線形狀與選擇的核函數(shù)關(guān)系并不密切。考慮到函數(shù)在波形合成計(jì)算上的易用性,一般使用高斯曲線(正態(tài)分布曲線)作為KDE的核函數(shù)。

KDE算法:索引樹

lz發(fā)現(xiàn)sklearn算法實(shí)現(xiàn)中有一個(gè)參數(shù)是算法項(xiàng),如algorithm='auto',想了一下是為了加速。

KDE的概率密度函數(shù)公式得到后

有了上述公式之后,只需遍歷輸出圖像的每一個(gè)點(diǎn),計(jì)算其核密度估計(jì)值即可。

但是稍微想一下就發(fā)現(xiàn)這個(gè)程序太冗余了,如果有很多點(diǎn)(n很大),并且輸出圖像很大,那么每一個(gè)像素都需要進(jìn)行n個(gè)累積的加法運(yùn)算,并且大部分都是+0(因?yàn)橐话銇?lái)說(shuō),一個(gè)點(diǎn)附近的點(diǎn)不會(huì)很多,遠(yuǎn)遠(yuǎn)小于n,其余大部分點(diǎn)與這個(gè)像素的距離都大于r),這樣就造成了冗余計(jì)算。

解決方案當(dāng)然也非常簡(jiǎn)單,就是建立一個(gè)索引,然后在計(jì)算某個(gè)像素的核密度估計(jì)值時(shí)利用索引搜索出附近的點(diǎn),然后累積這些點(diǎn)的核函數(shù)即可。

如Dotspatial自帶了多種空間索引,有R樹,R*樹,KD樹等;sklearn自帶了kd tree, ball tree等等。

如果只需找出附近的點(diǎn),對(duì)索引要求不高,任意一個(gè)索引都能使用。

[空間點(diǎn)云核密度估計(jì)算法的實(shí)現(xiàn)-以Dotspatial為基礎(chǔ)GIS庫(kù)]

KDE帶寬h

如何選定核函數(shù)的“方差”呢?這其實(shí)是由帶寬h來(lái)決定,不同的帶寬下的核函數(shù)估計(jì)結(jié)果差異很大。

帶寬反映了KDE曲線整體的平坦程度,也即觀察到的數(shù)據(jù)點(diǎn)在KDE曲線形成過(guò)程中所占的比重。帶寬越大,觀察到的數(shù)據(jù)點(diǎn)在最終形成的曲線形狀中所占比重越小,KDE整體曲線就越平坦;帶寬越小,觀察到的數(shù)據(jù)點(diǎn)在最終形成的曲線形狀中所占比重越大,KDE整體曲線就越陡峭。

還是以上面3個(gè)數(shù)據(jù)點(diǎn)的一維數(shù)據(jù)集為例,如果增加帶寬,那么生成的KDE曲線就會(huì)變平坦:

如果進(jìn)一步增加帶寬,那么KDE曲線在變平坦的同時(shí),還會(huì)發(fā)生波形合成:

相反,如果減少帶寬,那么KDE曲線就會(huì)變得更加陡峭:

從數(shù)學(xué)上來(lái)說(shuō),對(duì)于數(shù)據(jù)點(diǎn)Xi,如果帶寬為h,那么在Xi處所形成的曲線函數(shù)為(其中K為核函數(shù)):

在上面的函數(shù)中,K函數(shù)內(nèi)部的h分母用于調(diào)整KDE曲線的寬幅,而K函數(shù)外部的h分母則用于保證曲線下方的面積符合KDE的規(guī)則(KDE曲線下方面積和為1)。

帶寬的選擇

帶寬的選擇很大程度上取決于主觀判斷:如果認(rèn)為真實(shí)的概率分布曲線是比較平坦的,那么就選擇較大的帶寬;相反,如果認(rèn)為真實(shí)的概率分布曲線是比較陡峭的,那么就選擇較小的帶寬。

帶寬計(jì)算好像也有相應(yīng)的方法,如R語(yǔ)言中計(jì)算帶寬時(shí),默認(rèn)采用”nrd0″方法。

如何選擇h?顯然是選擇可以使誤差最小的。下面用平均積分平方誤差(mean intergrated squared error)的大小來(lái)衡量h的優(yōu)劣。

在weak assumptions下,MISE (h) =AMISE(h) +?o(1/(nh) + h4)?,其中AMISE為漸進(jìn)的MISE。而AMISE有,

其中,

為了使MISE(h)最小,則轉(zhuǎn)化為求極點(diǎn)問(wèn)題,

當(dāng)核函數(shù)確定之后,h公式里的R、m、f''都可以確定下來(lái),有(hAMISE ~?n?1/5),AMISE(h) =?O(n?4/5)。

如果帶寬不是固定的,其變化取決于估計(jì)的位置(balloon ?estimator)或樣本點(diǎn)(逐點(diǎn)估計(jì)pointwise estimator),由此可以產(chǎn)產(chǎn)生一個(gè)非常強(qiáng)大的方法稱為自適應(yīng)或可變帶寬核密度估計(jì)。

[核密度估計(jì)(Kernel density estimation)]

在選擇合適的核函數(shù)及帶寬后,KDE可以模擬真實(shí)的概率分布曲線,并得到平滑而漂亮的結(jié)果。以近200個(gè)點(diǎn)的CPU使用率為例,使用KDE繪制的結(jié)果為:

[一維數(shù)據(jù)可視化:核密度估計(jì)(Kernel Density Estimates)]

核密度估計(jì)的實(shí)現(xiàn)

Python中KDE的實(shí)現(xiàn):sklearn

[sklearn.neighbors.KernelDensity(bandwidth=1.0,?algorithm='auto',?kernel='gaussian',?metric='euclidean',?atol=0,?rtol=0,?breadth_first=True,?leaf_size=40,?metric_params=None)

from sklearn.neighbors import kde

import numpy as np

X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])

kde = kde.KernelDensity(kernel='gaussian', bandwidth=0.2).fit(X)

print(kde.score_samples(X))

print(np.exp(kde.score_samples(X)))

[-0.41075698 -0.41075698 -0.41076071 -0.41075698 -0.41075698 -0.41076071]

[ 0.66314807? 0.66314807? 0.6631456?? 0.66314807? 0.66314807? 0.6631456 ]

score_samples(X)

Evaluate the density model on the data.

Parameters:

X?: array_like, shape (n_samples, n_features)

kde.score_samples(X)返回的是點(diǎn)x對(duì)應(yīng)概率的log值,要使用exp求指數(shù)還原。

Note: 還原后的所有點(diǎn)的概率和范圍是[0, 無(wú)窮大],只是說(shuō)一維數(shù)據(jù)線下面的面積或者二維數(shù)據(jù)面下面的體積和為1。

[Density Estimation?]

[sklearn.neighbors.KernelDensity?]

spark中KDE的實(shí)現(xiàn)

MLlib中,僅僅支持以高斯核做核密度估計(jì)。

R中KDE的實(shí)現(xiàn)

在R語(yǔ)言中,KDE的繪制是通過(guò)density()函數(shù)來(lái)實(shí)現(xiàn)的 — 通過(guò)density()函數(shù)計(jì)算得到KDE模型,然后再使用plot()函數(shù)對(duì)KDE曲線進(jìn)行繪制:

x

plot(density(x))

出于兼容性上的考慮,R語(yǔ)言中density()函數(shù)在計(jì)算帶寬時(shí),默認(rèn)采用”nrd0″方法。不過(guò),根據(jù)R語(yǔ)言的幫助文檔,帶寬參數(shù)bw應(yīng)該顯式聲明為其它更合適的方法,比如”SJ”:

plot(density(x, bw="SJ"))

對(duì)于調(diào)整帶寬,除了修改bw參數(shù),還可以通過(guò)設(shè)定adjust參數(shù)來(lái)進(jìn)行擴(kuò)大或縮小:

plot(density(x, bw="SJ", adjust=1.5))

在上面的例子中,最終使用的帶寬將是采用”SJ”方法計(jì)算得到的帶寬的1.5倍。adjust參數(shù)的默認(rèn)值為1,也即既不擴(kuò)大、也不縮小。

至于核函數(shù),density()默認(rèn)采用高斯曲線。可以通過(guò)設(shè)定kernel參數(shù)來(lái)更改核函數(shù)。比如:plot(density(x, bw="SJ", kernel="epanechnikov"))

density()函數(shù)接受以下7個(gè)核函數(shù)選項(xiàng):

gaussian。高斯曲線,默認(rèn)選項(xiàng)。在數(shù)據(jù)點(diǎn)處模擬正態(tài)分布。

epanechnikov。Epanechnikov曲線。

rectangular。矩形核函數(shù)。

triangular。三角形核函數(shù)。

biweight。

cosine。余弦曲線。

optcosine。

總結(jié)

以上是生活随笔為你收集整理的核密度估计python_非参数估计:核密度估计KDE的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。