t-SNE による高次元データの可視化

参考

概要

3次元でもやっとなのにそれ以上の次元のデータをプロットするにはどうにか次元削減をしないといけない. t-SNE はそのための一つの手法. Python ライブラリの scikit-learn の中に実装があるのでそれを使う. t-SNE して可視化するまでの一連をツールとして書いた.

本当はプロットするところは matplotlib を使おうと思ったけど gnuplot が当たり前にやってくれることが全然出来なくて酷いので gnuplot を使う. 特に点が混み合うような散布図を書くと、ユーザーが対話的に拡大したら移動したりしたくなる. terminal に Qt (あるいは X11 等) を使うとそれが可能なので便利.

実装

依存

使い方

   ./tsne.vis.py --help
Usage: tsne.vis.py [OPTIONS]

Options:
  -d TEXT              deliminator between the label and its vector
  -c TEXT              deliminator for the vector
  --dim INTEGER RANGE
  -o, --output TEXT    When no --output is specified, run gnuplot/Qt directly
  --help               Show this message and exit.

データフォーマット

<DATA> ::= <LINES>
<LINES> ::= <LINE> | <LINE> "\n" <LINES>
<LINE> ::= <LABEL> <D> <VECTOR>

<LABEL> ::= string
<D> ::= "\t" (-d で変更可能)

<VECTOR> ::= float | float <C> <VECTOR>
<C> ::= " " (-c で変更可能)

ラベルはプロット点にアノテートするのに使う. 要らないなら 'x' とか指定すればいい.

埋め込み次元

--dim では何次元空間に埋め込むかを指定する. 23 かが指定できてデフォルトは 2.

出力

gnuplot で可視化するまでの工程を任せる場合は -o を指定しない. 埋め込むデータが必要な場合は -o で出力先を指定する.