【Python】T-SNEで新しいデータだけをプロットしたい時(推論したい時)【openTSNE】

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で十分そうです。

その他

コメント

タイトルとURLをコピーしました