まぃふぇいばりっと

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

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 言語 タッカーランクが低いランダムテンソルを生成する

ランダムな低ランクテンソルが欲しいときってありますよね. テンソルのランクっていろいろありますが,とりあえずタッカーランクがひくいランダムテンソルを手に入れるコードをかきました. もっとよい方法があったら知りたいです. using LinearAlgebra us…

Julia 言語 TensorToolbox で CP 分解して,再構成する.

Julia の TensorToolbox を使うと気軽に CP 分解ができます. github.com 例えば,ランダムな4×4×4×4テンソルXをCP分解するなら using TensorToolbox X = rand(4,4,4,4) F = cp_als(X, 3) でOKです.ここで,ターゲットランクは3にしました.これで,F.lambd…

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

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

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

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

Julia 言語 いろいろな方法で固有値をr個,大きい順に計算する関数を用意した.

よく研究で使うのでメモがてら,ここにおいておこう. 行列Kの固有値を大きい順にrank個求める. 計算手法としては,lapack, lapack_sym, arpack, nys, randomizedの5種類. lapackとarpack以外は入力行列が対称であるという条件を課しているので注意. nys…

Julia言語 逆行列の高速な計算のために,右除算演算子と左除算演算子を利用しよう.

数値計算で逆行列の計算を避けましょうというのはもはや常識と思います.例えば,givenの行列AとBについて,C = inv(A) * B を計算したいときは,左除算演算子\を使って using LinearAlgebra C = A \ B とした方が速いです.実際に using BenchmarkTools n =…

Julia言語 Randomizedな方法での固有値計算の高速化のためにSRFTをやってみたけどうまくいかなかった

いままで実装してきたRandomizedな方法での固有値計算(RED)では,アルゴリズム中にランダム行列と入力行列との積を計算する必要がある.これにはO(nmr)かかる訳だけど,SRFTとかいう方法でO(nm log r)に高速化できるらしい.SRFTというのは特別な条件を満た…

Julia言語 Randomized eigenvalue decomposition via Nystrom Method を実装した.

n×nの正定値対称行列Aの固有値を大きい順にr個求めたいです.これを高速に計算するアルゴリズムとしてRandomized eigenvalue decomposition via Nystrom Methodを実装しました.以下の論文のFig.6.を実装しました. arxiv.org 前に実装したREDは固有値を大き…

Julia言語 Randomized eigenvalue decomposition を実装した.

n×nの実対称行列Aの固有値を大きい順にr

Julia言語 実対称行列の固有値を大きい順にr個抽出する.

Julia標準搭載のeigenを使うと,N×N行列Aの固有値分解がO(N^3)になっちゃうと思ってたからArpack使ってたんだけど,Arpackはそもそも疎行列向きっぽい. どうやら入力行列Aが実対称行列ならば val, vec = eigen(A, 1:r) で小さい順に固有値をr個とりだせるみ…

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言語 LightGBMで多クラス分類

(解決済み) 非深層学習系の提案手法を実装するならJulia一択だと思うのですが,既存の比較手法をすぐに試せないとpython民に戻りたくなりますね..LightGBMで多クラス分類をしようとして,ちょっと詰まったので,二度と再び本件で躓かないためのマイメモ…

Julia言語 Kernel PCA実装

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

Julia言語 benchmark で計測した時間を変数に代入したい.

BenchmarkToolsって便利ですよね.例のように(10×10)のランダム行列の固有値を計算するのに要した時間を計測したとします. ここから,最小時間37.748とか,中央値47.454とかを取り出すにはどうしたらよいでしょうか,というのがいつも分からなくなるのでメ…

Julia言語 CartesianIndexからvecに変換する方法

