プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

期待値最大化とは何ですか?


EM(Expectation-Maximization)アルゴリズムは、パラメーター推定値の検出に使用できる有名な反復改良アルゴリズムです。これは、k-meansパラダイムの拡張と見なすことができます。これは、クラスター平均に応じて、最も類似しているクラスターにオブジェクトを作成します。

EMは、メンバーシップの確率を定義する重みに従って、クラスターに各オブジェクトを作成します。言い換えれば、クラスター間に厳密な境界はありません。したがって、新しい平均は加重メジャーに基づいて評価されます。

EMは、組み合わせモデルのパラメーターの元の推定値または「推測」から始まります(まとめてパラメーターベクトルとして定義されます)。パラメータベクトルによって作成された混合密度とは対照的に、オブジェクトを繰り返し再スコアリングできます。再スコアリングされたオブジェクトは、パラメータ推定値を復元するために使用されます。各オブジェクトは、特定のクラスターのメンバーである場合に、特定の属性値のセットを所有できる確率を作成しました。アルゴリズムは次のように表されます-

  • これを使用して、パラメーターベクトルの元の推測を行うことができます-これには、クラスター平均または中心を定義するためにランダムに選択されたkオブジェクト(k-means分割の場合のように)、および新しいパラメーターの推測が含まれます。

  • 次の2つの手順に応じて、パラメーター(またはクラスター)を繰り返し調整できます-

  • (a)期待のステップ −各オブジェクトxiを作成して、確率でckをクラスター化できます

    $$ P(x_ {i} \ epsilon C_ {k})=p(C_ {k} | x_ {i})=\ frac {p(C_ {k})p(x_ {i} | C_ {k} )} {p(x_ {i})} $$

    ここで、p(x i | C k )=N(m k 、E k (x i ))平均、m k の周りの正規(つまりガウス)分布に従います 、期待して、E k 。別の言い方をすれば、このステップでは、オブジェクトx iのクラスターメンバーシップの確率を計算します。 、クラスターごとに。これらの確率は、オブジェクトx iの「予想される」クラスターメンバーシップです。 。

  • (b)最大化ステップ −モデルパラメータを再推定(または改良)するには、上からの確率推定が必要になる場合があります。たとえば、

    $$ m_ {k} =\ frac {1} {n} \ sum_ {i =1} ^ {n} \ frac {x_ {i} P(x_ {i} \ epsilon C_ {k})} {\ sum_ {j} P(x_ {i} \ epsilon C_ {j})} $$

このフェーズは、データが与えられた場合の割り当ての可能性の「最大化」です。

EMアルゴリズムは、実行が簡単で理解しやすいものです。すぐに収束しますが、グローバルな最適化には到達できません。収束は、特定の形式の最適化関数に対して保証されています。計算の複雑さは、d(入力特性の数)、n(アイテムの数)、およびt(冗長性の数)で線形です。ベイジアンクラスタリング手法は、クラス条件付き確率密度の計算を対象としています。これらは通常、統計コミュニティで使用されます。

業界では、AutoClassは、EMアルゴリズムの修正を使用する有名なベイズクラスタリング手法です。最良のクラスタリングは、オブジェクトの正確なクラスターが与えられた場合に、オブジェクトの属性を予測する機能を最大化します。 AutoClassは、クラスターの数を見積もることもできます。さまざまな分野で使用されており、赤外線天文学データに応じて新しいクラスの星を見つけることができました。


  1. C#のオブジェクトプールとは何ですか?

    オブジェクトプールは、限られたリソースの使用を最適化するように設計されたソフトウェア構造です。すぐに使用できるオブジェクトがあります。 プールされたオブジェクトは再利用できます。オブジェクトプーリングには2つの形式があります- オブジェクトをアクティブ化すると、プールからプルされます。 非アクティブ化すると、オブジェクトがプールに追加されます。 ObjectPoolingAttribute属性を適用して、オブジェクトプーリングを構成します。 これは、System.EnterpriseServices.ServicedComponentクラスから派生したクラスに適用されます。 プール

  2. PythonのTimeTupleとは何ですか?

    datetime.dateインスタンスのtimetuple()メソッドは、time.struct_time型のオブジェクトを返します。 struct_timeは名前付きタプルオブジェクトです(名前付きタプルオブジェクトには、インデックスまたは名前でアクセスできる属性があります)。 struct_timeオブジェクトには、日付フィールドと時刻フィールドの両方を表す属性と、夏時間がアクティブかどうかを示すフラグがあります。 timetuple()関数によって返される名前付きタプルでは、​​日付オブジェクトに従って年、月、日のフィールドが設定され、時間、分、秒に対応するフィールドはゼロに設定され