10

私は最近、Expectation Maximization を独学しており、その過程でいくつかの簡単な例を自分でつかみました。

http://cs.dartmouth.edu/~cs104/CS104_11.04.22.pdf 0、1、2 の 3 枚のコインがあり、投げると P0、P1、P2 の確率で頭に着地します。コイン0をトスし、結果が表の場合、コイン1を3回トスし、コイン2を3回トスします。コイン 1 と 2 によって生成された観測データは次のようになります: HHH、TTT、HHH、TTT、HHH。隠しデータはコイン 0 の結果です。P0、P1、および P2 を推定します。

http://ai.stanford.edu/~chuongdo/papers/em_tutorial.pdf 2 枚のコイン A と B があり、PA と PB はトスしたときに表に着地する確率です。ラウンドごとにランダムにコインを 1 枚選び、10 回投げて結果を記録します。観測データは、これら 2 つのコインによって提供されるトス結果です。ただし、特定のラウンドでどのコインが選択されたかはわかりません。PA と PB を推定します。

計算はできますが、元の EM 理論に解決方法を関連付けることはできません。具体的には、両方の例の M-Step の間、それらがどのように何かを最大化しているのかわかりません。パラメータを再計算しているようで、どういうわけか、新しいパラメータは古いパラメータよりも優れています。さらに、元の理論の E ステップは言うまでもなく、2 つの E ステップは互いに似ていません。

では、これらの例はどのように機能するのでしょうか?

4

4 に答える 4

8

2 番目の PDF はダウンロードされませんが、ウィキペディアのページhttp://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithmにもアクセスして、詳細を確認してください。http://melodi.ee.washington.edu/people/bilmes/mypapers/em.pdf (穏やかな紹介であると主張している) も一見の価値があるかもしれません。

EM アルゴリズムの要点は、観測されたデータの可能性を最大化するパラメーターを見つけることです。これは、最初の PDF の 8 ページにある唯一の箇条書きであり、大文字の Theta 下付き文字 ML の方程式です。

EM アルゴリズムは、知っていれば問題を簡単にする隠れたデータがある場合に役立ちます。3 枚のコインの例では、これはコイン 0 を投げた結果です。その結果を知っていれば、(もちろん) コイン 0 が表になる確率を見積もることができます。また、次のステージでコイン 1 またはコイン 2 が 3 回投げられたかどうかもわかります。これにより、コイン 1 とコイン 2 が表になる確率を推定できます。これらの見積もりは、観察されたデータの可能性を最大化したと言うことで正当化されます。これには、与えられた結果だけでなく、あなたではない隠されたデータ、つまりコイン 0 の結果も含まれます。

EM アルゴリズムでは、隠れたデータはわかりませんが、その確率分布を書き留めることができる確率推定値が得られると言います。隠れたデータの可能な値ごとに、隠れたデータを含むデータの対数尤度を最適化するパラメーター値を見つけることができます。これは、ほとんどの場合、ある種の加重平均を計算することを意味します (EM でない場合)。ステップが難しすぎて実用的でない場合があります)。

EM アルゴリズムが要求することは、考えられるすべての隠れデータ値によって与えられる対数尤度の加重和を最大化するパラメーターを見つけることです。ここで、重みは、次のパラメーターを使用して、観測値が与えられた関連する隠れデータの確率によって与えられます。 EM ステップの開始。これは、ウィキペディアのアルゴリズムを含むほとんどすべての人が Q 関数と呼んでいるものです。ウィキペディアの記事で与えられた EM アルゴリズムの背後にある証明は、Q 関数を増加させるようにパラメーターを変更すると (目的を達成するための手段にすぎません)、パラメーターを変更して Q 関数を増加させることになると述べています。観察されたデータの可能性(あなたが気にしている)。実際には、隠れたデータを知っている場合に行うことのバリエーションを使用して、Q 関数を最大化できることがわかります。

あなたの例では、各コインによって生成された表と裏の数を合計することを意味します。PDF では、P(Y=H|X=) = 0.6967 となります。これは、Y=H の場合に重み 0.6967 を使用することを意味します。つまり、Y=H のカウントを 0.6967 ずつ増やし、コイン 1 の X=H のカウントを 3*0.6967 ずつ増やし、Y のカウントを増やします。 =T を 0.3033 増やし、コイン 2 の X=H のカウントを 3*0.3033 増やします。標準ケースで A/(A+B) がコイン確率の最大可能性である理由の詳細な正当化がある場合は、それを、この加重更新スキームが Q 関数を最大化する理由の正当化に変える準備ができている必要があります。

