ネット上に氾濫する自己組織化マップ（SOM）の情報を俺が整理する【随時更新】

【**こちらの記事は新しい情報を見つけ次第、更新していきます。また皆さんからの「こんなのもあるよ！」も大歓迎です！**】
# はじめに
皆さんは自己組織化マップもしくは自己組織化写像（Self-Organizing Maps: SOM）と呼ばれる手法をご存知でしょうか？多変量データの可視化などに使われるアルゴリズムで、現在の機械学習やデータ解析ブームの遥か昔から使われてきました。

しかし、私が思うにSOMは非常に「**初見殺し**」な手法です。SOMについて学ぼうとする人の多くは、ネット上のあらゆる種類の情報に惑わされ、用途に対してあまり適切な説明がされていないテキストで学んでしまうことも少なくありません。その理由は大きく2つあります。

1. **二つの解釈があり、それぞれで適切な運用方法も異なる**  
SOMには脳機能のモデル化というサイエンス的な側面とデータ解析という工学的な側面があります。元々は前者の発想で考案されたものですが、「データ解析に使えるんじゃない？」と工学的な応用がどんどん進み、応用の観点からアルゴリズムがどんどん洗練されてきたという経緯があるからです。片方の解釈では当然の使い方も、もう片方ではナンセンス、ということもしばしばあります。
2. **複数の用途があり、それぞれの用途に合った運用方法まで言及されていないことが多い**  
SOMは主に高次元データの可視化に使われますが、構造的にベクトル量子化、クラスタリング、データのモデリングなども行うことができます。これまた用途によって適切な運用方法は異なるので、注意する必要があります。

「この解釈でこの用途に特化して説明するよ」と前置きのある説明や、この辺りをうまく整理している説明であれば問題ありませんが、大抵の場合はその前置きや整理がないものが多いので、初学者が自分のやりたいことに合った説明にたどり着けない、もしくはたどり着いていないことにすら気づけないのです。

そこで今回はネット上にあるSOMに関する解説記事をできる限り多く収集し、「この記事はこういう解釈で、こんな使い方を想定してる」という補助線を引いていきたいと思います。また、用途別で私的オススメ記事なんかもピックアップしていこうという所存です。卒研でSOMやれって言われた！みたいな学生さんに参考にしていただけると嬉しいです。


