まぃふぇいばりっと

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

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

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

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

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

物理学徒が機械学習に入門した軌跡

修士課程までディラック電子系の理論物理をやってました.そのまま博士課程に進学することも考えましたが,色々考えて民間に就職して,深層学習を使ったコンピュタービジョンの研究をしました.2年後,会社を辞めて情報系の博士課程に編入しました.先日,…

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

Zigzag graphene nanoribbons のエネルギー分散関係

大昔に研究で使っていたCのコードが発掘された. グラフェンのジグザグナノリボンのバンド図を求めます。Nはユニットセル内の原子の数です。最近接のとびうつりのみを考えたタイトバインディングで計算しています。計算結果は/dataにdatファイルとして出力し…

Fortran90 Hofstadter's butterfly.六方格子系に垂直磁場.

六方格子系に垂直に磁場を与えることでHofstadter's butterflyが現れる. 昔かいたFortranコードを発掘したのでアップロード. 自然界に現れるフラクタル構造って良いですよね. ちなみに,Hofstadter's butterflyは六方格子系以外の系に垂直磁場を与えても…

数理科学 2020年 11 月号 情報幾何学の探求を読んだ.

すっごい勉強になった.自分の専門分野もろかぶりだった. 情報幾何と機械学習あたりやっている人にとっては役に立つと思う. 特に印象に残ってるのは次の3つ. 江口真透:情報幾何学入門 1.通常の最小二乗法はユークリッド幾何の三平方の定理 2.目的変数に…

Overleafで別のLatexファイルを参照refする方法.

これを見つけるのに時間がかかってしまった. \usepackage{xr}を使えば良いらしいというのは,このページをみればわかったのだが,overleafでうまくいかなかった.いろいろググると,次のような解説を見つけた.これでいけた!どうやらなぞのlatexmkrcを作る…

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…

博士をとるのに役立ちそうなものたち[随時更新]

社会人学生 Advent Calendar 2022 博士論文執筆の際にお願いしたいこと 業績ゼロから始める社会人博士 理工系大学・高専の研究室不登校 (修士/博士/普通の)論文執筆の際にお願いしたいこと、その二 A guide to Scientifc Research 博士課程後期の心得 (広島…

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

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

C++ 行列バランシング

行列バランシングと言えば,sinkhornですが,今回はこの論文を実装しました. arxiv.org (論文では自然勾配法使ってますが,ここでは,1次までしか実装してないです) #include <iostream> #include <Eigen/Dense> #include <vector> #include <cmath> #include <time.h> #include <cstdio> #include <fstream> using names</fstream></cstdio></time.h></cmath></vector></eigen/dense></iostream>…

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…