合計行数を数えたい場合は、@BenAllisonの答えが良い方法です。ベイズとそれ以前のことについておっしゃっていたので、その方向に答えを追加して、さまざまなグループの割合を計算します。(あなたの質問に対する私のコメントを参照してください。あなたが合計のアイデアを持っていて、あなたがしたいのであればgroupby
、異なるグループのパーセンテージを推定することはより理にかなっていると思います)。
再帰的なベイジアン更新:
まず、グループが2つしかないことを前提としています(複数のグループで機能するように拡張できます。これについては、後の説明を参照してくださいgroup1
)group2
。
m
group1
処理した最初のn
行(行)のうちのsについては、イベントをとして示しM(m,n)
ます。明らかに、n-m
group2
sが表示されるのは、それらが2つの可能なグループのみであると想定しているためです。したがって、 ( )M(m,n)
のパーセンテージが与えられた場合のイベントの条件付き確率は、試行を伴う二項分布によって与えられます。私たちはベイジアンな方法で推定しようとしています。group1
s
n
s
二項分布の共役事前分布はベータ分布です。したがって、簡単にするために、(0,1)の一様分布でBeta(1,1)
ある事前分布として選択します(もちろん、ここでalpha
とに対して独自のパラメーターを選択できます)。beta
そのため、このベータ分布については、alpha=1
およびbeta=1
。
二項+ベータ事前分布の再帰的更新式は次のとおりです。
if group == 'group1':
alpha = alpha + 1
else:
beta = beta + 1
後部s
も実際にはベータ分布です。
s^(m+alpha-1) (1-s)^(n-m+beta-1)
p(s| M(m,n)) = ----------------------------------- = Beta (m+alpha, n-m+beta)
B(m+alpha, n-m+beta)
ベータ関数B
はどこにありますか。推定結果を報告するには、分布の平均と分散を信頼できます。ここで、Beta
mean = alpha/(alpha+beta)
var = alpha*beta/((alpha+beta)**2 * (alpha+beta+1))
Pythonコード:groupby.py
stdin
したがって、データを処理してパーセンテージを推定するPythonの数行は、次のgroup1
ようになります。
import sys
alpha = 1.
beta = 1.
for line in sys.stdin:
data = line.strip()
if data == 'group1':
alpha += 1.
elif data == 'group2':
beta += 1.
else:
continue
mean = alpha/(alpha+beta)
var = alpha*beta/((alpha+beta)**2 * (alpha+beta+1))
print 'mean = %.3f, var = %.3f' % (mean, var)
サンプルデータ
コードに数行のデータをフィードします。
group1
group1
group1
group1
group2
group2
group2
group1
group1
group1
group2
group1
group1
group1
group2
おおよその見積もり結果
そして、これが私が結果として得たものです:
mean = 0.667, var = 0.056
mean = 0.750, var = 0.037
mean = 0.800, var = 0.027
mean = 0.833, var = 0.020
mean = 0.714, var = 0.026
mean = 0.625, var = 0.026
mean = 0.556, var = 0.025
mean = 0.600, var = 0.022
mean = 0.636, var = 0.019
mean = 0.667, var = 0.017
mean = 0.615, var = 0.017
mean = 0.643, var = 0.015
mean = 0.667, var = 0.014
mean = 0.688, var = 0.013
mean = 0.647, var = 0.013
結果は、group1が15行目までに64.7%パーセント処理されると推定されることを示しています(以前のbeta(1,1)に基づく)。観測点が増えるため、分散が縮小し続けることに気付くかもしれません。
複数のグループ
ここで、3つ以上のグループがある場合は、下線分布を二項分布から多項分布に変更するだけで、対応する共役事前分布はディリクレになります。他のすべては、同様の変更を加えるだけです。
その他の注意事項
おおよその見積もりを3〜4秒でお願いします。この場合、データの一部をサンプリングし、出力を上記のスクリプトにフィードするだけです。
head -n100000 YOURDATA.txt | python groupby.py
それでおしまい。それが役に立てば幸い。