# 工学的な応用重視の記事
先に最低限のただし書きをしておくと、SOMのアルゴリズムにはオンライン型とバッチ型の２種類があります。SOMの発明者であるコホネンの[2013年の論文](https://www.sciencedirect.com/science/article/abs/pii/S0893608012002596)[^1]ではデータ解析用途に関してはバッチ型の方を推奨しています[^2]。歴史的にはオンライン型の方が先に開発されているため、オンライン型だけを説明している記事も多く、どちらのアルゴリズムを説明しているかは重要なポイントです。これ以降はどちらのアルゴリズムについて説明されているかも合わせて紹介していきます。
[^1]: 英語が苦ではない方、なおかつScienceDirectから論文をダウンロードできる環境にある方はまずこの論文を読むことをオススメします。
[^2]: 個人的にもバッチ型の方が学習が安定するように思います。[このページ](http://www.brain.kyutech.ac.jp/~furukawa/data/som.html)のデモが分かりやすいと思います。ただしデータが大量にあって全データをオンメモリで処理することが難しいような場合はバッチ型は必然的に使えないため、その場合はミニバッチにするのが良いと思われます。（ここからは2019年12月17日追記）私の指導教員曰く、オンライン型で学習がうまくいかないのは各参照ベクトルの更新スピードが不均一になってしまうためで、そこをうまく調整すればオンライン型でもうまくいくそうです。そのような言及をしてある文献でもない限り、基本的にデータ解析向きの文脈でオンライン型を紹介しているページを見つけたら一旦立ち止まることをお勧めします。
## [自己組織化マップ入門](http://www.brain.kyutech.ac.jp/~furukawa/data/SOMtext.pdf)
- 特徴
    - イントロでSOMの歴史やどのような解釈がなされているのか概観
    - バッチ型アルゴリズムの説明

    - 具体的な運用方法、例えばパラメータの設定方法やデータが増えた時の対策の説明
    - 他の機械学習手法との繋がりについても言及
- おすすめ読者
    - SOMってなんや？って人
    - SOMを使ってみたいという人
    - 実際に使っているが適切な運用方法が分からない人

## [自己組織化マップ (Self-Organizing Map: SOM) について概括する](https://qiita.com/tohru-iwasaki/items/e51864269767ccc07254)
- 特徴
    - データのモデリング（生成モデル）という観点からの説明
        - SOMを既に少し知っている人向けのQ and Aも有り、他の解釈とのギャップを埋めることもできる
    - バッチ型アルゴリズムを説明
    - SOMが解いている問題をかなり明確に数式で定義している
- おすすめ読者
    - 機械学習の他の手法をいくつか知っている
    - VAEやGANといった（深層）生成モデルにも興味がある
    - 他のSOMに対する説明を読んだことがある

## [5分で分かる自己組織化マップ](https://www.slideshare.net/DaisukeTakai/5-13781247)
- 特徴
    - SOMを多変量データの可視化手法だと捉えた上での平易な言葉での説明
    - オンライン型アルゴリズムの説明

## [Rと自己組織化マップ](https://www1.doshisha.ac.jp/~mjin/R/Chap_30/30.html)
- 内容
    - オンライン型アルゴリズムの概要の紹介
    - Rのパッケージ（複数種類）の利用方法の説明
- おすすめ読者
    - RでSOMを使いたい人

## [自己組織化特徴マップ](http://www.sist.ac.jp/~kanakubo/research/neuro/selforganizingmap.html)
- 特徴
    - オンライン型アルゴリズムの説明
    - 似ているデータをマップ上で近い位置に集める、という観点での応用例を紹介

## [データマイニングにおける自己組織化マップの間違った使い方の例](http://www.mindware-jp.com/basic/machigai.html)
- 特徴
    - SOMの「間違った利用方法」についてかなり具体的に言及
        - オンライン型ではなくバッチ型、etc.
        - [自己組織化マップ入門](http://www.brain.kyutech.ac.jp/~furukawa/data/SOMtext.pdf)と一致する部分も数多く見受けられる
- おすすめ読者
    - 実際にSOMを使っている人

## [Kohonenの自己組織化マップをpythonで実装](http://technocrat.hatenablog.com/entry/2015/02/12/014557)
- 特徴
    - 生成モデルとしてのSOMにも少し言及
    - オンライン型アルゴリズム
    - pythonによる実装
    - ランダムなRGBデータに対する実験[^3]

[^3]: （この記事の趣旨からは外れますがあくまで個人的な意見として）SOMに対するタスクとしてしばしばこのデータを与えますが、生成モデルとしてSOMを解釈する際にはtypical exampleではないような気がします。SOMは事前に指定された次元の多様体をデータセットにフィッティングさせようとしているわけですが、ランダムのRGB値は3次元空間中で立方体状（3次元多様体状）に分布するため、この場合だとうまくフィッティングできないデータセットの例ということになります。

# サイエンス的な脳との繋がりを重視した記事
こちらの方は私がニューロサイエンスにあまり明るくないので、「おすすめ読者」については言及しません。

## [子供でもわかる「自己組織化マップ」](http://gaya.jp/spiking_neuron/som.htm)
- 「自己組織化」とSOMの関わりについて平易な文章で書かれている記事





# 最後にオススメ学習ルート
- データ解析用途で
    - 完全初心者の方
        - [自己組織化マップ入門](http://www.brain.kyutech.ac.jp/~furukawa/data/SOMtext.pdf)から読む
    - 機械学習をある程度知っている方
        - [自己組織化マップ (Self-Organizing Map: SOM) について概括する](https://qiita.com/tohru-iwasaki/items/e51864269767ccc07254)を読んだあと[自己組織化マップ入門](http://www.brain.kyutech.ac.jp/~furukawa/data/SOMtext.pdf)を読む
- ニューロサイエンス的な観点で
    - ネット上の記事で詳しく言及しているものは見つけきれていません…誰か教えてください。

本記事がこれからSOMを学ぶ上での参考になると幸いです！
それではみなさん素敵なSOMライフをお過ごしください！

# おまけ
うちの研究室メンバーが実装したSOM関連のアルゴリズムのコードを公開しているリポジトリが以下になります！
https://github.com/furukawa-laboratory/somf
Pythonで手っ取り早く動かしたい！みたいな方にオススメです！