まぃふぇいばりっと

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

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

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

Julia言語 CPランクが落ちているランダムテンソルをえる

CPランクが落ちているテンソルが欲しい場合 outer(v...) = reshape(kron(reverse(v)...),length.(v)) function get_low_CP_tensor(J, R) D = length(J) v = Vector{Array}(undef, D) T = zeros(J...) for r = 1 : R for d = 1 : D v[d] = rand(J[d]) end T .…

Windows 11 + IJulia + jypterlab + jupyterlab_vim

windows 11 に julia をインストールしたのですが,インストーラの最後の「パスを通す」というチェックボックスにチェックを忘れてしまいました.なので,以下のパスを環境変数名の編集から追加しておきます. C:\Users\%UserName%\AppData\Local\Programs\J…

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言語 多値のカーネル回帰

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

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がと…

Python αダイバージェンスを小さくするNMF

KLダイバージェンスを最小化するNMFはよく知られていますし,sklearnで'beta_loss=1'にすればすぐに利用できます. 今回はKLダイバージェンスの拡張であるαダイバージェンスを小さくするNMFを実装しました. この論文の更新式をさくっと実装しました. www.s…

Python 確率単体上で凸関数を最小化(SciPy)

多変数関数f(x)を確率単体上のxで最適化したい.(最近,情報幾何をやっているので,こういうタスクばかりやってる気がする) つまり,xは 0 < x[i] < 1 かつ sum(x) = 1 の範囲でf(x)の最小化をしたい. ちまちま自分でソルバー書いてたけど,scipy使う方が…

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言語 Non-Negative Tucker Decomposition の実装 [完全版] LSエラー, KLエラー

昨日の記事の完全版.Nonnegative Tucker Decomposition の Julia 実装. 重要なアルゴリズムと思うけど,Julia版は探しても見つからなかったので,自分で書いた. ieeexplore.ieee.org Python版はすでに実装があるみたい.これはSVDで初期化しているっぽい…

Julia言語 Non-Negative Tucker Decomposition の実装 [LSエラー版]

↓ こっちのほうが役に立つと思う genkaiphd.hatenablog.com ↑ こっちのほうが役に立つと思う 研究に必要なので,非負テンソルのタッカー分解の論文をjuliaで実装した.とりあえず,コスト関数がLSエラーのものを実装した.KLダイバージェンスの場合について…

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 アルゴリズム中に確率単…