私はこの本(NLTK)を読んでいて、混乱しています。 エントロピーは次のように定義されます:
エントロピーは、各ラベルの確率と同じラベルの対数確率の合計です。
テキストマイニングの観点からエントロピーと最大エントロピーを適用するにはどうすればよいですか?誰かが私に簡単で単純な例(視覚的)を教えてもらえますか?
決定木を構築するという文脈でエントロピーが言及されたと思います。
例として、名前を男性/女性のグループに分類することを学習するタスクを想像してみてください。それぞれがまたはでラベル付けされた名前のリストが与えられた場合、データに適合し、目に見えない新しい名前の性別を予測するために使用できるモデルを学習したいと考えています。m
f
name gender
----------------- Now we want to predict
Ashley f the gender of "Amro" (my name)
Brian m
Caroline f
David m
最初のステップは、予測したいターゲット クラスに関連するデータの特徴を決定することです。特徴の例としては、最初/最後の文字、長さ、母音の数、母音で終わるかなどがあります。特徴抽出後、データは次のようになります。
# name ends-vowel num-vowels length gender
# ------------------------------------------------
Ashley 1 3 6 f
Brian 0 2 5 m
Caroline 1 4 8 f
David 0 2 5 m
目標は決定木を構築することです。ツリーの例は次のとおりです。
length<7
| num-vowels<3: male
| num-vowels>=3
| | ends-vowel=1: female
| | ends-vowel=0: male
length>=7
| length=5: male
基本的に、各ノードは単一の属性に対して実行されるテストを表し、テストの結果に応じて左右に移動します。m
クラス予測 (またはf
)を含むリーフ ノードに到達するまで、ツリーをトラバースし続けます。
したがって、このツリーの下にAmroという名前を実行すると、「 is the length<7?」のテストから開始し、答えがyesであるため、そのブランチに移動します。分岐に続いて、次のテスト "母音の数<3? " は、再びtrueと評価されます。これにより、 というラベルが付けられたリーフ ノードが生成されるm
ため、予測は男性になります (たまたま男性だったので、ツリーは結果を正しく予測しました)。
決定木はトップダウン方式で構築されますが、問題は、各ノードで分割する属性をどのように選択するかです。答えは、ターゲット クラスを可能な限り純粋な子ノードに最適に分割する機能を見つけることです (つまり、男性と女性の両方が混在していないノードではなく、クラスが 1 つだけの純粋なノード)。
この純度の尺度は情報と呼ばれます。これは、ノードに到達した例を考慮して、新しいインスタンス (名) を男性または女性に分類する必要があるかどうかを指定するために必要となる予想される情報量を表します。ノードの男性クラスと女性クラスの数に基づいて計算します。
一方、エントロピーは不純物の尺度です(反対)。値/を持つバイナリ クラスに対して次のように定義され。a
b
Entropy = - p(a)*log(p(a)) - p(b)*log(p(b))
このバイナリ エントロピー関数を下の図に示します (確率変数は 2 つの値のいずれかを取ることができます)。それは確率p=1/2
が_ _ エントロピー関数は、確率がまたは完全に確実な場合 (またはそれぞれ、後者が意味する場合)最小ゼロです。p(X=a)=0.5
p(X=b)=0.5
a
b
p=1
p=0
p(X=a)=1
p(X=a)=0
p(X=b)=1
もちろん、エントロピーの定義は、N 個の結果 (2 つだけではない) を持つ離散確率変数 X に対して一般化できます。
(log
式の は、通常、2 を底とする対数として使用されます)
名前分類のタスクに戻り、例を見てみましょう。ツリーを構築するプロセスのある時点で、次の分割を検討していたと想像してください。
ends-vowel
[9m,5f] <--- the [..,..] notation represents the class
/ \ distribution of instances that reached a node
=1 =0
------- -------
[3m,4f] [6m,1f]
ご覧のとおり、分割前は 9 人の男性と 5 人の女性、つまりP(m)=9/14
とP(f)=5/14
. エントロピーの定義によると:
Entropy_before = - (5/14)*log2(5/14) - (9/14)*log2(9/14) = 0.9403
次に、2 つの子ブランチを見て分割を考慮した後に計算されたエントロピーと比較します。の左ブランチにはends-vowel=1
、次のものがあります。
Entropy_left = - (3/7)*log2(3/7) - (4/7)*log2(4/7) = 0.9852
と の右の分岐は次のends-vowel=0
とおりです。
Entropy_right = - (6/7)*log2(6/7) - (1/7)*log2(1/7) = 0.5917
各分岐のインスタンス数を重み係数として使用して左右のエントロピーを結合し(7 つのインスタンスが左に移動し、7 つのインスタンスが右に移動)、分割後の最終的なエントロピーを取得します。
Entropy_after = 7/14*Entropy_left + 7/14*Entropy_right = 0.7885
ここで、分割の前後のエントロピーを比較することで、情報利得の測定値、またはその特定の機能を使用して分割を行うことで得た情報の量を取得します。
Information_Gain = Entropy_before - Entropy_after = 0.1518
上記の計算を次のように解釈できます。end-vowels
機能を使用して分割を行うことで、サブツリー予測結果の不確実性を 0.1518 という少量 (情報の単位としてビットで測定) 減らすことができました。
ツリーの各ノードで、すべてのフィーチャに対してこの計算が実行され、最大の情報ゲインを持つフィーチャが貪欲な方法で分割に選択されます (したがって、不確実性/エントロピーが低い純粋な分割を生成するフィーチャが優先されます)。このプロセスはルート ノードから再帰的に適用され、リーフ ノードにすべて同じクラスを持つインスタンスが含まれている場合に停止します (さらに分割する必要はありません)。
数値機能、欠損値、オーバーフィッティング、ツリーの剪定などの処理方法など、この投稿の範囲外の詳細をスキップしたことに注意してください。
まず、理解するのが最善the measure of information
です。
measure
入手しますか?ありそうもないことが起こったとき、それは大きなニュースだと言います。また、予測可能なことを言うと、あまり面白くありません。したがって、これを定量化するinteresting-ness
には、関数が満たす必要があります
one bit
、情報が得られます。制約を満たす 1 つの自然な尺度は、
I(X) = -log_2(p)
ここで、pはイベントの確率ですX
。そして、ユニットはbit
、同じビットコンピュータが使用しています。0 または 1。
フェアコイントス:
1 回のコイントスでどれだけの情報を得ることができるか?
答え :-log(p) = -log(1/2) = 1 (bit)
明日隕石が地球に衝突すると、p=2^{-22}
22 ビットの情報を得ることができます。
太陽が明日昇る場合、p ~ 1
それは 0 ビットの情報です。
したがってinteresting-ness
、イベントの を期待するY
と、それはエントロピーになります。つまり、エントロピーは、イベントの面白さの期待値です。
H(Y) = E[ I(Y)]
より正式には、エントロピーはイベントの予想されるビット数です。
Y = 1 : イベント X が確率 p で発生する
Y = 0 : 事象 X が確率 1-p で発生しない
H(Y) = E[I(Y)] = p I(Y==1) + (1-p) I(Y==0)
= - p log p - (1-p) log (1-p)
すべての対数の基数 2 の対数。
グラフは出せませんが、分かりやすい説明ができるかもしれません。
赤または緑のいずれかで 1 日 1 回点滅するライトなどの情報チャネルがあるとします。それはどのくらいの情報を伝えますか?最初の推測は、1 日 1 ビットかもしれません。しかし、青を追加して、送信者が 3 つのオプションを持つようにするとどうなるでしょうか。2 の累乗以外のものを扱うことができる情報の尺度を持ちたいと考えていますが、それでも加法性があります (可能なメッセージの数を 2 倍すると1 ビットが追加される方法)。log 2 (考えられるメッセージの数) を取得することでこれを行うことができますが、より一般的な方法があることがわかりました。
赤/緑に戻ったとしますが、赤い電球が切れて (これは常識です)、ランプは常に緑に点滅する必要があります。チャンネルはもう役に立たない、次のフラッシュがどうなるかはわかっているそのため、閃光は何の情報もニュースも伝えません。現在、電球を修理していますが、赤い電球が連続して 2 回点滅してはならないという規則を課しています。ランプが赤く点滅すると、次のフラッシュが何であるかがわかります。このチャネルでビット ストリームを送信しようとすると、ビットよりも多くのフラッシュ (実際には 50% 以上) を使用してエンコードする必要があることがわかります。また、フラッシュのシーケンスを記述したい場合は、より少ないビットで記述できます。各フラッシュが独立している (コンテキストフリー) 場合にも同じことが当てはまりますが、緑のフラッシュは赤よりも一般的です。オールグリーン、電球切れ限界。
さまざまなシンボルの確率に基づいて、信号の情報量を測定する方法があることがわかりました。シンボル x iを受信する確率が p iの場合、次の量を考慮します。
-log p i
p iが小さいほど、この値は大きくなります。x iが 2 倍になる可能性が低くなると、この値は固定量 (log(2)) だけ増加します。これは、メッセージに 1 ビット追加することを思い出させるはずです。
シンボルがどうなるかわからない場合 (ただし、確率はわかっている)、さまざまな可能性を合計することで、この値の平均、つまりどのくらいの金額が得られるかを計算できます。
I = -Σ p i log(p i )
これは一挙に情報内容です。
赤い電球が切れた: p赤= 0、p緑=1、I = -(0 + 0) = 0 赤と緑の確率は等しい: p red = 1/2, p green = 1/2 , I = -(2 * 1/2 * log(1/2)) = log(2) 3 色、等確率: p i =1/3、I = -(3 * 1/3 * log(1/3)) = log(3) 緑と赤、緑の確率は 2 倍: p red =1/3、p green =2/3、I = -(1/3 log(1/3) + 2/3 log(2/3)) = log( 3) - 2/3 ログ(2)
これは、メッセージの情報コンテンツまたはエントロピーです。異なるシンボルが等確率である場合に最大になります。物理学者なら自然対数を使い、コンピューター科学者なら log 2を使ってビットを取得します。
情報理論、ベイズ法、MaxEnt について読むことを強くお勧めします。開始する場所は、David Mackay によるこの (オンラインで無料で入手できる) 本です。
http://www.inference.phy.cam.ac.uk/mackay/itila/
これらの推論方法は、単なるテキスト マイニングよりもはるかに一般的なものであり、この本または機械学習と MaxEnt ベイジアンに関する他の入門書に含まれる一般的な基礎のいくつかを学ばなければ、これを NLP に適用する方法を学ぶ方法を実際に考案することはできません。メソッド。
エントロピーと確率論と情報の処理と保存との関係は、非常に深いものです。ざっくり説明すると、Shannon による、ノイズの多い通信チャネルをエラーなしで通過できる情報の最大量は、ノイズ プロセスのエントロピーに等しいという定理があります。また、データの断片をどれだけ圧縮してコンピュータの最小メモリを占有できるかを、データを生成したプロセスのエントロピーに関連付ける定理もあります。
コミュニケーション理論のすべての定理を学ぶ必要はないと思いますが、エントロピーとは何か、その計算方法、情報や推論との関係などについての基本を学ばなければ、これを学ぶことはできません。 ...
エントロピーは情報または知識の入手可能性であり、情報の欠如は高エントロピー (テキスト マイニングにおける次の単語の予測) である将来の予測の困難につながり、情報/知識の入手可能性は将来のより現実的な予測 (低エントロピー) に役立ちます。
あらゆる種類の関連情報はエントロピーを減らし、より現実的な未来を予測するのに役立ちます。その情報は、文に「肉」という単語が存在するか、「肉」という単語が存在しない可能性があります. これをインフォメーションゲインといいます
エントロピーは予測可能性の順序の欠如です
画像のエントロピーを計算するアルゴリズムを実装していたときに、これらのリンクを見つけました。こことここを参照してください。
これは私が使用した疑似コードです。画像ではなくテキストで動作するように調整する必要がありますが、原則は同じである必要があります。
//Loop over image array elements and count occurrences of each possible
//pixel to pixel difference value. Store these values in prob_array
for j = 0, ysize-1 do $
for i = 0, xsize-2 do begin
diff = array(i+1,j) - array(i,j)
if diff lt (array_size+1)/2 and diff gt -(array_size+1)/2 then begin
prob_array(diff+(array_size-1)/2) = prob_array(diff+(array_size-1)/2) + 1
endif
endfor
//Convert values in prob_array to probabilities and compute entropy
n = total(prob_array)
entrop = 0
for i = 0, array_size-1 do begin
prob_array(i) = prob_array(i)/n
//Base 2 log of x is Ln(x)/Ln(2). Take Ln of array element
//here and divide final sum by Ln(2)
if prob_array(i) ne 0 then begin
entrop = entrop - prob_array(i)*alog(prob_array(i))
endif
endfor
entrop = entrop/alog(2)
このコードをどこかから入手しましたが、リンクを掘り下げることができません。