【機械学習】基礎的な確率論と情報理論

このブログ投稿の元のマークダウン リンクについては、ここをクリックしてください。

序章

確率理論は、不確実性の記述を表現するためのフレームワークです。不確実性を定量化する方法を提供するだけでなく、新しい不確実性ステートメントを導き出すための公理も提供します。

人工知能の分野では、確率論は 2 つの方法で使用されます。まず、確率の法則は AI システムがどのように推論するかを示し、これに基づいて、確率論から派生した式を計算または推定するアルゴリズムが設計されています。第 2 に、確率と統計を使用して AI システムの動作を分析および評価できます。

確率理論を使用すると、不確実な発言をしたり、不確実性の存在について推論したりできますが、情報理論を使用すると、確率分布の不確実性の量を定量化できます。

機械学習は多くの場合、不確実な量を処理する必要があり、場合によってはランダムな量を処理することもあります。不確実性は、モデル化されるシステムの固有のランダム性、不完全な観測、および不完全なモデリングという 3 つの原因から生じます。

確率論

確率

  • ベイズジャンルの確率: 確率とは何かが起こる確実性の度合い、つまり確実性の度合いであると考えます。

  • 頻度 ジャンル 確率: 確率とは、物事がどれくらいの頻度で起こるかということだと考えています。

  • ランダム変数: ランダムに異なる値を取る変数で、一般に確率変数を表すには普通の小文字が使用され、確率変数が取り得る値を表すには斜体の小文字が使用されます。確率変数x \mathrm xなどxが取り得る、x 1 、x 2、x_1、x_2バツ1バツ2

    確率変数がベクトル形式の場合は、太字x \mathbf xを使用します。x は、取り得る値がx であることを意味します \boldsymbol x×確率変数は、それ自体では単に可能な状態を記述したものであり、確率分布を通じて各状態の尤度を指定する必要があります。

    確率変数は離散的または連続的です。離散確率変数には、有限数または可算無限数の状態があります状態は整数である必要はなく、値のない名前付き状態がいくつか存在する可能性があり、連続確率変数は実数値です

確率分布

離散確率変数と確率質量関数

