2016-06-20 4 views
2

lineslist, ниже, представляет собой набор линий (для некоторого химического спектра, скажем), в МГц. Я знаю, что ширина линии лазера, используемая для измерения этих линий, составляет 5 МГц. Итак, наивно, оценка плотности ядра этих линий с шириной полосы 5 должна дать мне непрерывное распределение, которое будет получено в эксперименте с использованием вышеупомянутого лазера.Путаница с полосой пропускания на kdeplot seaborn

Следующий код:

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() 

дает

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

который выглядит как гауссова с шириной полосы гораздо больше, чем 5 МГц.

Я предполагаю, что по какой-то причине пропускная способность kdeplot имеет разные единицы, чем сам сюжет. Разделение между самой высокой и нижней линиями составляет ~ 170,0 МГц. Предположив, что мне нужно масштабировать пропускную способность этого фактора:

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() 

я получаю: enter image description here

С линиями, которые, как представляется, имеют ожидаемую полосу пропускания 5 МГц.

Как денди, как это решение, я вытащил его из своей задницы, и мне любопытно, может ли кто-нибудь, знакомый с внутренними силами kdeplot морского судна, прокомментировать, почему это так.

Спасибо,

Samuel

+0

Параметры полосы пропускания выбираются эвристикой, где вы можете выбрать между двумя разными. Бывают случаи, когда это терпит неудачу. Обычно для оценки этого параметра используется перекрестная валидация, что невозможно с помощью морского судна. Резюме на основе Gridsearch возможно с помощью scikit-learn, основанного на оптимизации CV можно с помощью statsmodels. – sascha

+0

Спасибо Sascha. Насколько я понимаю, вы имеете в виду правила Скотта и Сильвермана. Другой вариант - опять же, насколько я понимаю, - явно устанавливает пропускную способность, как я уже делал. –

ответ

3

Одна вещь, чтобы отметить, что Seaborn фактически не обрабатывает ширина полосы пропускания сама - она ​​проходит настройку на более или менее, как-это либо SciPy или в Statsmodels пакетов, в зависимости от того, что вы установили. (Он предпочитает Statsmodels, но вернется к SciPy.)

Документация для этого параметра в различных подпакетах немного запутанна, но из того, что я могу сказать, ключевая проблема здесь заключается в том, что настройка для SciPy является полосой частот фактором, а не самой полосой пропускания. То есть этот коэффициент (эффективно) умножается на стандартное отклонение данных, которые вы рисуете, чтобы дать вам фактическую пропускную способность, используемую в ядрах.

Так что с помощью SciPy, если у вас есть фиксированное число, которое вы хотите использовать в качестве полосы пропускания, вам необходимо разделить стандартное отклонение данных. И если вы пытаетесь построить несколько наборов данных последовательно, вам нужно настроить стандартное отклонение каждого набора данных. Эта настройка эффективно влияет на то, что вы сделали, масштабируясь по диапазону, - но опять же, это не диапазон данных, которые используют номер, а стандартное отклонение данных.

Чтобы сделать вещи тем более запутанными, Statsmodels ожидает истинную пропускную способность при задании скалярного значения, а не коэффициента, умноженного на стандартное отклонение выборки. Поэтому, в зависимости от того, какой бэкэнд вы используете, Seaborn будет вести себя по-другому. Нет прямого способа сказать Seaborn, какой бэкэнд использовать - лучший способ тестирования - это, вероятно, попытка import statsmodels, и если это удастся (требуется пропускная способность напрямую) или сбой (требуется полоса пропускания фактор).

Кстати, эти результаты были протестированы против версии Seaborn 0.7.0 - я ожидаю (надеюсь?), что версии в будущем могут изменить это поведение.

+0

Отличная находка R.M. В самом деле, я не установил statsmodels, и установка его устраняет эту проблему. –

Смежные вопросы