suzuzusu日記

(´・ω・`)

しょぼん(´・ω・`)基底をGPLVMで獲得する

データの作成

以下の画像から,しょぼん(´・ω・`)基底を作成します.

f:id:suzuzusu:20191106035235p:plain
オリジナル画像

まず,画像を読み込みます.

import numpy as np
from PIL import Image
image = np.asarray(Image.open('./data/shobon.png').convert('L'))

次に,2値化を行いしょぼん(´・ω・`)基底を作成します.

# binarization
a = np.where(image < 240)
shobon = np.c_[a[1], np.flipud(a[0])]
# shobon.shape = (896, 2)

プロットすると以下のような,しょぼん(´・ω・`)基底が得られたことが確認できます.

f:id:suzuzusu:20191106035727p:plain
しょぼん(´・ω・`)基底

高次元変換

ガウス分布に従う重みを用いて,100次元の高次元にしょぼん(´・ω・`)基底を変換します. そしてノイズを加えておきます.

dim = 100
w = np.random.normal(size=2*dim).reshape(2, dim)
high = shobon @ w
high = high + np.random.normal(size=high.shape[0]*high.shape[1]).reshape(high.shape[0], high.shape[1])
# high.shape = (896, 100)

GPLVMによる低次元埋め込み

Gaussian Process Latent Variable Models(GPLVM)とはガウス過程を利用して潜在変数空間に変換する教師なし学習アルゴリズムです. 応用例として以下の動画のように人間のポーズを低次元埋め込みするなどの試みがあります.

今回はGPLVMを使うためにGPyを使用します.

GPLVMを使って100次元のデータを2次元の低次元埋め込みをします.

# latent
gplvm = GPLVM(high, 2)
latent = gplvm.X
# latent.shape = (896, 2)

結果

得られた潜在変数をプロットすると以下のようになります.

f:id:suzuzusu:20191106040414p:plain
潜在変数

しょぼん(´・ω・`)基底と似たものが獲得できたので成功ですね!!

実装

github.com

参考