最後に、観測されたデータ (最大化しているもの) の対数尤度は、非常に有用なチェックを提供します。少なくとも丸め誤差が発生するほど収束に近づくまで、すべての EM ステップで増加する必要があります。劇的に減少する場合は、プログラムまたは数学にバグがあります。

于 2013-03-20T06:25:28.603 に答える
6

運が良ければ、私も最近この素材に苦労しています。これが私がそれを考えるようになった方法です:

混合モデルの問題の解法として使用できる分類最大化アルゴリズムと呼ばれる、関連しているが異なるアルゴリズムを考えてみましょう。混合モデル問題とは、N 個の異なるプロセスのいずれかによって生成される可能性のある一連のデータがあり、その一般的な形式 (たとえば、ガウス) はわかっているが、プロセスのパラメーター (たとえば、平均および/または分散)、およびプロセスの相対的な可能性さえ知らない場合があります。(通常、私たちは少なくともプロセスの数を知っています。それがなければ、いわゆる「ノンパラメトリック」の領域に入ります。) ある意味では、各データを生成するプロセスは「欠落した」または「隠された」データです。問題の。

ここで、この関連する分類最大化アルゴリズムが行うことは、プロセス パラメーターの任意の推測から開始することです。各データ ポイントは、これらのパラメーター プロセスのそれぞれに従って評価され、一連の確率が生成されます。つまり、データ ポイントが最初のプロセス、2 番目のプロセスなどによって生成された確率であり、最後の N 番目のプロセスまでです。次に、各データ ポイントは、最も可能性の高いプロセスに従って分類されます。

この時点で、データは N 個の異なるクラスに分離されています。したがって、データの各クラスについて、比較的単純な計算を使用して、最尤法を使用してそのクラスターのパラメーターを最適化できます。(分類する前にデータ セット全体に対してこれを実行しようとすると、通常は分析的に扱いにくくなります。)

次に、収束するまで、パラメーターの推測を更新し、再分類し、パラメーターを更新し、再分類します。

期待値最大化アルゴリズムが行うことは似ていますが、より一般的です。データ ポイントをクラス 1、クラス 2、...、クラス N にハード分類する代わりに、各データ ポイントが属するソフト分類を使用しています。ある確率で各プロセス。(明らかに、各ポイントの確率は合計して 1 になる必要があるため、正規化が行われています。)これは、各プロセス/推測が各データに対して一定量の「説明力」を持っていると考えることもできると思います。ポイント。

そのため、各クラスに絶対に属する点に関して推測を最適化する (絶対に属さない点を無視する) 代わりに、これらのソフト分類または説明力のコンテキストで推測を再最適化します。そして、式を正しい方法で記述した場合、最大化するのはその形式の期待値である関数であるということが起こります。

そうは言っても、いくつかの注意事項があります。

1) これは簡単そうです。少なくとも私にはそうではありません。文献には、確率式の代わりに尤度式を使用する、対数尤度に変換する、指標変数を使用する、それらを基底ベクトル形式に入れ、指数に入れるなど、特別なトリックやテクニックのごちゃまぜが散らばっています。

これらは、一般的なアイデアが得られるとおそらくより役立つでしょうが、核となるアイデアを難読化する可能性もあります.

2) 問題に対する制約が何であれ、フレームワークに組み込むのは難しい場合があります。特に、各プロセスの確率を知っている場合は、おそらく良好な状態です。そうでない場合は、それらも推定しており、プロセスの確率の合計は 1 でなければなりません。それらは確率単体で生きなければなりません。これらの制約をそのまま維持する方法は、必ずしも明らかではありません。

3) これは十分に一般的な手法であるため、一般的なコードをどのように記述すればよいかわかりません。アプリケーションは単純なクラスタリングをはるかに超えており、実際にデータが欠落している、またはデータが欠落しているという仮定が役立つ可能性がある多くの状況に拡張されます。 ここでは、多くの用途で恐ろしい創意工夫が働いています。

4) この手法は収束することが証明されていますが、収束は必ずしも大域的最大値になるとは限りません。用心してください。

上記の解釈を思いつくのに役立つ次のリンクを見つけました:統計学習スライド

そして、次の記事では、いくつかの痛ましい数学的詳細を詳しく説明しています: Michael Collins' write-up

于 2013-04-02T23:20:58.523 に答える
3

Do と Batzoglou による2 番目のサンプル ペーパーで示されている例を説明する Python で以下のコードを書きました。

以下のコードの'weightA''weightB'が取得される方法と理由の明確な説明については、まずこのリンクを読むことをお勧めします。

免責事項 :コードは機能しますが、最適にコーディングされていないことは確かです。私は通常、Python コーダーではなく、2 週間前に使い始めました。

import numpy as np
import math

