機械学習
メトロポリス法で,ボルツマンマシンからサンプリングするコードを書きました. とりあえず,状態xを与えたら,エネルギーを返してくれる関数を用意しておきます. using Plots using Random function energy(x,b,w) N = length(b) term_1_body = sum( x .* …
行列をreshapeしてテンソルにすることあるじゃないですか.いろいろな reshape が定義できますが,ビジョン系の研究するときは,Ket Augumentation という reshape をすることがよくあるっぽいです. この論文の第五章を読んで,KA実装しました. https://dl…
カーネル回帰においてデータ数が多くてカーネル行列が巨大になると,逆行列の計算がボトルネックになる.そういう時は random feature map を用いて前処理行列を構成して線型方程式を反復法で高速に解く処方箋(この文献のアルゴリズム1参照)もあるみたい.…
ようやく実装できた.参考にした論文は以下の2つ. proceedings.neurips.cc ojs.aaai.org それにしても,こんなに著名な手法のjulia実装でどこにもあがってないのはちょっと驚き. サンプリングの方法はいろいろあるんだけど,最も古典的(?)と思われるラ…
通常,カーネル重回帰では入力がベクトル,出力がスカラーの関数を学習する訳ですが,入力も出力もベクトルにしたいことがあります.そんなときに使える手法を次の文献で勉強しました. link.springer.com ieeexplore.ieee.org いろいろ調べても実装している…
Juliaで,n×m行列Xに,n次元の特徴量がm個格納されていて,これを,trainとvalidに分けたい. 要は,列をランダムにk個選んだn×k行列とn×(m-k)行列をつくりたい. 手っ取り早い方法がわかんないんだけど,いまのところ,暫定のマイベストプラクティスはこん…
カーネル回帰の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 =…
カーネルPCAを実装した.参考にしたのは 赤穂先生のカーネル本とこの修士論文. 「RKHS内でのΦ(x)の平均を簡単のためにゼロにする」という巷の説明をあちこちで見かけるが,無限次元空間でΦ(x)の平均をゼロにする方法は自明じゃない.この修論のappendixがと…
3階のテンソルTをST-HOSVD, T-HOSVDより正確に高速に1ランク近似できる手法をJulia言語で実装した. あ,ここでいう階っていうのは,rank(T)じゃなくて,ndims(T)ね.3-waysとか,3-orderってこと.日本では,ndimsを階っていうので,(CP)ランクと混ざっ…
Sequential nonnegative Tucker decomposition based on low-rank approximation(lraSNTD) を実装した.アルゴリズムは原論文を参考にした. www.semanticscholar.org 前回のlraNMFを活用して高速に非負タッカー分解をしようっていうノリ. using TensorTool…
αダイバージェンスやβダイバージェンスでのNMFを一般化するために,αβダイバージェンスというものを定義します.入力行列と出力低ランク行列間のαβダイバージェンスが小さくなるようなNMFアルゴリズムをJuliaで実装しました.αβダイバージェンスやアルゴリズ…
こないだのJuliaでNMFしたコードを一般のαダイバージェンスの尺度でNMFできるようにしました. αダイバージェンスの定義はここを参考にしました. 更新式はこの論文の2節に書いてあります.なんと更新式の一部をα倍したり1/α倍したりするだけ,簡単! using …
ひとまずpythonにwandbをインストールする. pip install wandb 次に,JuliaにPyCallをインストールする. (@v1.5) pkg> add PyCall wandbの公式ページでアカウントをつくる.適当なプロジェクトを作る. その語,Pythonでwandbを使うようにjuliaで julia > …
このスライドのp26, アルゴリズム2をJulia言語で実装しました. https://mycourses.aalto.fi/pluginfile.php/1249889/mod_resource/content/1/Lecture6.pdf 素朴なHOSVDや,T-HOSVDより効率よく低ランク近似が実現できているらしいです. ArpackだとフルHOSV…
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 をするときに,Lapackを使って using LinearAlgebra n = 10 A = rand(n, n) svd(A) としても良いのですが,これだとO(n3)必要ですね. ランクをrにするのに,完全なSVDをする必要はありません.Arpackのsvdsを使うべし. using Arpack n = 10 r …
行列の低ランク近似がSVDによって実現されるように,テンソルの低(タッカー)ランク近似がHOSVDで実現できます. なお,Eckart Youngの定理より,SVDがフロベニウスノルムの意味で最良低ランク近似を実現しますが,テンソルの場合はそのような保証はないと…
IBISに参加してみて,「行列分解の研究をしているの行列分解をあんまりよく理解していないな,確率的主成分分析でも勉強するか」と思い,中島変分ベイズの3-5,3-8,6章のほとんど,7章の全てを読んでみた. 須山ベイズを読み込んでいたので,スムーズに読めた…
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,…
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化した. 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 ; …
非負行列の行和,列和を揃える操作を行うSinkhorn Knoppアルゴリズムをpythonで実装しました.Julia版はこっち. 入力行列Aのi行目の行和がr[i], j列目の列和がc[j]になるようにするアルゴリズムが以下です. Sinkhorn Knoppアルゴリズムは,エントロピー拘…
ここにある更新式を見て,実装した.白抜きの丸はelement-wiseの積だと理解した. https://www.jjburred.com/research/pdf/jjburred_nmf_updates.pdf収束判定条件はsklearnのNMFの標準設定とできるだけ揃えた. scikit-learn.org以下実装. using LinearAlge…