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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

核密度估计Kernel Density Estimation(KDE)-代码详细解释

發(fā)布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 核密度估计Kernel Density Estimation(KDE)-代码详细解释 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

在介紹核密度評估Kernel Density Estimation(KDE)之前,先介紹下密度估計的問題。由給定樣本集合求解隨機(jī)變量的分布密度函數(shù)問題是概率統(tǒng)計學(xué)的基本問題之一。解決這一問題的方法包括參數(shù)估計和非參數(shù)估計。(對于估計概率密度,如果確定數(shù)據(jù)服從的分布類型,可以使用參數(shù)擬合,否則只能使用非參數(shù)擬合

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

?

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

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

在密度函數(shù)估計中有一種方法是被廣泛應(yīng)用的——直方圖。如下圖中的第一和第二幅圖(名為Histogram和Histogram, bins shifted)。直方圖的特點(diǎn)是簡單易懂,但缺點(diǎn)在于以下三個方面:

  • 密度函數(shù)是不平滑的;
  • 密度函數(shù)受子區(qū)間(即每個直方體)寬度影響很大,同樣的原始數(shù)據(jù)如果取不同的子區(qū)間范圍,那么展示的結(jié)果可能是完全不同的。如下圖中的前兩個圖,第二個圖只是在第一個圖的基礎(chǔ)上,劃分區(qū)間增加了0.75,但展現(xiàn)出的密度函數(shù)卻看起來差異很大;
  • 直方圖最多只能展示2維數(shù)據(jù),如果維度更多則無法有效展示。

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

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

    上圖為使用Python的sklearn實現(xiàn),算法為KernelDensity。代碼如下:

    #coding:utf-8 import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import KernelDensity np.random.seed(1) N = 20 X = np.concatenate((np.random.normal(0, 1, int(0.3 * N)),np.random.normal(5, 1, int(0.7*N)) ))[:, np.newaxis] #np.newaxis是None的意思 #前半部分的平均值是0,方差是1 #int(0.3 * N)指的是輸出多少數(shù)量符合要求的數(shù)據(jù) #---------------------------以上是創(chuàng)建數(shù)據(jù)集-----------------------------------------------------------------X_plot = np.linspace(-5, 10, 1000)[:, np.newaxis]#創(chuàng)建等差數(shù)列,在-5和10之間取1000個數(shù) bins = np.linspace(-5, 10, 10)#這個的作用是,在相鄰兩個邊界時間的數(shù)據(jù)對應(yīng)的y值都一樣大 print("bins=",bins) fig, ax = plt.subplots(2, 2, sharex=True, sharey=True) fig.subplots_adjust(hspace=0.05, wspace=0.05) # 直方圖 1 'Histogram' print("---------------------------------") ax[0, 0].hist(X[:, 0], bins=bins, fc='#AAAAFF', normed=True)#fc指的應(yīng)該是顏色的編碼 #這里的ax[0,0]的意思是畫在第幾副圖上ax[0, 0].text(-3.5, 0.31, 'Histogram')#-3.5, 0.31的意思是每張圖的logo要畫在什么地方 # 直方圖 2 'Histogram, bins shifted' ax[0, 1].hist(X[:, 0], bins=bins + 0.75, fc='#AAAAFF', normed=True)#histogram的縮寫 ax[0, 1].text(-3.5, 0.31, 'Histogram, bins shifted')#每個子圖內(nèi)畫標(biāo)簽#-----------------------------------------------------------------------------------# 核密度估計 1 'tophat KDE' kde = KernelDensity(kernel='tophat', bandwidth=0.75).fit(X)#什么是帶寬 log_dens = kde.score_samples(X_plot) #所以這里有兩組數(shù)據(jù),X和X_plot,其實是在利用X_plot對X進(jìn)行采樣。 #所以想要復(fù)用這段代碼的時候,改X即可,X_plot不用修改ax[1, 0].fill(X_plot[:, 0], np.exp(log_dens), fc='#AAAAFF')#fill就是用來畫概率密度的 ax[1, 0].text(-3.5, 0.31, 'Tophat Kernel Density')#設(shè)置標(biāo)題的位置 # 核密度估計 2 'Gaussian KDE' kde = KernelDensity(kernel='gaussian', bandwidth=0.75).fit(X) log_dens = kde.score_samples(X_plot)#返回的是點(diǎn)x對應(yīng)概率的log值,要使用exp求指數(shù)還原。 ax[1, 1].fill(X_plot[:, 0], np.exp(log_dens), fc='#AAAAFF')#fill就是用來畫概率密度的 #所以上面一句代碼就非常清晰了,X_plot[:, 0]是具體數(shù)據(jù),np.exp(log_dens)指的是該數(shù)據(jù)對應(yīng)的概率 ax[1, 1].text(-3.5, 0.31, 'Gaussian Kernel Density')#設(shè)置標(biāo)題的位置print("ax.ravel()=",ax.ravel()) print("X.shape[0]=",X.shape[0]) print("X=",X)#這個是為了在每個子圖的下面畫一些沒用的標(biāo)記,不看也罷 for axi in ax.ravel():axi.plot(X[:, 0], np.zeros(X.shape[0])-0.01, '+k')axi.set_xlim(-4, 9)#設(shè)定上下限axi.set_ylim(-0.02, 0.34)##畫圖過程是兩行兩列,這里是遍歷第1列,每個位置的左側(cè)畫一個“xNormalized Density” for axi in ax[:, 0]:print("axi=",axi)axi.set_ylabel('Normalized Density')##畫圖過程是兩行兩列,這里是遍歷第2行,每個位置畫一個“x” for axi in ax[1, :]:axi.set_xlabel('x') plt.show()#ravel函數(shù)的作用如下: # >>> x = np.array([[1, 2, 3], [4, 5, 6]]) # >>> print(np.ravel(x)) # [1 2 3 4 5 6]

    ?

    KernelDensity算法包括kd_tree和ball_tree,默認(rèn)自動選擇。核模型包括gaussian、tophat、epanechnikov、exponential、linear、cosine,默認(rèn)是gaussian模型。可調(diào)整的參數(shù)如下:

  • class?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)

  • ?

    核密度估計的應(yīng)用場景:

    • 股票、金融等風(fēng)險預(yù)測;

    總結(jié)

    以上是生活随笔為你收集整理的核密度估计Kernel Density Estimation(KDE)-代码详细解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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