#### E-M Coin Toss Example as given in the EM tutorial paper by Do and Batzoglou* #### 

def get_mn_log_likelihood(obs,probs):
    """ Return the (log)likelihood of obs, given the probs"""
    # Multinomial Distribution Log PMF
    # ln (pdf)      =             multinomial coeff            *   product of probabilities
    # ln[f(x|n, p)] = [ln(n!) - (ln(x1!)+ln(x2!)+...+ln(xk!))] + [x1*ln(p1)+x2*ln(p2)+...+xk*ln(pk)]     

    multinomial_coeff_denom= 0
    prod_probs = 0
    for x in range(0,len(obs)): # loop through state counts in each observation
        multinomial_coeff_denom = multinomial_coeff_denom + math.log(math.factorial(obs[x]))
        prod_probs = prod_probs + obs[x]*math.log(probs[x])

multinomial_coeff = math.log(math.factorial(sum(obs))) -  multinomial_coeff_denom
likelihood = multinomial_coeff + prod_probs
return likelihood

# 1st:  Coin B, {HTTTHHTHTH}, 5H,5T
# 2nd:  Coin A, {HHHHTHHHHH}, 9H,1T
# 3rd:  Coin A, {HTHHHHHTHH}, 8H,2T
# 4th:  Coin B, {HTHTTTHHTT}, 4H,6T
# 5th:  Coin A, {THHHTHHHTH}, 7H,3T
# so, from MLE: pA(heads) = 0.80 and pB(heads)=0.45

# represent the experiments
head_counts = np.array([5,9,8,4,7])
tail_counts = 10-head_counts
experiments = zip(head_counts,tail_counts)

# initialise the pA(heads) and pB(heads)
pA_heads = np.zeros(100); pA_heads[0] = 0.60
pB_heads = np.zeros(100); pB_heads[0] = 0.50

# E-M begins!
delta = 0.001  
j = 0 # iteration counter
improvement = float('inf')
while (improvement>delta):
    expectation_A = np.zeros((5,2), dtype=float) 
    expectation_B = np.zeros((5,2), dtype=float)
    for i in range(0,len(experiments)):
        e = experiments[i] # i'th experiment
        ll_A = get_mn_log_likelihood(e,np.array([pA_heads[j],1-pA_heads[j]])) # loglikelihood of e given coin A
        ll_B = get_mn_log_likelihood(e,np.array([pB_heads[j],1-pB_heads[j]])) # loglikelihood of e given coin B

        weightA = math.exp(ll_A) / ( math.exp(ll_A) + math.exp(ll_B) ) # corresponding weight of A proportional to likelihood of A 
        weightB = math.exp(ll_B) / ( math.exp(ll_A) + math.exp(ll_B) ) # corresponding weight of B proportional to likelihood of B                            

        expectation_A[i] = np.dot(weightA, e) 
        expectation_B[i] = np.dot(weightB, e)

    pA_heads[j+1] = sum(expectation_A)[0] / sum(sum(expectation_A)); 
    pB_heads[j+1] = sum(expectation_B)[0] / sum(sum(expectation_B)); 

    improvement = max( abs(np.array([pA_heads[j+1],pB_heads[j+1]]) - np.array([pA_heads[j],pB_heads[j]]) ))
    j = j+1
于 2013-07-11T13:19:45.047 に答える
1

これを理解するための鍵は、推定を簡単にする補助変数が何であるかを知ることです。最初の例を簡単に説明します。2 番目の例も同様のパターンに従います。

表裏の各シーケンスを、コイン 1 が使用されたかコイン 2 が使用されたかを示す 2 つのバイナリ変数で補強します。これで、データは次のようになります。

c_11 c_12 c_21 c_22 c_31 c_32 ...

各 i について、c_i1=1 または c_i2=1 のいずれかで、もう一方は 0 です。サンプルでこれらの変数が取る値がわかっている場合、パラメーターの推定は簡単です。p1 は、c_i1= のサンプルでの頭の割合になります。 1、c_i2 についても同様で、\lambda は c_i1 の平均になります。

ただし、これらのバイナリ変数の値はわかりません。したがって、基本的に行うことは、それらを推測し (実際には、それらの期待値を取得します)、推測が正しいと仮定してモデルのパラメーターを更新することです。したがって、E のステップは、c_i1s と c_i2s の期待値を取ることです。M ステップは、これらの cs が与えられたときに p_1、p_2、および \lambda の最尤推定値を取得することです。

それはもう少し理にかなっていますか?必要に応じて、E および M ステップの更新を書き出すことができます。EMは、この手順に従うことで、反復が増加しても可能性が決して低下しないことを保証します.

于 2013-03-20T11:47:38.630 に答える