しょっちゅう分からなくなってはTwitterで強い人に教えてもらうので,ここにメモ. CartesianIndexは.Iで添え字を取り出せる.これを'collect'すると所望のvecになる. ただ,これだとちょっと気持ち悪いと思う人もいるようなので, Tuple(CartesianIndex(2,3…

Julia言語 補助行列が2つある場合のNon-negative Multiple Matrix Factorization (NM2F)の実装

前回,補助行列が一つだけのNMMFの実装を公開した. 今回は同様に,これらの論文にのっとり,補助行列が2つある場合のNMMFを実装した. 行列X,Y,Zを,WH, AH,WBに同時に分解するというタスクである.コスト関数はKL情報量.(LSの場合の更新式ってどこかに…

Julia言語 Non-negative Multiple Matrix Factorization (NMMF)の実装

複合データ分析技術についてこのpdfで勉強してたら,NMMFというものを知った. ちゃんとした議論は,IJCAIでしている. www.ijcai.org 人工知能学会の予稿や論文,絵本のパターン抽出や,和文論文が参考になる. 私も研究で使うことになったのでささっと実装…

Julia言語 行列の各要素が1.0e-10以下だったら0にする

一番手っ取り早いのはこんな感じ A = rand(5,5) A[A.<1.0e-10] .= 0 以下,強い人に教わったこと. 絶対値が1e-10以下なら0にする場合に真っ先に思い浮かぶのは X[abs.(X) .≤ 1e-10] .= 0 だけど,これは遅い. やりたいこと分解して, small2zero(x, ε=1e-1…

Julia言語 重み付き非負行列因子分解

重み付き非負行列分解というタスクがある.欠損ありのNMFとかに使える. 研究に必要だったので,オーソドックスな次の手法を実装した. www.semanticscholar.org 実装は簡単で普通のNMFの更新式をちょっと変えるだけ. フロベニウスノルム尺度のものとKL尺度…

Julia言語 確率行列分解 Left-Stochastic Matrix Factorization

左確率行列分解(Left-Stochastic Matrix Factorization)というタスクがある.NMFに対称性と列規格化を要請する.これでうまいことクラスタリングができる. 研究で比較実験を行うためにクラスタ数2の場合のみを実装した. jmlr.org アルゴリズム中に確率単…

Julia言語 二重確率行列分解

非負の対称行列を低ランク二重確率行列で近似するタスクに関する論文を読んだ. ここでいう近似は,KL情報量の意味での近似. jmlr.org 論文中のAlgorithm 1を実装した. using LinearAlgebra function D_KL(A,B) (N, M) = size(A) dkl = 0.0 for i=1:N for …

Julia言語 n個の空の配列を用意する方法.

emps = [ [], [], [], [], [] ] みたいなのをつくりたい.そういう時は, N = 5 emps = [[] for i=1:N] とすればよい. An array of empty arrays - First steps - JuliaLang

Julia言語 非負テンソルをKL情報量でCP分解.CP-APRによる低ランク近似の実装

研究に必要だったので,Julia言語でこの論文のアルゴリズム3を実装した.「KL情報量でCP分解しましょう」って話だけど,中身はポアソン分布とかいろいろ書いてあってちゃんと読んでないから分からん.とりあえず非負のテンソルCP分解の手法の一つ. arxiv.or…

Julia言語 niiファイルを読み込む

fMRIの出力がniiファイルらしい.良く分からないが,using NIfTI で開ける. using NIfTI ni = niread("hogehoge.nii") ni = niread("foo.nii.gz") でOK.普通の配列にしたかったら convert(Array{Float64}, ni) でOK. github.com

Julia言語 衛星データgeotifファイルを読み取る

NASAのページからgeotifファイルをダウンロードできるんだけど,juliaでどう開けばよいか分からなかった. 色々調べたけど,多分これが一番良い. github.com using GeoArrays geoarray = GeoArrays.read("hogehoge.tif") 座標をとりだしたかったら, coords…

Julia言語 pngを読み込んでarrayに変換する.

juliaで using FileIO img = load("hogehoge.png") したあとに,r,g,b要素を取り出したかったら,それぞれ using Colors r = red.(img) g = green.(img) b = blue.(img) とする.ちなみにこのままだとr,g,bはそれぞれ Array{N0f8,2} with eltype FixedPointN…

Julia言語 テンソルの添え字集合をつくる

自然数nに対して,[n] = {1, 2, …, n} として,[I]×[J]×[K]が欲しい時ととかってあるじゃないですか.テンソルの添え字でloop作りたいときとか.そういうときは,IterToolsのproductを使うとよいことに気が付いた. using IterTools I = 2 J = 3 K = 2 for i…