1

すべての列のエントロピーを計算しようとしましたが、行列は次のようになります。

0.5 0.3333 0.2  
0   0.3333 0.4  
0.5 0.3333 0.4  

すべての列の合計は 1 になりますが、マトリックスにはいくつかのゼロがあるため、log2(arr(i,:)) だけでは、結果に -Inf が含まれるため、すべてが機能しません
実際には私は巨大な行列を持っているので、プログラムを高速に実行したいのですが、回避策はありますか?
これが私の解決策です。 p .* log2(p) と同じくらい速く動作しますか?

    log2p = log2(p);
    log2p(log2p==-Inf)=0;
    entropy = entropy - p .* log2p;
4

4 に答える 4

1

MATLAB では0^0に等しい1です。そして 、log2(1)==0これを使用して、エントロピー関数を次のように書き換えることができます

p.*log2(p) = log2(p.^p)

次に、あなたの例では、

>> log2(p.^p)

ans =

   -0.5000   -0.5283   -0.4644
         0   -0.5283   -0.5288
   -0.5000   -0.5283   -0.5288
于 2013-07-01T08:49:10.737 に答える
0

使用eps:

eps は float で表現可能な最小数であるため、あまり変更せずに結果が得られます (ほぼ無限の小さな変更)。

log2(p)

ans =

   -1.0000   -1.5851   -2.3219
      -Inf   -1.5851   -1.3219
   -1.0000   -1.5851   -1.3219

log2(p+eps)

ans =

   -1.0000   -1.5851   -2.3219
  -52.0000   -1.5851   -1.3219
   -1.0000   -1.5851   -1.3219

p2=p+eps;
 entropy=-sum(p2.*log2(p2),1)

entropy =

    1.0000    1.5849    1.5219
于 2013-07-01T08:06:01.743 に答える
0

使用するisinf

log2p = log2(p);
log2p( isinf(log2p) ) = 0;
entrpoy = -sum( p.*log2p , 1 )
于 2013-07-01T05:57:04.903 に答える