ベイズ階層モデルソリューションを提供します。手作業で設定する必要のあるパラメータがいくつかありますが、以下のシミュレーションが示すように、これらのパラメータに関しては非常に堅牢です。また、単語リストのスコアリングシステムだけでなく、単語を入力したユーザーの推定分類も処理できます。扱いは少し技術的かもしれませんが、最終的には、リスト内の単語数、データベース内で完全に一致する単語数、および3つの数値の関数としてスコアを計算するルーチンがあります。部分的に一致するものの数(のようにyyyy
)。ルーチンはRで実装されていますが、使用したことがない場合は、インタープリターをダウンロードし、コードをコピーしてコンソールに貼り付けるだけで、ここに結果が表示されます。
ところで、英語は私の母国語ではないので、我慢してください... :-)
1.モデル仕様:
ユーザーには、I、II、IIIという3つのクラスがあります。各単語リストは1人のユーザーによって生成され、ユーザーはユーザーの世界からランダムに抽出されると想定しています。この宇宙は70%がクラスI、25%がクラスII、5%がクラスIIIであると言います。もちろん、これらの番号は変更できます。これまでにあります
確率[ユーザー=I]= 70%
確率[ユーザー=II]= 25%
確率[ユーザー=III]= 5%
ユーザーが与えられた場合、条件付き独立を想定します。つまり、ユーザーは前の単語を参照して、有効な単語と無効な単語のどちらを入力するかを決定しません。
ユーザーIは有効な単語のみを与える傾向があり、ユーザーIIは無効な単語のみを与える傾向があり、ユーザーIIIは混合されています。だから私たちは設定しました
Prob [Word = OK | User = I] = 99%
Prob [Word = OK | ユーザー=II]= 0.001%
Prob [Word = OK | ユーザー=III]= 50%
ユーザーのクラスを考えると、単語が無効である確率は補完的です。タイプライターの前にいるサルでさえ、最終的に有効な単語を入力するため、クラスIIユーザーが有効な単語を入力する確率は非常に小さいですがゼロではないことに注意してください。
モデル仕様の最後のステップはデータベースに関するものです。単語ごとに、クエリの結果は、完全一致、部分一致(のようにyyyy
)、または一致なしの3つであると想定しています。確率的には、
確率[一致| 有効]=98%(すべての有効な単語が見つかるわけではありません)
確率[部分的| 有効]=0.2%(まれなイベント)
確率[一致| INvalid] = 0(データベースは不完全である可能性がありますが、無効な単語はありません)
確率[部分的| 無効]=0.1%(まれなイベント)
単語が見つからない確率は補完的であるため、設定する必要はありません。以上で、モデルが設定されました。
2.表記と目的
離散確率変数Uがあり、{1、2、3}の値と、それぞれサイズn(=単語の数)の2つの離散確率ベクトルWとFがあります。ここで、W_iは、単語が有効な場合は1、2は単語が無効な場合、F_iは、単語がデータベースで見つかった場合は1、部分一致の場合は2、見つからなかった場合は3です。
ベクトルFのみが観測可能であり、他は潜在的です。ベイズの定理とモデル仕様で設定した分布を使用して、次のように計算できます。
(a)Prob [User = I | F]、
つまり、観測されたマッチングが与えられた場合に、ユーザーがクラスIに入る事後確率。と
(b)確率[W=すべて有効| F]、
つまり、観測された一致が与えられた場合に、すべての単語が有効である事後確率。
目的に応じて、スコアリングソリューションとしていずれかを使用できます。たとえば、実際のユーザーとコンピュータプログラムを区別することに関心がある場合は、(a)を使用できます。単語リストが有効であることにのみ関心がある場合は、(b)を使用する必要があります。
次のセクションで理論を簡単に説明しようとしますが、これはベイズ階層モデルのコンテキストでの通常の設定です。参照はGelman(2004)、「BayesianDataAnalysis」です。
必要に応じて、コードを使用してセクション4にジャンプできます。
3.数学
この文脈ではいつものように、表記法を少し乱用して、
Prob [X = x | Y = y]の場合はp(x | y)、Prob [X = x、Y = y]の場合はp(x、y)。
目標(a)は、u = 1の場合にp(u | f)を計算することです。ベイズの定理の使用:
p(u | f)= p(u、f)/ p(f)= p(f | u)p(u)/ p(f)。
p(u)が与えられます。p(f | u)は次から取得されます。
p(f | u)= \ prod_ {i = 1} ^ {n} \ sum_ {w_i = 1} ^ {2}(p(f_i | w_i)p(w_i | u))
p(f | u)= \ prod_ {i = 1} ^ {n} p(f_i | u)
= p(f_i = 1 | u)^(m)p(f_i = 2 | u)^(p)p(f_i = 3)^(nmp)
ここで、m =一致の数、p=部分一致の数です。
p(f)は次のように計算されます。
\ sum_ {u = 1} ^ {3} p(f | u)p(u)
これらはすべて直接計算できます。
目標(b)は次の式で与えられます
p(w | f)= p(f | w)* p(w)/ p(f)
どこ
p(f | w)= \ prod_ {i = 1} ^ {n} p(f_i | w_i)
p(f_i | w_i)はモデル仕様で指定されています。
p(f)は上で計算されたので、必要なのは
p(w)= \ sum_ {u = 1} ^ {3} p(w | u)p(u)
どこ
p(w | u)= \ prod_ {i = 1} ^ {n} p(w_i | u)
したがって、すべてが実装の準備が整います。
4.コード
コードはRスクリプトとして記述され、定数は上記で説明した内容に従って最初に設定され、出力は関数によって提供されます。
(a)p.u_f(u、n、m、p)
と
(b)p.wOK_f(n、m、p)
入力が与えられた場合、オプション(a)および(b)の確率を計算します。
u =目的のユーザークラス(u = 1に設定)
n=単語
の数m=一致の
数p=部分一致の数
コード自体:
### Constants:
# User:
# Prob[U=1], Prob[U=2], Prob[U=3]
Prob_user = c(0.70, 0.25, 0.05)
# Words:
# Prob[Wi=OK|U=1,2,3]
Prob_OK = c(0.99, 0.001, 0.5)
Prob_NotOK = 1 - Prob_OK
# Database:
# Prob[Fi=match|Wi=OK], Prob[Fi=match|Wi=NotOK]:
Prob_match = c(0.98, 0)
# Prob[Fi=partial|Wi=OK], Prob[Fi=partial|Wi=NotOK]:
Prob_partial = c(0.002, 0.001)
# Prob[Fi=NOmatch|Wi=OK], Prob[Fi=NOmatch|Wi=NotOK]:
Prob_NOmatch = 1 - Prob_match - Prob_partial
###### First Goal: Probability of being a user type I, given the numbers of matchings (m) and partial matchings (p).
# Prob[Fi=fi|U=u]
#
p.fi_u <- function(fi, u)
{
unname(rbind(Prob_match, Prob_partial, Prob_NOmatch) %*% rbind(Prob_OK, Prob_NotOK))[fi,u]
}
# Prob[F=f|U=u]
#
p.f_u <- function(n, m, p, u)
{
exp( log(p.fi_u(1, u))*m + log(p.fi_u(2, u))*p + log(p.fi_u(3, u))*(n-m-p) )
}
# Prob[F=f]
#
p.f <- function(n, m, p)
{
p.f_u(n, m, p, 1)*Prob_user[1] + p.f_u(n, m, p, 2)*Prob_user[2] + p.f_u(n, m, p, 3)*Prob_user[3]
}
# Prob[U=u|F=f]
#
p.u_f <- function(u, n, m, p)
{
p.f_u(n, m, p, u) * Prob_user[u] / p.f(n, m, p)
}
# Probability user type I for n=1,...,5:
for(n in 1:5) for(m in 0:n) for(p in 0:(n-m))
{
cat("n =", n, "| m =", m, "| p =", p, "| Prob type I =", p.u_f(1, n, m, p), "\n")
}
##################################################################################################
# Second Goal: Probability all words OK given matchings/partial matchings.
p.f_wOK <- function(n, m, p)
{
exp( log(Prob_match[1])*m + log(Prob_partial[1])*p + log(Prob_NOmatch[1])*(n-m-p) )
}
p.wOK <- function(n)
{
sum(exp( log(Prob_OK)*n + log(Prob_user) ))
}
p.wOK_f <- function(n, m, p)
{
p.f_wOK(n, m, p)*p.wOK(n)/p.f(n, m, p)
}
# Probability all words ok for n=1,...,5:
for(n in 1:5) for(m in 0:n) for(p in 0:(n-m))
{
cat("n =", n, "| m =", m, "| p =", p, "| Prob all OK =", p.wOK_f(n, m, p), "\n")
}
5.結果
これは、n = 1、...、5の結果、およびmとpのすべての可能性です。たとえば、3つの単語、1つの一致、1つの部分一致、および1つが見つからない場合、クラスIユーザーであると66.5%確信できます。同じ状況で、すべての単語が有効であるとスコアを42.8%と見なすことができます。
オプション(a)は、すべての一致の場合に100%のスコアを与えるわけではありませんが、オプション(b)は100%のスコアを与えることに注意してください。データベースに無効な単語がないと仮定したため、これは予想されます。したがって、それらがすべて見つかった場合、それらはすべて有効です。OTOH、クラスIIまたはIIIのユーザーがすべての有効な単語を入力できる可能性はわずかですが、この可能性はnが増加するにつれて急速に減少します。
(a)
n = 1 | m = 0 | p = 0 | Prob type I = 0.06612505
n = 1 | m = 0 | p = 1 | Prob type I = 0.8107086
n = 1 | m = 1 | p = 0 | Prob type I = 0.9648451
n = 2 | m = 0 | p = 0 | Prob type I = 0.002062543
n = 2 | m = 0 | p = 1 | Prob type I = 0.1186027
n = 2 | m = 0 | p = 2 | Prob type I = 0.884213
n = 2 | m = 1 | p = 0 | Prob type I = 0.597882
n = 2 | m = 1 | p = 1 | Prob type I = 0.9733557
n = 2 | m = 2 | p = 0 | Prob type I = 0.982106
n = 3 | m = 0 | p = 0 | Prob type I = 5.901733e-05
n = 3 | m = 0 | p = 1 | Prob type I = 0.003994149
n = 3 | m = 0 | p = 2 | Prob type I = 0.200601
n = 3 | m = 0 | p = 3 | Prob type I = 0.9293284
n = 3 | m = 1 | p = 0 | Prob type I = 0.07393334
n = 3 | m = 1 | p = 1 | Prob type I = 0.665019
n = 3 | m = 1 | p = 2 | Prob type I = 0.9798274
n = 3 | m = 2 | p = 0 | Prob type I = 0.7500993
n = 3 | m = 2 | p = 1 | Prob type I = 0.9864524
n = 3 | m = 3 | p = 0 | Prob type I = 0.990882
n = 4 | m = 0 | p = 0 | Prob type I = 1.66568e-06
n = 4 | m = 0 | p = 1 | Prob type I = 0.0001158324
n = 4 | m = 0 | p = 2 | Prob type I = 0.007636577
n = 4 | m = 0 | p = 3 | Prob type I = 0.3134207
n = 4 | m = 0 | p = 4 | Prob type I = 0.9560934
n = 4 | m = 1 | p = 0 | Prob type I = 0.004198015
n = 4 | m = 1 | p = 1 | Prob type I = 0.09685249
n = 4 | m = 1 | p = 2 | Prob type I = 0.7256616
n = 4 | m = 1 | p = 3 | Prob type I = 0.9847408
n = 4 | m = 2 | p = 0 | Prob type I = 0.1410053
n = 4 | m = 2 | p = 1 | Prob type I = 0.7992839
n = 4 | m = 2 | p = 2 | Prob type I = 0.9897541
n = 4 | m = 3 | p = 0 | Prob type I = 0.855978
n = 4 | m = 3 | p = 1 | Prob type I = 0.9931117
n = 4 | m = 4 | p = 0 | Prob type I = 0.9953741
n = 5 | m = 0 | p = 0 | Prob type I = 4.671933e-08
n = 5 | m = 0 | p = 1 | Prob type I = 3.289577e-06
n = 5 | m = 0 | p = 2 | Prob type I = 0.0002259559
n = 5 | m = 0 | p = 3 | Prob type I = 0.01433312
n = 5 | m = 0 | p = 4 | Prob type I = 0.4459982
n = 5 | m = 0 | p = 5 | Prob type I = 0.9719289
n = 5 | m = 1 | p = 0 | Prob type I = 0.0002158996
n = 5 | m = 1 | p = 1 | Prob type I = 0.005694145
n = 5 | m = 1 | p = 2 | Prob type I = 0.1254661
n = 5 | m = 1 | p = 3 | Prob type I = 0.7787294
n = 5 | m = 1 | p = 4 | Prob type I = 0.988466
n = 5 | m = 2 | p = 0 | Prob type I = 0.00889696
n = 5 | m = 2 | p = 1 | Prob type I = 0.1788336
n = 5 | m = 2 | p = 2 | Prob type I = 0.8408416
n = 5 | m = 2 | p = 3 | Prob type I = 0.9922575
n = 5 | m = 3 | p = 0 | Prob type I = 0.2453087
n = 5 | m = 3 | p = 1 | Prob type I = 0.8874493
n = 5 | m = 3 | p = 2 | Prob type I = 0.994799
n = 5 | m = 4 | p = 0 | Prob type I = 0.9216786
n = 5 | m = 4 | p = 1 | Prob type I = 0.9965092
n = 5 | m = 5 | p = 0 | Prob type I = 0.9976583
(b)
n = 1 | m = 0 | p = 0 | Prob all OK = 0.04391523
n = 1 | m = 0 | p = 1 | Prob all OK = 0.836025
n = 1 | m = 1 | p = 0 | Prob all OK = 1
n = 2 | m = 0 | p = 0 | Prob all OK = 0.0008622994
n = 2 | m = 0 | p = 1 | Prob all OK = 0.07699368
n = 2 | m = 0 | p = 2 | Prob all OK = 0.8912977
n = 2 | m = 1 | p = 0 | Prob all OK = 0.3900892
n = 2 | m = 1 | p = 1 | Prob all OK = 0.9861099
n = 2 | m = 2 | p = 0 | Prob all OK = 1
n = 3 | m = 0 | p = 0 | Prob all OK = 1.567032e-05
n = 3 | m = 0 | p = 1 | Prob all OK = 0.001646751
n = 3 | m = 0 | p = 2 | Prob all OK = 0.1284228
n = 3 | m = 0 | p = 3 | Prob all OK = 0.923812
n = 3 | m = 1 | p = 0 | Prob all OK = 0.03063598
n = 3 | m = 1 | p = 1 | Prob all OK = 0.4278888
n = 3 | m = 1 | p = 2 | Prob all OK = 0.9789305
n = 3 | m = 2 | p = 0 | Prob all OK = 0.485069
n = 3 | m = 2 | p = 1 | Prob all OK = 0.990527
n = 3 | m = 3 | p = 0 | Prob all OK = 1
n = 4 | m = 0 | p = 0 | Prob all OK = 2.821188e-07
n = 4 | m = 0 | p = 1 | Prob all OK = 3.046322e-05
n = 4 | m = 0 | p = 2 | Prob all OK = 0.003118531
n = 4 | m = 0 | p = 3 | Prob all OK = 0.1987396
n = 4 | m = 0 | p = 4 | Prob all OK = 0.9413746
n = 4 | m = 1 | p = 0 | Prob all OK = 0.001109629
n = 4 | m = 1 | p = 1 | Prob all OK = 0.03975118
n = 4 | m = 1 | p = 2 | Prob all OK = 0.4624648
n = 4 | m = 1 | p = 3 | Prob all OK = 0.9744778
n = 4 | m = 2 | p = 0 | Prob all OK = 0.05816511
n = 4 | m = 2 | p = 1 | Prob all OK = 0.5119571
n = 4 | m = 2 | p = 2 | Prob all OK = 0.9843855
n = 4 | m = 3 | p = 0 | Prob all OK = 0.5510398
n = 4 | m = 3 | p = 1 | Prob all OK = 0.9927134
n = 4 | m = 4 | p = 0 | Prob all OK = 1
n = 5 | m = 0 | p = 0 | Prob all OK = 5.05881e-09
n = 5 | m = 0 | p = 1 | Prob all OK = 5.530918e-07
n = 5 | m = 0 | p = 2 | Prob all OK = 5.899106e-05
n = 5 | m = 0 | p = 3 | Prob all OK = 0.005810434
n = 5 | m = 0 | p = 4 | Prob all OK = 0.2807414
n = 5 | m = 0 | p = 5 | Prob all OK = 0.9499773
n = 5 | m = 1 | p = 0 | Prob all OK = 3.648353e-05
n = 5 | m = 1 | p = 1 | Prob all OK = 0.001494098
n = 5 | m = 1 | p = 2 | Prob all OK = 0.051119
n = 5 | m = 1 | p = 3 | Prob all OK = 0.4926606
n = 5 | m = 1 | p = 4 | Prob all OK = 0.9710204
n = 5 | m = 2 | p = 0 | Prob all OK = 0.002346281
n = 5 | m = 2 | p = 1 | Prob all OK = 0.07323064
n = 5 | m = 2 | p = 2 | Prob all OK = 0.5346423
n = 5 | m = 2 | p = 3 | Prob all OK = 0.9796679
n = 5 | m = 3 | p = 0 | Prob all OK = 0.1009589
n = 5 | m = 3 | p = 1 | Prob all OK = 0.5671273
n = 5 | m = 3 | p = 2 | Prob all OK = 0.9871377
n = 5 | m = 4 | p = 0 | Prob all OK = 0.5919764
n = 5 | m = 4 | p = 1 | Prob all OK = 0.9938288
n = 5 | m = 5 | p = 0 | Prob all OK = 1