まぃふぇいばりっと

機械学習やってます.Julia大好きです.勉強したことの殴り書きです.

機械学習

Julia言語 ボルツマンマシンからのサンプリング

メトロポリス法で,ボルツマンマシンからサンプリングするコードを書きました. とりあえず,状態xを与えたら,エネルギーを返してくれる関数を用意しておきます. using Plots using Random function energy(x,b,w) N = length(b) term_1_body = sum( x .* …

Julia 言語 Ket Augumentation (KA)

行列をreshapeしてテンソルにすることあるじゃないですか.いろいろな reshape が定義できますが,ビジョン系の研究するときは,Ket Augumentation という reshape をすることがよくあるっぽいです. この論文の第五章を読んで,KA実装しました. https://dl…

Julia言語 Nyström method による高速なカーネル回帰

カーネル回帰においてデータ数が多くてカーネル行列が巨大になると,逆行列の計算がボトルネックになる.そういう時は random feature map を用いて前処理行列を構成して線型方程式を反復法で高速に解く処方箋(この文献のアルゴリズム1参照)もあるみたい.…

Julia言語 Nyström method による行列の低ランク近似

ようやく実装できた.参考にした論文は以下の2つ. proceedings.neurips.cc ojs.aaai.org それにしても,こんなに著名な手法のjulia実装でどこにもあがってないのはちょっと驚き. サンプリングの方法はいろいろあるんだけど,最も古典的(?)と思われるラ…

Julia言語 多値のカーネル回帰

通常,カーネル重回帰では入力がベクトル,出力がスカラーの関数を学習する訳ですが,入力も出力もベクトルにしたいことがあります.そんなときに使える手法を次の文献で勉強しました. link.springer.com ieeexplore.ieee.org いろいろ調べても実装している…

Julia言語 データをTrainとValidにsplitする.

Juliaで,n×m行列Xに,n次元の特徴量がm個格納されていて,これを,trainとvalidに分けたい. 要は,列をランダムにk個選んだn×k行列とn×(m-k)行列をつくりたい. 手っ取り早い方法がわかんないんだけど,いまのところ,暫定のマイベストプラクティスはこん…

Julia言語でカーネル回帰

カーネル回帰のjulia実装が研究で必要になったから10分で実装した. とりあえず,前に書いたカーネルを呼ぶ式. function rbf_inners(X,Y,c) rbf_inner(x,y,c) = exp( -c*norm(x-y)^2 ) d, n = size(X) d, m = size(Y) K = zeros(m,n) for j = 1:n for i =…

Julia言語 Kernel PCA実装

カーネルPCAを実装した.参考にしたのは 赤穂先生のカーネル本とこの修士論文. 「RKHS内でのΦ(x)の平均を簡単のためにゼロにする」という巷の説明をあちこちで見かけるが,無限次元空間でΦ(x)の平均をゼロにする方法は自明じゃない.この修論のappendixがと…

Julia言語 高速3階テンソル1ランク近似手法SeROAPの実装

3階のテンソルTをST-HOSVD, T-HOSVDより正確に高速に1ランク近似できる手法をJulia言語で実装した. あ,ここでいう階っていうのは,rank(T)じゃなくて,ndims(T)ね.3-waysとか,3-orderってこと.日本では,ndimsを階っていうので,(CP)ランクと混ざっ…

Julia言語 高速非負テンソル分解lraSNTDを実装した.

Sequential nonnegative Tucker decomposition based on low-rank approximation(lraSNTD) を実装した.アルゴリズムは原論文を参考にした. www.semanticscholar.org 前回のlraNMFを活用して高速に非負タッカー分解をしようっていうノリ. using TensorTool…

Julia言語 αβダイバージェンスでの非負値行列因子分解

αダイバージェンスやβダイバージェンスでのNMFを一般化するために,αβダイバージェンスというものを定義します.入力行列と出力低ランク行列間のαβダイバージェンスが小さくなるようなNMFアルゴリズムをJuliaで実装しました.αβダイバージェンスやアルゴリズ…

Julia言語 αダイバージェンスで非負値行列因子分解

こないだのJuliaでNMFしたコードを一般のαダイバージェンスの尺度でNMFできるようにしました. αダイバージェンスの定義はここを参考にしました. 更新式はこの論文の2節に書いてあります.なんと更新式の一部をα倍したり1/α倍したりするだけ,簡単! using …

Juliaでwandbを使ってみた.

ひとまずpythonにwandbをインストールする. pip install wandb 次に,JuliaにPyCallをインストールする. (@v1.5) pkg> add PyCall wandbの公式ページでアカウントをつくる.適当なプロジェクトを作る. その語,Pythonでwandbを使うようにjuliaで julia > …

Julia言語 ST-HOSVDによる低ランク近似

このスライドのp26, アルゴリズム2をJulia言語で実装しました. https://mycourses.aalto.fi/pluginfile.php/1249889/mod_resource/content/1/Lecture6.pdf 素朴なHOSVDや,T-HOSVDより効率よく低ランク近似が実現できているらしいです. ArpackだとフルHOSV…

Julia言語 Truncated HOSVDによる1ランク近似

Julia言語で,T-HOSVDによりテンソルランクを1にするアルゴリズムを実装しました. この論文のアルゴリズム3を実装しました. using TensorToolbox using LinearAlgebra using Arpack function THOSVD(T) # Output is rank-1 tensor N = ndims(T) input_ten…

Julia言語 SVDによる低ランク近似

Julia でSVD をするときに,Lapackを使って using LinearAlgebra n = 10 A = rand(n, n) svd(A) としても良いのですが,これだとO(n3)必要ですね. ランクをrにするのに,完全なSVDをする必要はありません.Arpackのsvdsを使うべし. using Arpack n = 10 r …

Julia言語 HOSVDによるタッカー低ランク近似

行列の低ランク近似がSVDによって実現されるように,テンソルの低(タッカー)ランク近似がHOSVDで実現できます. なお,Eckart Youngの定理より,SVDがフロベニウスノルムの意味で最良低ランク近似を実現しますが,テンソルの場合はそのような保証はないと…

中島伸一「変分ベイズ学習」の7章がとんでもなく勉強になった.

IBISに参加してみて,「行列分解の研究をしているの行列分解をあんまりよく理解していないな,確率的主成分分析でも勉強するか」と思い,中島変分ベイズの3-5,3-8,6章のほとんど,7章の全てを読んでみた. 須山ベイズを読み込んでいたので,スムーズに読めた…

Python SVDによる低ランク近似

PythonでSVDで入力行列Aのランクをrankに落とすプログラム. ちなみに,C++バージョンはこっち. import numpy as np import scipy as sp def SVD(A, rank): u, s, v = np.linalg.svd(A) ur = u[:, :rank] sr = np.matrix(sp.linalg.diagsvd(s[:rank], rank,…

C++ SVDによる低ランク近似

O(n3)で入力行列Pのランクをrにするアルゴリズムです.eigenをつかっています. #include <iostream> #include <Eigen/Dense> #include <vector> #include <cmath> #include <time.h> #include <cstdio> #include <fstream> #include "utils.h" using namespace std; using namespace Eigen; MatrixXd SVD(MatrixXd& P, int r</fstream></cstdio></time.h></cmath></vector></eigen/dense></iostream>…

Julia言語 Sinkhorn Knopp アルゴリズムを実装した.

先日の記事のコードをJulia化した. using LinearAlgebra function quick_convergence_check(v, v_new, u, u_new, eps) if norm( abs.(v - v_new) ) < eps if norm( abs.(u - u_new) ) < eps return true end end return false end function main(A, r, c ; …

Python Sinkhorn Knopp アルゴリズムを実装した.

非負行列の行和,列和を揃える操作を行うSinkhorn Knoppアルゴリズムをpythonで実装しました.Julia版はこっち. 入力行列Aのi行目の行和がr[i], j列目の列和がc[j]になるようにするアルゴリズムが以下です. Sinkhorn Knoppアルゴリズムは,エントロピー拘…

Julia言語 非負値行列因子分解

ここにある更新式を見て,実装した.白抜きの丸はelement-wiseの積だと理解した. https://www.jjburred.com/research/pdf/jjburred_nmf_updates.pdf収束判定条件はsklearnのNMFの標準設定とできるだけ揃えた. scikit-learn.org以下実装. using LinearAlge…