sklearnのt-sneでは、すべてのデータを学習させて
それを低次元空間にマッピングすることしかできません(間違っていたらすいません)。
つまり、あるデータ群で学習しておいて、
新しいデータが来たらそれだけを低次元空間にマッピングするということはできません。
しかし、いくつか方法がありました。個人的に一番良いと思ったの openTSNEというライブラリがあるのでそれを使うことです。 それ以外もいくつかあったのでメモしておきます。
openTSNE
openTSNEはTSNE専用のライブラリで学習に用いてない新しいデータを 埋め込みや、
膨大なデータに対しても動くように設計されています。
githubは以下のリンクになります。
https://github.com/pavlin-policar/openTSNE
使い方も簡単で、pipでインストールできます。
(anaconda等でもインストールできます。github上のreadmeを見てください)
pip install opentsne
使い方も簡単です。 (以下はreadmeと同じです)
from sklearn import datasets
iris = datasets.load_iris()
x, y = iris["data"], iris["target"]
from openTSNE import TSNE
embedding = TSNE().fit(x)
新しいデータを予測する際にはtransform関数を用います。
test_emb = embedding.transform(x_test)
parametric t-sne
これはt-sneをニューラルネットワークで関数近似してあげたものです。
この手法であれば、t-sneのモデルが生成されるので、それを使って新しいデータの埋め込みができます。
論文は、 https://lvdmaaten.github.io/publications/papers/AISTATS_2009.pdf
githubでもソースコードが公開されています。
https://github.com/luke0201/parametric-tsne-keras
使ってみたところ、ニューラルネットワークの学習にけっこうなメモリと時間が必要です。
また、精度に関してもニューラルネットワークの設計など大変かもしれません。
(まだあまりちゃんと使っていないので、わかりません)
しっかり改善すれば、使えそうですが、あまり時間がない場合はopenTSNEで十分そうです。
コメント