2017-04-08 14 views
1

この密度プロットをPython 3で再作成しようとしています:math.stackexchange.com/questions/845424/the-expected-outcome-of-a -randomゲーム・オブ・チェス複数の密度曲線を同じプロットでプロットする:Python 3のサブセットカテゴリの重み付け

End Goal: I need my density plot to look like this

青い曲線下面積はを組み合わせ、赤、緑、紫の曲線と同じであるので、異なる結果(黒勝ち、描画、およびホワイトウィン)は、合計(All)のサブセットです。

これに応じて、私はどのようにしてこれを実現しプロットするのですか? 1000のシミュレーションは、上記のコードは、私が本当に密度曲線の重みを生成する方法を理解する必要が重みなしの密度曲線を、生成

from matplotlib import pyplot as plt 
import seaborn as sns 

black = results_df.loc[results_df['outcome'] == 'Black'] 
white = results_df.loc[results_df['outcome'] == 'White'] 
draw = results_df.loc[results_df['outcome'] == 'Draw'] 
win = results_df.loc[results_df['outcome'] != 'Draw'] 

Total = len(results_df.index) 
Wins = len(win.index) 

PercentBlack = "Black Wins ≈ %s" %('{0:.2%}'.format(len(black.index)/Total)) 
PercentWhite = "White Wins ≈ %s" %('{0:.2%}'.format(len(white.index)/Total)) 
PercentDraw = "Draw ≈ %s" %('{0:.2%}'.format(len(draw.index)/Total)) 
AllTitle = 'Distribution of Moves by All Outcomes (nSample = %s)' %(workers) 

sns.distplot(results_df.moves, hist=False, label = "All") 
sns.distplot(black.moves, hist=False, label=PercentBlack) 
sns.distplot(white.moves, hist=False, label=PercentWhite) 
sns.distplot(draw.moves, hist=False, label=PercentDraw) 
plt.title(AllTitle) 
plt.ylabel('Density') 
plt.xlabel('Number of Moves') 
plt.legend() 
plt.show() 

をpastebin.com/YDVMx2DLた後、ここで

はresults_dfの.csvファイルでありますしたがってなど

density curves, no weights; help

凡例に私のラベルを保存する私はまた、分布を拡大縮小頻度ヒストグラムを、試してみました高さは正しくありますが、私はむしろ4つのカーブを互いに重ね合わせて「きれいに」見えるようにしています... 私はこの周波数プロットが嫌いですこれは現時点での私の修正です。

results_df.moves.hist(alpha=0.4, bins=range(0, 700, 10), label = "All") 
draw.moves.hist(alpha=0.4, bins=range(0, 700, 10), label = PercentDraw) 
white.moves.hist(alpha=0.4, bins=range(0, 700, 10), label = PercentWhite) 
black.moves.hist(alpha=0.4, bins=range(0, 700, 10), label = PercentBlack) 
plt.title(AllTitle) 
plt.ylabel('Frequency') 
plt.xlabel('Number of Moves') 
plt.legend() 
plt.show() 

誰でも正しいサブセット量を有する4つの濃度曲線との最初のプロットを出力するだけでなく、はるかに高く評価される割合を示すカスタム凡例を保存することのpython 3のコードを書くことができる場合。

密度曲線を正しいサブセットの重みでプロットすると、のpython 3コードにも興味があります。各密度曲線の最大点座標はです。反復。

ありがとうございました

答えて

1

注意する必要があります。あなたが作ったプロットは正しいです。示されたすべての曲線は、基礎となる分布の確率密度関数である。

あなたが持っているプロットでは、 "All"と表示されたカーブだけが確率密度関数です。他の曲線はそうではありません。

いずれの場合でも、目的のプロットに示すようにスケーリングしたい場合は、カーネル密度の見積もりを自分で計算する必要があります。これはscipy.stats.gaussial_kde()を使用して行うことができます。

目的のプロットを再現するために、2つのオプションがあります。

関連するすべてのケースのkdeを計算し、サンプル数でスケーリングします。

import numpy as np; np.random.seed(0) 
import matplotlib.pyplot as plt 
import scipy.stats 

a = np.random.gumbel(80, 25, 1000).astype(int) 
b = np.random.gumbel(200, 46, 4000).astype(int) 

kdea = scipy.stats.gaussian_kde(a) 
kdeb = scipy.stats.gaussian_kde(b) 

both = np.hstack((a,b)) 
kdeboth = scipy.stats.gaussian_kde(both) 
grid = np.arange(500) 

#weighted kde curves 
wa = kdea(grid)*(len(a)/float(len(both))) 
wb = kdeb(grid)*(len(b)/float(len(both))) 

print "a.sum ", wa.sum() 
print "b.sum ", wb.sum() 
print "total.sum ", kdeb(grid).sum() 

fig, ax = plt.subplots() 
ax.plot(grid, wa, lw=1, label = "weighted a") 
ax.plot(grid, wb, lw=1, label = "weighted b") 
ax.plot(grid, kdeboth(grid), color="crimson", lw=2, label = "pdf") 

plt.legend() 
plt.show() 

enter image description here

すべての個々のケースのためにKDEを計算し、合計を得るために、それらの和を正規化します。

import numpy as np; np.random.seed(0) 
import matplotlib.pyplot as plt 
import scipy.stats 

a = np.random.gumbel(80, 25, 1000).astype(int) 
b = np.random.gumbel(200, 46, 4000).astype(int) 

kdea = scipy.stats.gaussian_kde(a) 
kdeb = scipy.stats.gaussian_kde(b) 

grid = np.arange(500) 


#weighted kde curves 
wa = kdea(grid)*(len(a)/float(len(a)+len(b))) 
wb = kdeb(grid)*(len(b)/float(len(a)+len(b))) 

total = wa+wb 

fig, ax = plt.subplots(figsize=(5,3)) 
ax.plot(grid, wa, lw=1, label = "weighted a") 
ax.plot(grid, wb, lw=1, label = "weighted b") 
ax.plot(grid, total, color="crimson", lw=2, label = "pdf") 

plt.legend() 
plt.show() 

enter image description here

関連する問題