17. ? 尖度(4次のモーメント)
( x) = E[ x ] ? 3{E[ x ]} ? 4 E[ x ]E[ x] + 12 E[ x ]{E[ x]} ? 6{E[ x]}
4 2 2 3 2 2 4
κ4
? ネゲントロピー
J ( y ) = H ( y gauss ) ? H ( y ),
H ( y ) = ? ∫ p ( y ) log p( y ) dy p( y ) :分布の確率密度関数
ネゲントロピーを計算するためには確率密度関数を近似する必要が
あるので,後ほど近似関数を導入する.
16
22. 2.4 FastICAアルゴリズム
? 収束が速い(3次収束).
? 最適化手法としてNewton法を使用.
? 独立性の指標は,ネゲントロピーを使用.
max E[ g i ( y i )], i = 1,… , N λ T
yi = wi x
E[ g i ( y i )] + w i w i = max .
s.t . w i = 1. 2
21
23. λ T
E[ g i ( yi )] + w i w i = max .
2
上式を微分すると,次の方程式の解を求める問題に帰着する.
f ( x i ) = E[ x i g i ( yi )] + λw i = 0.
Newton法を用いて,重みベクトルを求める.
w i( k +1) = w i( k ) ? f ( z i ) / f ' ( z i )
E ( z i g ( w i( k ) )) + λw i( k )
= w i( k ) ? T
E ( g ' ( w i( k ) z i )) + λ
T
∝ E ( z i g ( w i( k ) ) w i( k ) ) ? E ( g ' ( w i( k ) z i ))
ネゲントロピーは,以下の式で近似することが多い.
g1 ( y ) = tanh(ay ), g 2 ( y ) = y exp(? y 2 / 2), g 3 ( y ) = y 3 ,
22
24. FastICA
p : 推定する独立成分の個数, m :独立成分のカウンタ(初期値=1)
1.(中心化) データを中心が原点になるように変換する:
1 n
x i' = x i ? ∑ x j
'
n j =1
2.(白色化) ' を白色化(主成分分析)して,データ点 i を得る:
x z
i
3. 各独立成分に対するの射影方向 p の初期値をランダムに与える.w
m=1, 2, ???, p に対して以下を行う.
w
4. 次式に従って p を更新する:
w p ← E[ z i g ( w T ) w p ] ? E[ g ' ( w T ) z i ]
p p
p ?1
5. 次式に従ってを正規直交化する: w p ? ∑ (w T w p )w j
j
j =1
wp ← p ?1
w p ? ∑ (w T w p )w j
j
j =1
6. w pが収束していない場合は,step.4に戻る.
7. mを1つインクリメントし,の場合はstep.4に戻る.
23
30. # 減次法によるFastICA
def ica_deflation(x, n_comp, alpha, maxit, tol, w_init):
n, p = x.shape
# 求める射影ベクトルの結果を格納するオブジェクト
w_res = np.zeros((n_comp, n_comp))
# step.4-7 各独立成分を求める
for i in np.arange(n_comp):
w = w_init[i, ].T
t = np.zeros((n_comp, np.size(w)))
# 既に求められている独立成分と直交するように変換
if i > 0:
k = np.dot(w_res[0:i, ], w)
t = (w_res[0:i, ].T * k).T
w -= t.sum(axis=0)
w /= np.linalg.norm(w)
29
31. # 誤差,反復回数カウンタの初期化
lim = np.repeat(1000.0, maxit); it = 0
# 独立成分の探索
while lim[it] > tol and it < maxit:
# step.4 wpの更新
wx = np.dot(x, w)
gwx = np.tanh(alpha * wx)
gwx = np.repeat(gwx, n_comp).reshape(np.size(gwx), n_comp)
xgwx = x * gwx
v1 = xgwx.mean(axis=0)
g_wx = alpha * (1 - (np.tanh(alpha * wx))**2)
v2 = np.dot(np.mean(g_wx), w)
w1 = v1 - v2
it += 1
t = np.zeros((n_comp, np.size(w)))
# step.5 Gram-Schmidtの正規直交化
if i > 0:
k = np.dot(w_res[0:i, ], w1)
t = (w_res[0:i, ].T * k).T
w1 -= t.sum(axis=0); w1 /= np.linalg.norm(w1)
# step.6 収束判定
lim[it] = abs(abs(sum(w1 * w)) - 1.0)
w = w1
w_res[i, ] = w
return w_res
30