まぃふぇいばりっと

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

Julia言語

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

研究に必要だったので,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…

Julia言語 L1ノルムでのテンソルランク1近似の解析解

3階のテンソルをL1ノルムの尺度で近似するランク1テンソルを見つけます,という論文を実装した.論文のタイトルにexact solutionがあるけど,L1ノルムの意味での最良1ランク近似をしてるわけではないので注意(かなり混乱した). arxiv.org 最近,L1が流…

Julia言語 特定の文字が文字列に何回現れたか数える方法.

文字列hogehogeにhが何回出てくるか数えたい.ぐぐると str = "hogehoge" cnt = sum([1 for i = eachmatch(r"h", str)]) とかいいんじゃね?と書いてある. 強い人にはもっとシンプルに sum(split(str, "").=="h") で良いと教わった.なるほど. 追記 強い人…

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

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

Julia言語 DataFrameの列の名前を変える.

ついにDataFrameに入門してしまった.... 途中で列の名前を変えるにはこうする. using DataFrames names = ["colname1", "colname2", "colname3"] data = rand(3,3) df = DataFrame(data) rename!(df, Symbol.(names)) Symbolに変えないといけないことに気…

1から始める Juliaプログラミング を読んだ.

最近,毎日Juliaを書いているので,買って読んでみた.結論から言うと本当に良い買い物をしたと思う. 薄い技術書だけど、内容は評判通りかなり濃厚.Juliaの基本的な言語機能の他にも、コンパイラへのヒントの書き方、メモリ割り当てを削減するtips、プロフ…

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

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

Julia言語 高速非負値行列因子分解lraNMFを実装した.

すごく速くNMFができるらしい2012年の論文を実装しました. ieeexplore.ieee.org epsilon を 0 にするとロスがNaNになるので注意.しばしばロスがNaNになるので使うときはverbose=trueにして様子を見ること推奨. using LinearAlgebra using Random using Ar…

Julia言語 テンソルのKLダイバージェンス, αダイバージェンス

この論文の式(8)の実装になんと午前中を全て費やしてしまった... Nonnegative Tucker decomposition with alpha-divergence - IEEE Conference Publication テンソルの計算は慣れないなぁ. α=0,1でKLダイバージェンスになるんだけど,テンソルに対するKLダ…

Julia言語 配列の全要素が同じか判定する.

Julia言語で配列の全要素が同じかどうか調べる方法をぐぐってみると, stackoverflow.com まぁ,こんな感じのが出てきて,私は怠惰なので,自前で関数かくのが.ぶっちゃけだるいなと,ツイッターで呟いたら強い人が「Setにして要素数を数えたらいいんじゃね…

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

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

Julia言語でランダムウォーク

小針先生の確率統計の本を読んだ.教訓がたくさん詰まった本当に良い本だったと思う.6章の「酔歩」がとても印象に残っている.独立した章なので,確率の基本的なことが分かっていれば読める. 時刻t=0で原点に居る酔っ払いが,確率1/2で西へ,確率1/2で東…

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

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

Julia言語 適当な分布に従うテンソルをつくる

各要素が適当な分布に従うテンソルをつくる.例えば,中心がmu, 分散がsigmaの一次元ガウス分布に各要素が従うD×M×Nテンソルをつくりたければ using Distributions mu = 0 sigma = 5 D = 2 M = 3 N = 5 dist = Normal(mu, sigma) X = rand( dist, (D, M, N) )…

Julia言語 手っ取り早く B = { b ∈ {±1}^N } を生成する方法

集合 B ={ b ∈ {±1}^N } を得たい! 僕が考えたのはこんな感じ. using Combinatorics function main(N) B=[] for n=1:N combs = collect(combinations(1:N,n)) for comb in combs b = ones(N) for com in comb b[com] = -1 end push!(B,b) end end return B…

Juliaでwandbを使ってみた.

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

Julia言語 文字列をfloatに変換

julia で string から float への変換は parse() を用いる.単にfloat("0.12")とかはダメ

Julia言語 経過時間を計測して,変数に代入

@time とかいろいろあるみたいですが,私が好きなのはこの方法 using BenchmarkTools runtime = @elapsed begin (処理) end これで変数runtimeに(処理)が終わるまでに要する時間が秒で代入されます. 追記 強い人に教わったのですが result, runtime = @time…

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

Julia言語 np.squeezeはdropdimsを使う

pythonのnp.squeezeをjulia言語でやるなら,dropdimsを使うと良い.juliaにも昔は'squeeze'関数があったっぽいが,今は消えてしまった? docs.julialang.org

Julia言語 タプルを配列になおす

collectを使うと良いです. tup = (1,2,3,4,5) ary = collect(tup) これで配列arrayに直されます.

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

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

Julia言語 n階のテンソルを初期化する.

3×3×3のテンソルを用意したいときは,X = rand(3,3,3) みたいにするとおもいますが,階数が大きい時に X = rand(i1,i2,i3,i4, ..., ,in って手動で入力するのが大変だったので,i = [i1,i2,i3,…,in] を用意して using TensorToolbox X = diagt(i) みたくして…

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 ; …