2016-06-20 5 views
2

아래의 lineslist는 일련의 라인을 나타냅니다 (일부 화학 스펙트럼의 경우, 가정 해 봅시다). 나는이 선들을 5MHz로 조사하는데 사용 된 레이저의 선폭을 알고있다. 순진하게도, 5의 대역폭을 가진이 선들의 커널 밀도 추정치는 전술 한 레이저를 사용하는 실험에서 생성 될 연속적인 분포를 제공해야합니다.해골의 kdeplot의 대역폭과 혼동

다음 코드 :

import seaborn as sns 
import numpy as np 
import matplotlib.pyplot as plt 
lineslist=np.array([-153.3048645 , -75.71982528, -12.1897835 , -73.94903264, 
    -178.14293936, -123.51339541, -118.11826988, -50.19812838, 
    -43.69282206, -34.21268228]) 
sns.kdeplot(lineslist, shade=True, color="r",bw=5) 
plt.show() 

5 메가 헤르츠보다 훨씬 큰 대역폭을 갖는 가우시안처럼 보이는

Predicted continuous experimental spectrum, based on theoretical lines, bandwidth=5 MHz

를 얻을 수 있습니다.

필자는 어떤 이유로 kdeplot의 대역폭이 플롯 자체와 다른 단위를 가지고 있다고 생각합니다. 가장 높은 선과 가장 낮은 선 사이의 거리는 ~ 170.0 MHz입니다. 나는이 배 대역폭을 재조정 할 필요가 있다고 가정하면 :

import seaborn as sns 
import numpy as np 
import matplotlib.pyplot as plt 
lineslist=np.array([-153.3048645 , -75.71982528, -12.1897835 , -73.94903264, 
    -178.14293936, -123.51339541, -118.11826988, -50.19812838, 
    -43.69282206, -34.21268228]) 
sns.kdeplot(lineslist, shade=True, color="r",bw=5/(np.max(lineslist)-np.min(lineslist))) 
plt.show() 

내가 얻을 : 예상되는 5 MHz의 대역폭을 갖고있는 것 같다 라인 enter image description here

.

그 해결책은 내가 엉덩이에서 가져온 것이고, 나는 해골의 kdeplot 내부에 대해 더 잘 알고있는 사람이 이유에 대해 언급 할 수 있는지 궁금합니다.

감사합니다,

사무엘주의 할

+0

대역폭 매개 변수는 휴리스틱 스 (heuristics)에 의해 선택됩니다. 여기서 휴리스틱 스가 선택됩니다. 이것이 실패하는 경우가 있습니다. 일반적으로 해독으로는 불가능한이 매개 변수를 추정하기 위해 교차 유효성 검사를 사용합니다. Gridsearch 기반 CV는 scikit-learn과 함께 가능하며 최적화 기반 CV는 statsmodels에서 가능합니다. 감사합니다. Sascha. – sascha

+0

. 내가 이해하는 바와 같이, 당신은 스콧과 실버먼의 규칙을 언급하고 있습니다. 다른 옵션은 - 다시, 내가 아는 한 - 위에서 한 것처럼 대역폭을 명시 적으로 설정하는 것입니다. –

답변

3

한 가지 시본 실제로 대역폭 자체를 처리하지 않는다는 것입니다 - 더 - 또는 - 이하로-에 SciPy 또는 중 하나 Statsmodels에 설정을 전달합니다 패키지를 설치했는지 여부에 따라 다릅니다. (Statsmodels를 선호하지만 SciPy로 돌아갈 것입니다.)

다양한 하위 패키지에서이 매개 변수에 대한 설명서는 다소 혼란 스럽지만, 여기서 알 수있는 중요한 문제는 SciPy 대역폭 자체가 아니라 요소 인입니다. 즉,이 요소는 커넬에 사용 된 실제 대역폭을 제공하려는 데이터의 표준 편차로 (효과적으로) 곱해진다.

따라서 SciPy에서 대역폭으로 사용하려는 고정 번호가있는 경우 데이터 표준 편차로 나누어야합니다. 일관되게 여러 데이터 세트를 표시하려는 경우 각 데이터 세트의 표준 편차를 조정해야합니다. 이 조정은 범위를 기준으로 조정 한 것에서 효과적으로 효과를 얻었지만 사용 된 데이터의 범위가 아니라 데이터의 표준 편차가되었습니다.

Statsmodels는 모든 것을 혼란스럽게 만들기 위해 샘플의 표준 편차를 곱한 값이 아닌 스칼라 값이 주어지면 실제 대역폭을 기대합니다. 그래서 당신이 사용하는 백엔드에 따라 시본은 다르게 행동 할 것입니다. Seaborn에게 백엔드에게 사용할 직접적인 방법은 없습니다. 테스트하는 가장 좋은 방법은 import statsmodels을 시도하고 성공했는지 (대역폭을 직접 가져 가는지) 실패하는지 (bandwidth factor 걸림)입니다.

그런데 이러한 결과는 Seaborn 버전 0.7.0에 대해 테스트되었습니다.) 향후 버전에서이 동작이 변경 될 수 있습니다.

+0

위대한 발견 R.M. 실제로 저는 통계 모델을 설치하지 않았고 설치하여이 문제를 해결했습니다. –