まぃふぇいばりっと

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

Julia言語

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

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

Julia言語 行列の一部を削除する.

また強いツイッタラーに教えてもらった. n×n行列のs行目とt列目を削除して,(n-1)×(n-1)行列を得たい,みたいなときに便利なのがInvertedIndices 行列aの取り除きたい列をs,取り除きたい行をtとすると,a[Not(s), Not(t)] で所望の行列を得る. こちらのツ…

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

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

Julia言語 Plotsの軸が見切れる問題

JuliaのPlotsとてもカッコ良いのですが,このように軸が見切れたりします. そういうときはusing Plots.PlotMeasuresしたあとに, plot(x,y, bottom_margin = 20mm ) のように,marginオプションを使えば解決できる. left_margin, bottom_margin, right_mar…

Julia言語 stringをfloatにする.

x = 3 ; x = float(x) でint型をfloatに変換できますが,x = "3.0" みたいなstring を float(x)としてもうまく変換できません.そういう時は,parse()を使います. parse(Float64, x) で無事にstringをFloat64にできます.