ガウス過程でググると上の方に www.jstage.jst.go.jp/article/isciesci/62/10/62_390/_pdf という神記事が見つかる。
ガウス過程の説明は色々あるが、私は結局この記事が一番理解できた。 そして結論だけが欲しかったら式 (21)-(23) と読むと分かる。
しかしこれはいわば学習データが \(N\) 個あるとすると \(N \times N\) 行列の逆行列を求めたりする必要があり、計算量的に辛いので、上手くデータを取捨選択して \(N\) を小さく抑えよう、みたいな話がそれより後ろに書いてある。
それは今回は飛ばす。
import math
import numpy
import numpy.random
from numpy.linalg import inv
# 今回は RBF カーネルを共分散に使う
def k(x1, x2, beta):
return math.exp(-beta * (x1 - x2) ** 2)
def gp(x, beta=0.1):
mu = numpy.zeros(x.shape) # 平均
K = numpy.array([[k(xi, xj, beta) for xj in x] for xi in x]) # 共分散
y = numpy.random.multivariate_normal(mu, K)
return y
x = numpy.array(list(range(-5, 6)), dtype='f')
y = gp(x)
plot(x, y)
そうするとこんなものが出力される.
カーネルの中に出現した beta というパラメータが共分散の強さを表している. 数字が小さいほど共分散の影響が強く出るので, 近い \(x\) には近い値が出て, 関数が滑らかに見える. 逆に大きいほど影響は小さくなり, バラバラの値に見える.
それを表したのが次図. 特に 0 のときは完全に定数関数になってしまう。
では \(N\) 個の点組 \(\{(x_i, y_i)\}\) にフィッティングしたあとのガウス過程はどうなっているかが実際の興味の対象である. これはさっきも言ったように資料の (21) を見ると計算式そのものが書いてある.
例えば観測データ(学習データ)として
# [-5, 6)
x = numpy.array(list(range(-5, 6)), dtype='f')
n = len(x)
y = 0.1 * x * x - x
が与えられたときの未知データ
# [6, 10)
x_unk = numpy.array(list(range(6, 10)), dtype='f')
m = len(x_unk)
への予測は次のように求まる.
# 観測データ内の共分散
Knn = numpy.array([[k(x[i], x[j]) for j in range(n)] for i in range(n)])
# 未知データとの間の共分散
Kmn = numpy.array([[k(x_unk[i], x[j]) for j in range(n)] for i in range(m)])
# 未知データ内の共分散
Kmm = numpy.array([[k(x_unk[i], x_unk[j]) for j in range(m)] for i in range(m)])
# 事後分布
mu = Kmn @ inv(Knn) @ y
vr = Kmm - Kmn @ inv(Knn) @ Kmn.T
# 予測値
y_pred = numpy.random.multivariate_normal(mu, vr)
結果を見ると,
x | y_true | y_pred |
---|---|---|
6.0 | -2.3999999999999995 | -2.397594644692645 |
7.0 | -2.0999999999999996 | -2.0834348677261736 |
8.0 | -1.5999999999999996 | -1.5414215447748163 |
9.0 | -0.9000000000000004 | -0.7698706846246797 |
かなり賢い.
HHKB の Hybrid 版がついこないだ発表されて, 早速 Amazon で購入した. おそらく用意してる在庫はギリギリに絞っているらしく, すぐに Amazon からも在庫がなくなり, 私の注文も発送されるまで3日待たされた. (もとより発送まで2-3日かかります, とは書いてあったので何も間違えてはいない.)
新しい HHKB は USB (Type-C) での接続と, Bluetooth での接続の両方が選択できる. たしか 2016 年の春に HHKB BT が発売されたのを覚えているが, それは Bluetooth のみの接続であった. しかも既に発売されている静音タイプ Type-S も採用されなかった. 今回は Hybrid では Type-S を採用したバージョンもある.
私は一番クラシカルな Pro2 モデル(USB Type-B で接続して静音でもない奴)と, Pro2 の Type-S のモデルと, それから HHKB BT の3つを持っている. Type-S は静音なだけでなく, 打鍵感も段違いで腱鞘炎になりにくい, と思う. 今回の Hybrid では BT に Type-S が採用されている. 待ちわびたモデルというわけだった.
ところで, 前回の HHKB BT を Ubuntu に bluetooth 接続するのは大変困難を極め, ついに諦めてしまった. もしかしたら当時の Ubuntu で Bluetooth 3(それ以上のちゃんとしたバージョンは分からない)に接続するのは駄目だったのかもしれない.
今改めて調べると
UbuntuでHHKB BTを使うための設定 - 塩焼きブログ
この方は普通に接続できてるようなので, 今となっては事情が違うのかもしれない.
さて HHKB Hybrid は bluetooth 4.2 である. 全くさくっとはいかず, 何度かPC側のbluetoothをon/offしたり, キーボードの電源をon/offしたりしたが, 三度目くらいで接続できた. bluetooth 接続には blueman
を用いた. HHKB の説明書にはもちろん Windows/MacOS の場合の説明しかないが, 「PC側で表示される数字をキーボード本体で入力してEnter」などと書いてあるが blueman
の場合, そういったものは経験上, 表示されない. ただ勝手に接続が成功するか, しないかである.
もうちょっと詳しく書くと, "Setup New Device" のウィザードはまるで役に立たなくて, "Devices" の画面でデバイスを選んで "Pair" を押す. 何の反応も無いように見えるが, ステータスバーの bluetooth のアイコンが変わってるかもしれない. しばらく待つと成功したりしなかったりする.
あ, そういえば, 罠として, DIP スイッチは bluetooth 接続中に変更しても意味がないというのがある. たぶん接続した瞬間の設定しか読まない.
MacOS だと, Karabina というソフトでそんなことが出来る. Ubuntu でもそういうことをしたい.
xinput
で各デバイスの状態を見たり操作出来る. また bluetoothctl
コマンドで bluetooth 接続状態が確認できる.
bluetoothctl info
でなんとなく今の接続状態が分かる. キーボードっぽい名前がそこに出てきたら Bluetooth キーボードが接続されたということ.
xinput list
で本体のキーボードっぽい名前を確認し, xinput set-prop $BUILDIN_KBD_NAME "Device Enabled" 0
とすれば無効化できる.