2016-06-20 33 views
2

下の行リストは、一連の線を表しています。私はこれらの線を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() 

が5MHzよりもはるかに大きな帯域幅を持つガウスのように見えます

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

が得られます。

私は何らかの理由で、kdeplotの帯域幅がプロット自体と異なることを推測しています。最高線と最低線との間隔は約170.0MHzである。私はこの要因により、帯域幅を再スケールする必要があると仮定すると:

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

期待5MHzの帯域幅を持っているように見える線で。

その解決策は、私はお尻から引っ張ってきたので、なぜシーボーンのkdeplot内部に詳しいことがある人がこの理由をコメントできるかどうか不思議です。

おかげで、

サミュエル注意する

+0

帯域幅のパラメータは、ヒューリスティックによって選択されます。ここでは、2つの異なるパラメータを選択できます。これが失敗する場合があります。通常、このパラメータを推定するために相互検証を使用しますが、これは海軍では不可能です。グリッドサーチベースのCVは、scikit-learnで可能で、最適化ベースのCVは、統計モデルで可能です。 – sascha

+0

ありがとうございました。私が理解するように、あなたはスコットとシルバーマンのルールを指しています。もう1つのオプションは、私が理解しているように、上記のように帯域幅を明示的に設定しています。 –

答えて

3

一つSeabornが実際の帯域幅自体を処理しないということである - それは、多かれ少なかれそのままにscipyのダウンロードまたはいずれかStatsmodelsに設定を渡しますあなたがインストールしたものに依存します。 (Statsmodelsを好むが、SciPyに落ちるだろう)

さまざまなサブパッケージのこのパラメータのドキュメントはちょっと混乱していますが、ここでの重要な点は、SciPyの設定帯域幅自体ではなく、ファクタです。つまり、この係数は、カーネルで実際に使用されている帯域幅を与えるためにプロットしているデータの標準偏差で(効果的に)乗算されます。

したがって、SciPyでは、固定の番号を帯域幅として使用する場合、データ標準偏差で分割する必要があります。また、複数のデータセットを一貫してプロットしようとする場合は、各データセットの標準偏差を調整する必要があります。この調整は、範囲によるスケーリングで効果的でしたが、データの使用範囲ではなくデータの標準偏差です。

Statsmodelsは事をもっと混乱させるために、サンプルの標準偏差を掛け合わせた係数ではなく、スカラー値が与えられたときに真の帯域幅を期待しています。したがって、使用しているバックエンドに応じて、Seabornは異なる動作をします。 Seabornにバックエンドにどのような使用方法を指示する直接的な方法はありません。テストする最良の方法はおそらくimport statsmodelsです。成功すれば(帯域幅を直接取るか)失敗するかを確認します(帯域幅ファクタ)。

ところで、これらの結果は、Seabornバージョン0.7.0に対してテストされました。)将来のバージョンではこの動作が変更される可能性があります。

+0

グレート検索R.M.確かに、私は統計モデルをインストールしていないので、この問題を修正してインストールしました。 –