実体と情報のはざま

いつかデータサイエンティストになって世界を読み解く仕事がしたい!

自己組織化マップSOM(Self-OrganizingMap)に挑戦した!

 今回は、ずっと気になっていたSOMに挑戦!アルゴリズムはコーエン博士の本を購入してなんとか分かってきていたので、さっそく勉強中のPythonでプログラミングを試してみた。ライブラリーを使えば簡単なのだろうけど、いつか自分でこの手のアルゴリズムを作りたいと思っている(何年後?)ので、フルスクラッチでやってみたい。
変な結果に。。
 3日がかり。。といっても仕事と子育てで実働6時間弱ってとこだけど。
 やってみたのは、自己組織化マップの世界ではおなじみ(?)の色の分類。はじめランダムなんだけど、徐々に入力した色を中心とした分類が見えてくるってやつ。何に苦労したかというと、そもそもの理論とPython。全部か。いざプログラミングを始めてみたら、理解したと思っていたバッチ方式のSOMの理論に自信がなくなってきて上記の本に何度かもどった。Pythonの行列の扱いもまだ体に染み付いてない。。行列の列の和をもとめてベクトル化する方法とか知らんかったし。
 で、なんとか書き上げたのがコレ!for文とか多いしdef(定義)も使ってなくて見通しが悪いし、素人の私が見てもブサイクなコードだとすぐわかる。。次回はもっとブラッシュアップしてキレイに仕上げたいな~。

import numpy as np
import matplotlib.pyplot as plt

########################パラメータの設定
n=3#入力ベクトルの数
f=3#入力ベクトルの要素数
sgm0=2#誤差に関するパラメータ
T=10#繰り返し回数
cx=12#マップのx方向の数
cy=12#マップのy方向の数

###########################行列の設定
X=np.zeros((n,f))#入力行列
X[0,:]=([1,0,0])#R
X[1,:]=([0,1,0])#G
X[2,:]=([0,0,1])#B
M=np.random.random((cx*cy,f))#マップ中の各サイトの値が入った行列
R=np.zeros((cx*cy,2))#マップ中のサイトの位置が入った行列
j,k=0,0
for i in range(0,cx*cy):
    j=j+1
    R[i,0]=j-1
    R[i,1]=k
    if j > cx-1 :
        j=0
        k=k+1
Ita=np.zeros((n,cx*cy))#更新に使う係数
fig1=plt.figure(1)
for j in range(0,cx*cy):
    plt.scatter(R[j,0],R[j,1],color=(M[j,0],M[j,1],M[j,2]),s=200,alpha=0.9,marker='s')

###########################繰り返しの実行
for t in range(0,T):
    for i in range(0,n):
        min=1
        for j in range(0,cx*cy):
            d=np.linalg.norm(X[i,:]-M[j,:])
            if d<min:
                min=d
                Ci=j
        sgm=sgm0*(T-t)/T
        for j in range(0,cx*cy):
            D=np.linalg.norm(R[j,:]-R[Ci,:])
            Ita[i,j]=np.exp(-((D/sgm)**2)/2)
    s=np.sum(Ita,axis=0)#列方向に和をとる(axis=1なら行方向)
    for j in range(cx*cy):
        p=np.zeros((n))
        for i in range(0,n):
            p=p+(Ita[i,j]*X[i,:])
        M[j,:]=p/s[j]
fig2=plt.figure(2)
for j in range(0,cx*cy):
    plt.scatter(R[j,0],R[j,1],color=(M[j,0],M[j,1],M[j,2]),s=200,alpha=0.9,marker='s')

この結果はこんな感じ。まずランダム。入力はRed,Green,Blueの3色。
f:id:myuteru:20170518001851p:plain
次が、自己組織化の結果。黒いところは多分エラーが出たとこ。
f:id:myuteru:20170518001911p:plain
 この結果、何かが違う。入力した色しかないし。マップを大きくするとすぐエラーが出るし。パラメーターをちょっといじるとやっぱりすぐエラーになるしで微妙~。だけど正解に近づいた気がして嬉しー!!次回はうまくできているかの検証も含めてやってみたい。
 あと、最近このブログを読んでくださる方が増えてきたようなので、プログラムの載せ方や注釈なども時間をかけたいと思う。☆マークをつけてくださった方もいらっしゃって、感無量です。今は記事を書くこと(自分のレベルアップ)に夢中で、まわりが見えてないです。はてなブログの仕組みもいまいち理解できてないです、落ち着いたら皆さんのブログを訪問したいと思います。