2014-05-13 7 views
1

나는 SciPy의 stats.gaussian_kde 함수를 사용하여 x,y 점의 데이터 집합에서 커널 밀도 추정 (kde) 함수를 생성합니다.SciPy의 gaussian_kde 함수가 사용하는 대역폭을 얻으려면

import numpy as np 
from scipy import stats 

def random_data(N): 
    # Generate some random data. 
    return np.random.uniform(0., 10., N) 

# Data lists. 
x_data = random_data(100) 
y_data = random_data(100) 

# Obtain the gaussian kernel. 
kernel = stats.gaussian_kde(np.vstack([x_data, y_data])) 

I합니다 (bw_method 키를 통해) 수동으로 대역폭을 설정하고 있지 않다 때문에, 스콧의 규칙을 사용하는 함수 기본값 (함수의 설명을 참조)

이 내 코드의 간단한 MWE이다. 내가 원하는 것은 stats.gaussian_kde 함수에 의해 자동으로 설정된이 대역폭 값을 얻는 것입니다.

print kernel.set_bandwidth() 

를하지만 항상 대신 부동의 None를 반환

내가 사용하려고했습니다.

답변

1

I이있어, 광고는 다음

커널 공분산 행렬을 획득하기 위해 상기 데이터 공분산 행렬을 승산 계수 (kde.factor)을 계산한다 :

kernel.covariance_factor() 

scipy.stats.gaussian_kde.covariance_factor에서 . 기본값은 scotts_factor입니다. 서브 클래스는이 메소드를 덮어 써서 다른 메소드를 제공하거나 kde.set_bandwidth를 호출하여 설정할 수 있습니다.

이 대역폭 값을 사용하는 결과 커널이 기본 대역폭을 사용하여 생성 된 커널과 동일한 지 확인할 수 있습니다. 이 covariance_factor()에 의해 주어진 대역폭을 가진 새로운 커널을 취득 할, 원래 커널 임의의 점에 그 값을 비교하려면 :

kernel = stats.gaussian_kde(np.vstack([x_data, y_data])) 
print kernel([0.5, 1.3]) 

bw = kernel.covariance_factor()  
kernel2 = stats.gaussian_kde(np.vstack([x_data, y_data]), bw_method=bw) 
print kernel2([0.5, 1.3]) 
+0

bw_method 매개 변수는 인자로 사용된다, 그러므로 당신에게 동일을 줄 것이다 요인을 설정 결과. 그러나 이것은 "대역폭"이 아닙니다. 나는 대답을 추가했다 – nivniv

2

짧은 답변 대역폭이에 의해 kernel.covariance_factor()을 곱

사용중인 샘플의 표준.

(이것은 1D 샘플의 경우이며, 기본 경우 Scott의 법칙을 사용하여 계산됩니다.)

예 : 당신이 만들 수있는 새로운 기능을 사용하는 경우

from pylab import plot 
x_grid = np.linspace(-6, 6, 200) 
plot(x_grid, kde.evaluate(x_grid)) 

enter image description here

당신은, 이런 식으로 확인할 수 있습니다

from scipy.stats import gaussian_kde 
sample = np.random.normal(0., 2., 100) 
kde = gaussian_kde(sample) 
f = kde.covariance_factor() 
bw = f * sample.std() 

당신이 얻는 PDF 파일이 있습니다 sklearn을 사용하는 kde :

from sklearn.neighbors import KernelDensity 
def kde_sklearn(x, x_grid, bandwidth): 
    kde_skl = KernelDensity(bandwidth=bandwidth) 
    kde_skl.fit(x[:, np.newaxis]) 
    # score_samples() returns the log-likelihood of the samples 
    log_pdf = kde_skl.score_samples(x_grid[:, np.newaxis]) 
    pdf = np.exp(log_pdf) 
    return pdf 

이제 위에서 동일한 코드를 사용하여 얻을 :

plot(x_grid, kde_sklearn(sample, x_grid, f)) 

enter image description here

plot(x_grid, kde_sklearn(sample, x_grid, bw)) 

enter image description here

+0

나의 대답을 참조 해주세요. – Gabriel

+0

내 업데이트 된 설명보기. 당신이 사용하고있는 것은 대역폭이 아니고, 샘플의 표준과 곱해지는 요인입니다. – nivniv

+0

'scipy.stats.gaussian_kde'의'bw_method'와'sklearn.neighbors '의'bandwidth'를 알고 계십니까? KernelDensity'는 같은 것을 나타내지 않습니까? 이 질문을 참조하십시오 : http://stackoverflow.com/q/21000140/1391441 – Gabriel