離散確率変数の場合、確率分布では確率質量関数(確率質量関数、PMF) (\rm 確率 \ 質量 \ 関数、PMF) を使用できます。(確率マス機能_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _  P M F )を説明するため、通常は大文字のPPP は、確率質量関数が、各確率変数がとり得る各状態を、確率変数がその状態をとるときの確率にマッピングすることを意味します。確率変数x \rm xなどxにはxxがかかります時間xにおける確率は P ( x = x ) P(\text{x} = \it x)として表されます。P ( ×=×

一般に、確率変数x \rm xxが続くP ( x ) P(\rm x)P ( x )用:x 〜 P ( x ) \text x \sim \mathit{P}(\text x)バツP ( x )で表します。確率質量関数P ( x ) P(\rm x)P ( x )は次の条件を満たさなければなりません。

⧫ \ブラックロゼンジ\、PPPのドメインはx \text{x}xのすべての状態のコレクション

⧫ \ブラックロゼンジ\、 ∀ x ∈ x , 0 ≤ P ( x ) ≤ 1 \forall x \in \text{x}, 0 \leq P(\text{x}) \leq 1××0P ( × )1 ;

⧫ \ブラックロゼンジ\、∑ x ∈ x P ( x ) = 1 \sum_{x \in \text{x}} P(x) = 1x xP ( × )=1 .

確率変数x \text{x}があるとします。xにはkkがありますk個の状態があり、一様分布(一様分布) に従う (\rm 均一 \ 分布)( un i for m dis t r i b u t i o n ) 、その PMF \  rm PMFを変換することによりP M Fセット
P ( x = xi ) = 1 k P(\text{x} = x_i) = \frac1kP ( ×=バツ私は)=k1
みんな私は確立されています。

  • 同時確率分布

    確率質量関数を複数の確率変数に同時に適用します (例: P ( x = x , y = y ) \mathit{P}(\text{x} = x, \text{y} = y)P ( ×=× y=y ),表示x = x , y = y \mathrm{x} = x, \mathrm{y} = yバツ=× y=yが同時に発生する確率。

連続確率変数と確率密度関数

連続確率変数の場合、確率分布は確率密度関数(確率密度関数、PDF) (\rm 確率 \ 密度 \ 関数、PDF)として使用できます。(確率密度関数_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _  PDF )の説明 (通常小文字pp)p は、以下を満たす必要があることを示します。

⧫ \ブラックロゼンジ\、PPPのドメインはx \text{x}xのすべての状態のコレクション

⧫ \ブラックロゼンジ\、 ∀ x ∈ x , 0 ≤ P ( x ) \forall x \in \text{x}, 0 \leq P(\text{x})××0P ( x ) ;

⧫ \ブラックロゼンジ\、∫ − ∞ ∞ p ( x ) dx = 1 \displaystyle \int _{-\infty}^{\infty} p(x)\mathrm{d}x = 1p ( x ) d x=1 .

したがって、 PDF \rm PDF を使用できますPDF は、点セットの真の確率質量を取得するために統合されています

たとえば、( a , b ) (a,b)では( _b ) ,
U ( x ; a , b ) = 1 b − a U(x;a,b) = \frac{1}{b - a}U ( x ;_b )=bある1

周辺確率分布

定義: 変数セットの同時確率分布のサブセットの確率分布。サブセット上で定義された確率分布は、周辺確率分布と呼ばれます。

離散確率変数x, y \text {x, y}があるとします。x、yおよび既知のP ( x,y ) P(\text{x,y})P ( x,y )。那么
∀ x ∈ x , P ( x = x ) = ∑ y P ( x = x , y = y ) \forall x \in \text{x}, P(\text{x} = x) = \sum_{y} P(\text{x} = x, \text{y} = y)×× P ( ×=× =yP ( ×=× y=y )
連続変数の場合は、積分
p ( x ) = ∫ p ( x , y ) dyp(x) = \int p(x, y) dy をp ( x )=p ( x ,y ) d y

条件付き確率分布

定義:他のイベントが発生した場合に、あるイベントが発生する確率。

たとえば、x = x 、 \text{x} = x とすると、バツ=x ,イベントy = y \text y = yy=yが発生する
確率は P ( y = y ∣ x = x ) = P ( y = y , x = x ) P ( x = x ) P(\text y = y \mid \text x = x) = \ frac {P(\text y = y, \text x = x)}{P(\text x = x)}P (=yバツ=× =P ( ×=× P (=バツ=×

条件付き確率の連鎖則

任意の多次元確率変数の同時確率分布は、1 つの変数のみの条件付き確率を乗算する形式に分解できます。
P ( x ( 1 ) , ⋯ , x ( n ) ) = P ( x ( 1 ) ) ∏ i = 2 n P ( x ( i ) ∣ x ( 1 ) , ⋯ , x ( i − 1 ) ) P(\text x^{(1)}, \cdots, \text x^{(n)}) = P (\ text x^{(1)}) \prod_{i = 2}^n P(\text x^{(i)} \mid \text x^{(1)}, \cdots, \text x^ {( i - 1)})P ( ×( 1 )バツ( n ) )=P ( ×( 1 ) )i = 2P ( ×()バツ( 1 )バツ( i 1 ) )
決定します。
P ( a , b , c ) = P ( a ) P ( b ∣ a ) P ( c ∣ a , b ) P( a , b , c ) = P( a ) P ( b \mid a) P(c \mid a,b)P ( a b c )=P ( a ) P ( ba ) P ( c_b )

P(a, b, c) = P(a ∣ b, c) P(b, c) P(b, c) = P(b ∣ c) P(c) P(a, b, c). ) = P ( a ∣ b , c ) P ( b ∣ c ) P ( c ) \begin{aligned} P(a, b, c) &= P(a \mid b, c) P(b , c) \\ P(b,c) &= P(b\midc) P(c) \\P(a,b,c) &= P(a\midb,c)P(b\midc)P (c) \end{整列}P ( a b c )P ( b c )P ( a b c )=P ( _b c ) P ( b c )=P ( bc ) P ( c )=P ( _b c ) P ( bc ) P ( c )

独立性と条件付き独立性

2 つの確率変数x \text xxy \text yy、それらの同時確率分布が個々の確率分布の積として表現できる場合、これら 2 つの確率変数は互いに独立していると言われます。つまり、 ∀ x ∈ x 、 y ∈ y 、 P ( x = x
、 y = y ) = P ( x = x ) P ( y = y ) \forall x \in \text x,y\in \text y,P(\text x = x, \text y = y) = P( \テキスト x = x )P(\テキスト y = y)×× yP ( ×=× y=y=P ( ×=x ) P ( y=y )
確率変数x \text xxy \text y確率変数 z に対するyの条件付き確率分布z \text zzの各値は積の形で書くことができ、確率変数x \text xxy \text y与えられた確率変数のy z \text zzは条件独立、つまり
∀ x ∈ x , y ∈ y , z ∈ z , P ( x = x , y = y ∣ z = z ) = P ( x = x ∣ z = z ) P ( y = y ∣ z = z ) \forall x \in \text x,y\in \text y,z \in \text z,P(\text x = x, \text y = y \mid \text z = z) = P(\テキスト x = x \mid \text z = z)P(\text y = y \mid \text z = z)×× yzzP ( ×=× y=yz=z =P ( ×=バツz=z ) P ( y=yz=z

期待値、分散、共分散

予想

期待(\rm 期待)(期待) :関数ff _ _ _ _ _ _ _ __確率分布P ( x ) P(\text x)上のfP ( x )またはP ( x ) P(\text x)P ( x )の期待値は、確率分布によって生成されるxxとして表されます。x、次にfff はxxに作用しますf ( x ) f(x)のxの後f ( x )の平均値。つまり、
E x 〜 P [ f ( x ) ] = ∑ x P ( x ) f ( x ) \mathrm{E}_{x \sim P}[f(x)] = \sum_x P(x)f( ×)Ex P[ f ( x ) ]=バツP ( x ) f ( x )
は積分によって得られる連続変数です。

分散

分散( 分散 ) (\rm 分散)(分散) :ペアxx場合_ _ _ _xが確率分布に従ってサンプリングされると、確率変数xxxの関数値f ( x ) f(x)f ( x )はどれだけの差があるかを示しますつまり、
V ar ( f ( x ) ) = [ ( f ( x ) − E [ f ( x ) ] ) 2 ] \mathrm{Var}(f(x)) = [(f(x) - \mathrm) {E }[f(x)])^2]V a r ( f ( x ) )=[ ( f ( x )E [ f ( x ) ] )2 ]
平方根は標準偏差と呼ばれます。

共分散

共分散( 共分散 ) (\rm 共分散)(分散) :ある意味変数間の線形相関の強さと各変数スケール与えますつまり、
C ov ( f ( x ) , g ( y ) ) = E { ( f ( x ) − E [ f ( x ) ] ) ( g ( y ) − E [ g ( y ) ] ) } \mathrm {Cov }(f(x), g(y)) = \mathbb{E} \{ (f(x) - \mathbb{E}[f(x)]) (g(y) - \mathbb{E }[ g(y)]) \}C o v ( f ( x ) ,g ( y ) )=E { ( f ( x )E [ f ( x ) ] ) ( g ( y )E [ g ( y ) ] ) }
共分散の絶対値が大きいということは、変数の値が大きく変動し、それぞれの平均値から遠く離れていることを意味します共分散が正の場合、両方の変数が同時に比較的大きな値をとる傾向があります。共分散が負の場合、変数の 1 つは比較的大きな値を取る傾向があり、もう 1 つの変数は比較的小さな値を取る傾向があり、その逆も同様です。

相関係数( 相関 ) (\rm 相関)( co r e l a t i o n )、各変数のスケールに影響されずに変数の相関のみを測定するために、各変数の寄与を正規化します

  • 共分散行列

    ランダム ベクトルx ∈ R n \boldsymbol x \in \mathbb{R}^nバツRnの共分散行列は、n × nn \times nn×n行列であり、
    C ov ( x ) i , j = C ov ( xi , xj ) \mathrm{Cov}(\mathbf{x})_{i,j} = \mathrm{Cov}(\text{ x }_i、\text{x}_j)C o v ( x ) j=C o v ( x私はバツj)
    ここで、対角要素は分散です。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([8, 7, 6, 5, 4, 3, 2, 1])
Mean = np.mean(x)
Var = np.var(x)
Var_unbias = np.var(x, ddof=1)  # N - ddof
Cov = np.cov(x, y)
print(Mean)  # 4.5
print(Var)  # 5.25
print(Var_unbias)  # 6.0
print(Cov)
# [[ 6. -6.]
#  [-6.  6.]]

一般的な確率分布

ベルヌーイ分布

単一の 2 値確率変数の分布は、2 点分布とも呼ばれます。ϕ \ファイϕ は1 1に等しい確率変数を与えますP ( x = 1 ) = ϕ P ( x = 0 ) = 1 − ϕ P ( x = x ) = ϕ x ( 1 − ϕ ) ( 1 − x ) E x [ x ] = ϕ V arx
( x ) = ϕ ( 1 − ϕ ) P(\text x = 1) = \phi \\ P(\text x = 0) = 1 - \phi \\ P(\text x = x) = \phi^ x(1 - \phi)^{(1-x)} \\ \mathbb{E}_{\text x}[\text x] = \phi \\ \mathrm{Var}_{\text x}( \text x) = \phi (1- \phi)P ( ×=1 )=ϕP ( ×=0 )=1ϕP ( ×=× =ϕ× (1) _( 1 x )E×[ × ]=ϕ私たち_×( × )=ϕ ( 1) _

ガウス分布

正規分布(正規分布) (\rm 正規 \ 分布)とも呼ばれます。(正規分布) N (x; μ ,  σ 2) = 1 2 π σ 2 {mathcal\2σ22)μx(e
N ( x ;メートルp2 )=2_21 e2P _2( x μ )2
場合によってはβ = 1 σ 2 \beta = \frac{1}{\sigma^2}b=p21分布の精度を示します中心極限定理では、多数の独立した確率変数の合計は正規分布に近似するため、ノイズは正規分布していると考えることができます
ガウス分布

指数分布

f ( x ) = { λ e − λ x 、 x > 0 0 、その他。f(x) = \begin{case}\lambda e^{-\lambda x}, &x \gt 0\\0, &\text{other.}\end{case};f ( x )={ λ eλ x0バツ>0その他

デフォルト値
p ( x ; λ ) = λ 1 x ≥ 0 e − λ xp(x;\lambda) = \lambda \太字記号 1_{x \geq 0} e^{-\lambda x};p ( x ;l )=l1 _x 0eλ x
指数分布は指標関数1 x ≥ 0 \boldsymbol 1_{x \geq 0} を1x 0xxのときに作るxが負の値の場合、確率は0 00

ラプラス \rm ラプラス場所分布_ _ _ _ _ _

いつでも許可しますμ \muμ は無限小
p ( x ; γ , μ ) = 1 2 γ および − ∣ x − μ ∣ γ p(x;\gamma, \mu) = \frac{1}{2 \gamma} および ^{- \frac{ \左 | x - \mu \right |}{\gamma}}p ( x ;c メートル=2c _1ec x μ
ここに画像の説明を挿入

共通機能

シグモイド \rm シグモイドシグモイド関数_ _ _ _ _ _

σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}}σ ( x )=1+e×1
ここに画像の説明を挿入

この関数は通常、ベルヌーイ分布のパラメータϕ \phiを生成するために使用されます。ϕ、その範囲は( 0 , 1 ) (0,1)( 0 ,1 )飽和は、関数の引数が大きくなったり小さくなったりすると発生します。つまり、関数が入力の小さな変化に鈍感になること

ソフトプラス \rm ソフトプラスソフトプラス機能_ _ _ _ _ _

ξ ( x ) = log ⁡ ( 1 + ex ) \zeta(x) = \log (1 + e^x)z ( x )=ログ( 1 _+e×

関数名は別の関数から来ていますR e LU \rm ReLUR e L U
x + = max ⁡ { 0 , x } x^+ = \max\{0, x\}バツ+=最大{ 0 ,この関数は、正規分布パラメータμ 、 σ \mu、 \sigma
を生成するために使用できます。メートルσ、範囲は( 0 , ∞ ) (0, \infty)( 0 ,
ここに画像の説明を挿入

ベイズ則

既知のP ( y ∣ x ) P(\text y \mid \text x)P (x )计算P ( x ∣ y ) P(\text x \mid \text y)P ( ×y )
P ( x ∣ y ) = P ( y ∣ x ) P ( x ) P ( y ) = P ( y ∣ x ) P ( x ) ∑ x P ( y ∣ x = x ) P ( x = x ) P( \text x \mid \text y) = \frac{P(\text y \mid \text x)P(\text x)}{P(\text y)} = \frac{P(\text y \mid \text x)P(\text x)}{\sum_x P(\text y \mid \text x = x) P(\text x = x)}P ( ×y=P P (x ) P ( x )=×P (バツ=x ) P ( x=× P (x ) P ( x )
P ( y ) P(\text y)を知らずにP ( y )の値。

情報理論

考え: 可能性が低いイベントには、可能性が高いイベントよりも多くの情報が含まれています。

情報は次の 3 つの条件を満たす必要があります。

  • 発生する可能性が非常に高いイベントはあまり有益ではなく、極端な場合には、発生が保証されているイベントは有益ではありません。
  • 可能性が低いイベントほど有益です
  • 独立したイベントには増分情報が必要ですたとえば、表が 2 回出たコイン トスは、表が 1 回出たコイン トスの 2 倍の情報を伝える必要があります。

自己情報: イベントx = x \text x = xバツ=xの自己情報は、
I ( x ) = − log ⁡ P ( x ) I(x) = - \log P(x) です。× =ログ_P ( x )
ログ ⁡ \loglog は自然対数を表し、その底はeeですe情報の単位は nats( nats ) (\rm nats)(ないです) _ _ 2 2の場合2をベースとし、単位は bits( bits ) (\rm bits)(ビッツ) _ _ _

シャノン エントロピー: 確率分布全体における不確実性の合計量を定量化するために使用されます。つまり、符号化理論における最適な符号長です。
H ( x ) = − E x 〜 P ( x ) [ log ⁡ P ( x ) ] = − ∑ x P ( x ) log ⁡ P ( x ) H(\text x) = -\mathbb{E}_{ x \sim P(x)}[\log P(x)] = -\sum_{x}P(x)\log P(x)H ( × )=−E _x P ( x )[ログ_P ( x ) ]=バツP ( × )ログ_P ( × )
ここに画像の説明を挿入

# 香农熵 plot
p = np.linspace(1e-6, 1 - 1e-6, 100)
entropy = - p * np.log(p)
plt.figure(figsize=(6, 4))
plt.plot(p, entropy)
plt.xlabel('p')
plt.ylabel('entropy(nats)')
plt.savefig('entropy.jpg', dpi=300)
plt.show()
def Shannon_Entropy(string):
    """
    计算最优编码长度
    :param string:
    :return:
    """
    entropy = 0
    for ch in range(0, 256):
        Px = string.count(chr(ch)) / len(string)
        if Px > 0:
            entropy += -Px * math.log(Px, 2)
    return entropy


message = "".join([chr(random.randint(0, 64)) for i in range(100)])
print(message)
# .1??@41-'7;<;!
# / +
# =;9!<"6#0%3
print(Shannon_Entropy(message))
# 5.419819909835648

結合エントロピー: 同時に複数のイベント、複数の確率変数のエントロピーを考慮します。
H ( X , Y ) = − ∑ x , y P ( x , y ) log ⁡ P ( x , y ) H(X, Y) = -\ sum_{x,y} P(x, y) \log P(x,y)H ( X ,=x yP ( x ,yログ_P ( x ,y )
条件付きエントロピー: ある出来事が起こったときの別の出来事のエントロピー
H ( X ∣ Y ) = − ∑ y P ( y ) ∑ x P ( x ∣ y ) log ⁡ P ( x ∣ y ) H (X \ミッド Y) = - \sum_y P(y) \sum_x P(x \ミッド y) \log P(x \ミッド y)H ( X=yP バツP ( ×yログ_P ( ×y )
相互情報量: 2 つのものの交差する部分を示します。
I ( X , Y ) = H ( X ) + H ( Y ) − H ( X , Y ) I(X,Y) = H(X) +H(Y) - H(X,Y)( X =H ( X )+H ( Y )H ( X ,Y )
情報変化: 2 つのものの情報のうち、互いに素な部分を指します。
V ( X , Y ) = H ( X , Y ) − I ( X , Y ) V(X,Y) = H(X, Y) - I(X,Y)V ( X ,=H ( X ,( X Y )
KL \rm KLK L発散: 2 つの分布P ( x ) P(\text x)P ( x )Q ( x ) Q(\text x)Q ( x )
DKL ( P ∣ ∣ Q ) = E x 〜 P [ log ⁡ P ( x ) Q ( x ) ] = ∑ P ( x ) log ⁡ P ( x ) Q ( x ) D_{ \rm KL}(P \mid \mid Q) = \mathbb{E} _{\text x \sim P}\left[\log \frac{P(x)}{Q(x)} \right] = \sum P(x) \log \frac{P(x)}{Q(x)}DKL _( P=Ex P[ログ_Q ( × )P ( x )]=P ( × )ログ_Q ( × )P ( x )

DKL ( Q ∣ ∣ P ) = E x 〜 Q [ log ⁡ Q ( x ) P ( x ) ] = ∑ Q ( x ) log ⁡ Q ( x ) P ( x ) D_{\rm KL}(Q \mid \mid P) = \mathbb{E} _{\text x \sim Q}\left[\log \frac{Q(x)}{P(x)} \right] = \sum Q(x) \log \frac{Q(x)}{P(x)}DKL _( QP )=E×〜Q _[ログ_P ( × )Q ( x )]=Q ( × )ログ_P ( × )Q ( x )

たとえば、DKL ( P ∣ ∣ Q ) ≠ DKL ( Q ∣ ∣ P ) D_{\rm KL}(P \mid \mid Q) \neq D_{\rm KL}(Q \mid \mid P)DKL _( P=DKL _( QP )

\ビッグスター: 離散確率変数では、KL \rm KLK L発散は、QQにするように設計された方法を使用するときに測定されますQによって生成され、確率分布PPP がシンボリック メッセージを生成するときに必要な追加情報の量

from scipy.stats import entropy  # 内置KL散度
import numpy as np


def KL_Divergence(p, q):
    """D(P || Q)"""
    return np.sum(np.where(p != 0, p * np.log(p / q), 0))


p = np.array([0.1, 0.9])
q = np.array([0.1, 0.9])

print(KL_Divergence(p, q))  # 0.0

print(entropy(p, q))  # 0.0  
# 两个分布一样
from scipy.stats import norm, entropy
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1, 10, 1000)
y1 = norm.pdf(x, 3, 0.4)
y2 = norm.pdf(x, 6, 0.4)
P = y1 + y2  # 构造p(x)

KL_PQ = []
KL_QP = []
Q_list = []
for mu in np.linspace(0, 10, 100):
    for sigma in np.linspace(0.1, 5, 50):
        Q = norm.pdf(x, mu, sigma)
        Q_list.append(Q)
        KL_PQ.append(entropy(P, Q))
        KL_QP.append(entropy(Q, P))
# 寻找Q使得KL_PQ最小
KL_PQ_min = np.argmin(KL_PQ)
# 寻找Q使得KL_QP最小
KL_QP_min = np.argmin(KL_QP)

plt.rcParams['font.family'] = ["Times New Roman"]
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].plot(x, P / 2, 'g-', label="$\\bf P(x)$")
axes[0].plot(x, Q_list[KL_PQ_min], 'b-.', label="$\\bf {Q^{*}(x)}$")
axes[0].set_ylim(0, 1.2)
axes[0].set_xlabel("$\\bf x$")
axes[0].set_ylabel("$\\bf P(x)$")
axes[0].set_title("$\\bf \\rm \\arg\\min_{Q}(KL(P||Q))$")
axes[0].legend()

axes[1].plot(x, P / 2, 'g-', label="$\\bf P(x)$")
axes[1].plot(x, Q_list[KL_QP_min], 'r-.', label="$\\bf {Q^{*}(x)}$")
axes[1].set_ylim(0, 1.2)
axes[1].set_xlabel("$\\bf x$")
axes[1].set_ylabel("$\\bf P(x)$")
axes[1].set_title("$\\bf \\rm \\arg\\min_{Q}(KL(Q||P))$")
axes[1].legend()

plt.savefig("./images/KL.jpg", dpi=300)
plt.show()

ここに画像の説明を挿入

クロスエントロピー: A とKL \rm KLKLダイバージェンスと密接に関係する量は、クロスエントロピーです。意味は実際の出力確率QQQと期待出力確率PPPとの距離。
H ( P , Q ) = H ( P ) + DKL ( P ∣ ∣ Q ) = − E x 〜 P [ log ⁡ Q ( x ) ] = − ∑ x P ( x ) log ⁡ Q ( x ) \begin{整列} H(P,Q) &= H(P) + D_{\rm KL}(P \mid \mid Q) = - \mathbb{E}_{x \sim P} [\log Q(x) ] \\ & =-\sum_{x}P(x)\log Q(x) \end{aligned}H ( P =H ( P )+DKL _( P=−E _x P[ログ_Q ( × ) ]=バツP ( × )ログ_Q ( x )
二値分類の場合、クロスエントロピーの計算方法は次のとおりです。
H ( P , Q ) = − 1 N ∑ x P ( x ) log ⁡ Q ( x ) + ( 1 − P ( x ) ) log ⁡ ( 1 − Q ( x ) ) H(P,Q) =- \frac1N\sum_x P(x) \log Q(x) + (1- P(x))\log (1-Q(x))H ( P =N1バツP ( × )ログ_Q ( × )+( 1P ( x ) )ログ( 1 _Q ( x ) )

ここでP ( x ) P(x)P ( x )はサンプルxxxの目的の (真の) ラベル、正のクラスの場合は 1、負のクラスの場合は 0;Q ( x ) Q(x)Q ( x )は、モデルが実際にサンプルxxxカテゴリが正である確率。NNN はサンプル数を表します。

3 3があるとします。真のクラス ラベルがP = ( 1 , 0 , 1 ) P = (1, 0, 1)である3 つのサンプルP=( 1 0 1 )、実際の予測サンプルが正である確率はQ = ( 0.8 , 0.1 , 0.7 ) Q=(0.8, 0.1, 0.7)Q=( 0 . 8 0 1 0.7 ) . _ _ 次のように、目的の出力と実際の出力の間のクロス エントロピーを計算します。

from sklearn.metrics import log_loss
import numpy as np

P = np.array([1, 0, 1])
Q1 = np.array([0.8, 0.1, 0.7])
Q2 = np.array([0.1, 0.7, 0.3])
# binary_ent = 0.0
# for i in range(P.size):
#     binary_ent += P[i] * np.log(Q1[i]) + (1 - P[i]) * np.log(1 - Q1[i])
# print(-binary_ent)  # 0.6851790109107685
binary_ent1 = - P * np.log(Q1) - (1 - P) * np.log(1 - Q1)
binary_ent2 = - P * np.log(Q2) - (1 - P) * np.log(1 - Q2)

print(binary_ent1.sum() / P.size)  # 0.22839300363692283
print(binary_ent2.sum() / P.size)  # 1.5701769005486392
# np.log 为自然对数

print(log_loss(P, Q1))
print(log_loss(P, Q2))
# 0.22839300363692283
# 1.5701769005486392

上記の結果から、予測値Q1 Q1Q 1のクロスエントロピーは、Q 2 Q2 のQ 2は小さく、Q 1 Q1Q1予測は期待値に近づいています。

多分類の場合、クロスエントロピーの計算方法は次のとおりです。
H ( P , Q ) = − 1 N ∑ i = 1 N ∑ j = 1 MP ( xi , j ) log ⁡ ( Q ( xi , j ) ) H (P ,Q) = -\frac1N\sum_{i=1}^N \sum_{j=1}^MP(x_{i,j})\log(Q(x_{i,j}))H ( P =N1i = 1Nj = 1MP ( × j)log ( Q ( x _ j))
其中, P ( x i , j ) P(x_{i,j}) P ( × j)サンプルxi x_iバツ私は真のクラスラベルはjjですj1 11、それ以外の場合は0 00Q ( xi , j ) Q(x_{i,j})Q ( × j)サンプルxi x_iバツ私はjjthとして予測されるクラスjの確率NNNはサンプルサイズ、MMMはクラス ラベルの数です。

3 3があるとします。サンプル数3 個、合計0 〜 9 0\sim9010 点中9点10クラスラベル10枚PPP はサンプルの実ラベル (ベクトル) を表します;QQQ は、各サンプルのモデルのカテゴリ予測の値を表します。これは3 3310 101 0列の行列。各行はサンプルのペアを表しますiのカテゴリ予測確率値から構成されるベクトルで

import numpy as np
from sklearn.metrics import log_loss
from sklearn.preprocessing import LabelBinarizer

P = np.array(['1', '5', '9'])  # 样本的真实标签

Q = np.array([
    [0.1, 0.7, 0, 0, 0.01, 0.19, 0, 0, 0, 0],
    [0, 0.1, 0, 0.1, 0, 0.8, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0.1, 0, 0.9]
])  # Q[i]是一个向量 Q[i][j]表示P[i]被预测为j类的概率

labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']  # 标签集合
sklearn_multi_ent = log_loss(P, Q, labels=labels)
print(sklearn_multi_ent)  # 0.22839300363693002

# 根据公式计算
# 先对类别标签进行二值化为0&1  数字标签和非数字标签都需要
LB = LabelBinarizer()
LB.fit(labels)
bin_P = LB.transform(P)  # 真实标签进行转换
print(bin_P)
# [[0 1 0 0 0 0 0 0 0 0]
#  [0 0 0 0 0 1 0 0 0 0]
#  [0 0 0 0 0 0 0 0 0 1]]

N = P.size
M = len(labels)
eps = 1e-15  # 预测概率的控制值

multi_ent = 0.0
for i in range(N):
    for j in range(M):
        if Q[i, j] > 1 - eps:
            Q[i, j] = 1 - eps
        if Q[i, j] < eps:
            Q[i, j] = eps
        multi_ent += -bin_P[i, j] * np.log(Q[i, j])

print(multi_ent / N)  # 0.22839300363692283

PPと仮定します。Pは期待される (真の) 分布QQQはモデル (実際の) 分布でありクロス エントロピーH ( P , Q ) H(P,Q)H ( P Q )モデル分布を実際の分布に近づけることができます

参考文献

[1]「Deep Learning」フラワーブック
[2]関連github

おすすめ

転載: blog.csdn.net/qq_41139677/article/details/120924103