サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大阪万博
qiita.com/kaityo256
重み付きランダムサンプリングアルゴリズム はじめに あらかじめ指定された重みに従って離散的な値を確率的に選択したい、ということがよくある。例えば[1,4,5]という配列が与えられたら、確率10%で0、40%で1、50%で2というインデックスを返すようにランダムサンプリングしたい。一番手軽な累積和の方法では、テーブル構築に$O(N)$、サンプリングに$O(\log(N))$の計算量となり、多くの場合これで用は足りる。さらに、テーブル構築は$O(N)$だが、サンプリングが$O(1)$となるWalker's Alias法という強力アルゴリズムもある。 累積和の方法は組むのが簡単で探索が$O(\log(N))$と十分早いし、Walker's Alias法は探索が$O(1)$と強烈なので、「重み付きランダムサンプリングアルゴリズムは、もうこの2つのどちらかで十分じゃん?」という気持ちになるが、この2
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに テンソルネットワークなどで、テンソルをグラフで表現することがよくあります。慣れるまでは見ても良く分からないのですが、慣れると人に説明する時とかに便利なので、ここで表記についてまとめておきます。 (追記) 最初、「私がこの表記方法を初めて見たのはG. Vidalのセミナーだったが発案者は知らない」と書いていたら、コメント欄にて発案者はあのペンローズだと教えていただきました。 グラフ表記法 シンボルと足の数 テンソルのグラフ表現では、テンソルをシンボル(四角や丸など)、テンソルの足をシンボルから出る線で表現します。線の数がテンソル
はじめに 履歴書、書いてますか?>挨拶 僕もいま任期付きなもんで履歴書を書いては送る日々なわけですが、履歴書ってなんであんなに書きづらいんでしょうね? で、これまでは履歴書をLaTeXで書いて管理してたのですが、ちょっとスタイルを修正するのもすごく面倒だし、そもそもデータとスタイルの分離がよろしくないのがストレスでした。そんな時にこの【退職】履歴書をGit管理したかってん【しました】という記事を見て、僕も履歴書をもう少し扱いやすいフォーマットから作るスクリプトを書きました。ソースはGitHubに置いてあります。 (2020年7月19日追記) 2020年7月17日付で、日本規格協会グループは、JIS Z 8303『帳票の設計基準』に掲載されていた「履歴書」の様式例を削除しました。2020年7月19日現在は「お知らせ」に記載されていますが、パーマネントリンクが無いようなので、そのうち消えるかも
どうも、ロボ太(kaityo256)です。趣味は他人のAdCを乗っ取ることです(乗っ取るとは言ってない)。これまでもスパコンポエムをいくつか書いてきましたが、せっかくスパコンポエムAdCがあるので一日お邪魔させてもらいます。 スパコンランキング スパコンにはTop500という有名なランキングがあります。HPLという、バカでかい連立一次方程式を解いて、その性能を競うものです。その名の通り、世界で上位500位までがランキングに入ります。6月と11月の年に二回開催され、ISCやSCという会議で発表されます。ずいぶん昔、「二位じゃダメなんでしょうか?」で有名になった事業仕分けにおいて、スパコンにおける一位とか二位というのは、狭義にはこのランキングでの順位を指しています。HPLがスパコンの性能評価として妥当かどうかについて、以前ポエムを書いたのでそっちを参照してください。 さて、このランキングの良い
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
TL;DR numpy.matrixは非推奨。numpy.ndarrayと@演算子を使いましょう。 はじめに 少し前に「大名行列を特異値分解してみる」という記事を書いたところ、元同僚さんから「numpy.matrixはdeprecatedですよ」と言われて驚きました1。 調べたらStackOverflowにやたら詳しい解説が載っていたので、それをもとに説明してみようと思います。 特異値分解とmatrixクラス 線形代数に特異値分解(Singular Value Decomposition, SVD)という処理があります。m行n列の行列Xを、m行m列のユニタリ行列U、m行n列の対角行列S、n行n列のユニタリ行列Vの積に分けるというものです。なんか適当な行列を作ってみましょう。
はじめに 線形代数には、特異値分解という操作があります。行列を特異値と、それをくくりだす行列に分解する処理です。この分解は可逆処理ですが、特異値の大きいところだけを取り、小さいところを無視することで元の行列を近似することができます。近年、この性質を利用した情報圧縮が様々な場所で積極的に利用されています。筆者の身近なところでは、量子状態をテンソルネットワークで近似する際、特異値分解が中心的な役割を果たします。 本稿では、特異値分解がどういう処理なのか、実際に簡単な行列で試してみて、「なるほど情報圧縮だなぁ」というのを実感することを目的とします。 コードは以下においておきます。 https://github.com/kaityo256/daimyo_svd Google ColabでJupyter Notebookを開きたい場合はこちらをクリックしてください。 特異値分解してみる まず細かいこ
TL;DR 確率密度$f(x)$に従う連続な確率変数$\hat{X}$を作るには、累積分布関数$F(x)$と$0 \leq \hat{R} < 1$の一様乱数$\hat{R}$を使って$\hat{X} = F^{-1}(\hat{R})$とすれば良い(逆関数法)。 はじめに 任意の確率密度分布を持つ確率変数を作りたい時があります。典型例が「球面上に一様に分布する点」を発生させる場合です。これは、例えば三次元空間上に速度の絶対値は同じだが向きをランダムに与えたい時なんかに必要です。 一般にプログラムで得られる(疑似)乱数は0から1の一様乱数です。本稿ではこれを使って任意の確率密度分布を持つ乱数を作る方法の説明と、いくつかの具体例を見てみましょう。 確率密度関数と累積分布関数 連続値を取る確率変数$\hat{X}$があるとします。この変数が$a$と$b$の間の値を取る確率が
はじめに いま、この記事を見ているのはパソコンだったりタブレットだったりスマホだったりするでしょうが、それらのデバイスにはCPUが入ってます。このCPU、様々な種類があり、ノートPCなら例えばIntel Core、スマホならARM Cortexなんかが入っているでしょう。このCPUですが、いろんな関連単語がネットニュースに飛び交います。例えばIntelのXeonやCore、Skylake、Kaby Lakeといった単語の関係や、AMDのZenとRyzenの関係など、よく目にするわりにその意味をちゃんとは知らない、という人は多いんじゃないでしょうか。 本稿では、わりとあいまいにされがちなCPUのベンダー、ブランド、命令セット、マイクロアーキテクチャといったキーワードについて簡単に説明してみようと思います。たとえ話の常として、どうしても正確性は犠牲になりますので、ガチ勢は「もどる」ボタンを押し
はじめに 何かデータをフーリエ変換したくなることがある。例えば先生から「そのデータ、フーリエ変換してみたら?」と言われた時とか。なんとなくフーリエ変換がどういうものかは知っていて、PythonとかのライブラリにFFTがあるからデータを食わせればすぐ変換できるということも知っているが、なんとなく定義に自信が無い、そんな時もあるだろう。 そういう場合は、厳密にフーリエ変換がわかるような単純な系について実際にデータを食わせてみて、理論値と一致することを確認するのが望ましい。しかし、実際にやってみると「アレ?」と思うことが結構ある。以下ではPythonでFFTをする時の注意点等を紹介する1。 ガウス分布 ガウス分布のフーリエ変換 まずはフーリエ変換の定義から確認しておこう。ある関数$f(x)$のフーリエ変換$\hat{f}(k)$は $$ \hat{f}(k) = \int_{-\infty}^\
TL;DR ある環境でビルドできたDockerfileが別の環境でビルドできなかったのは、メモリ制限のせいだった はじめに 理研シミュレータというシミュレータがあります。 RIKEN-RCCS/riken_simulator これは、「京」の次のスーパーコンピュータ「富岳」が採用しているアーキテクチャ「Fujitsu A64FX」のシミュレータです。Gem5というアーキテクチャシミュレータがあり、それにARM AArch64を実装したものです。 これを使うと、AArch64のプロセッサレベルでのシミュレートができるのですが、ビルドに結構手間がかかります。なので、その「手間」をまとめたDockerファイルを作りました。 kaityo256/aarch64env Dockerファイルはこんな感じです。 FROM ubuntu:18.04 MAINTAINER kaityo256 ENV USE
はじめに 実験でも数値計算でも、観測に誤差が伴うものをグラフにする時にはエラーバー(誤差棒)をつけると思います。エラーバーのつけ方には流儀がありますが、とりあえず1シグマ、つまり「誤差の乗り方がガウス分布だと仮定した時の標準偏差」をエラーバーとすることが多いです。 で、エラーバーは1シグマなので、「真の値をそのエラーバーの中に含む確率」が68%です。つまり観測点の3つに1つは「真の値」がエラーバーの範囲外にあることになります。なお、ここでは「真の値」を「観測を十分な回数繰り返した時に収束する値」のこととします。 さて、発表を見ていて、たまに「ん?」と思うようなグラフを見かけます。以下では、そんな「ん?」なグラフの実例と、その原因について見てみようと思います。 ケース1:正しい誤差棒 入力値$x$に対して、観測値$y$が$y=x$となる単純な系を考えましょう。ただし、観測するたびに誤差$\v
はじめに スピン系をモンテカルロシミュレーションする時、Swendsen-Wang法やWolff法など、Fortuin-Kasteleyn表現を用いたクラスターアップデートアルゴリズムを使うと非常に効率良くサンプリングができます。さらに、Fortuin-Kasteleyn表現が得られている時、普通にサンプリングするよりも分散が小さくなるImproved Estimatorを構成できます。 本稿では、Ising模型の磁化やビンダー比のImproved Estimatorの導出と、どのくらい分散が小さくなるのかの説明をします。 コードは https://github.com/kaityo256/mc/tree/master/improved_estimator に置いておきます。 Improved Estimatorとは サイコロとコインの例 Improved Estimatorを一言で言うと
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに エンジニアないないという記事を読んで、「そうそう、専門の人と一般の人って、結構認識違ってたりするよなぁ」と思ったので、スパコンについて似たようなことを書いてみようと思います。オープンキャンパス的なイベントで来訪者にスパコンについて説明したりしている時に質問されたことが中心です。 スパコン使えばものすごいゲームできるんですか? これ、わりとよく聞かれるんですが、基本的にはできません。「ものすごいゲーム」のイメージは、例えば「ものすごいグラフィック」「ものすごく精密な物理エンジン」「ものすごく大量のキャラクター」なんかだと思うんで
def check(n) s = "*"*n f = open("test.cpp","w") f.puts <<EOS #include <cstdio> int main(){ (#{s}printf)("Hello World\\n"); } EOS f.close() return system("clang++ test.cpp") end check(ARGV[0].to_i) $ ruby check.rb 10000 clang: error: unable to execute command: Illegal instruction: 4 clang: error: clang frontend command failed due to signal (use -v to see invocation) Apple LLVM version 10.0.1 (clang
はじめに プログラマは計算機に対して、「別に凝ったをやれとは言わないが、自明なことはやってくれよ」と思うものだ。例えば規則格子における差分法、特に陽解法は、式と差分方式さえ決まれば、(最適化とか考えなければ)後は自明なコーディングになる。さらに、領域分割による分散メモリ並列を考えた時、(効率とか考えなければ)やはり自明なだけで面倒なコーディングをする必要がある。 こういう「自明かつ面倒なコーディング」をやらなければいけなくなった時、「自動化したい」と思うのは自然な発想だ。Formuraは、まさにそのような思想で作られた、格子計算プログラム生成言語(というかフレームワーク)である。 本稿では、このFormuraを使ってみる。 その1 インストールとコンパイルまで ←イマココ その2 一次元熱伝導方程式 その3 二次元熱伝導方程式 その4 反応拡散方程式(Gray-Scott系) インストール
はじめに 一般に、コンパイラによる最適化は局所的であればあるほど効きやすい。例えば同じ関数内ならできる最適化が、グローバル変数がからむとできなくなったり、ファイルをまたぐとできなくなったりする。しかし、最近はリンク時最適化(Link Time Optimization, LTO)と呼ばれる、異なるオブジェクトファイル間にまたがる最適化ができるようになってきた。 ここではいくつかの例で、リンク時最適化として何ができるか紹介してみたいと思う。使うコンパイラは以下の通り。 g++ (Homebrew GCC 7.3.0_1) 7.3.0 clang++ Apple LLVM version 9.1.0 (clang-902.0.39.2) リンク時最適化の例 簡単なサンプルを示そう。 こんなコードを考える。
$ git init --bare sub.git Initialized empty Git repository in /path/to/temp/sub.git/ $ git clone sub.git Cloning into 'sub'... warning: You appear to have cloned an empty repository. done. $ cd sub $ echo "sub" >> sub.txt $ git add sub.txt $ git commit -m "initial commit" [master (root-commit) f6e78d2] initial commit 1 file changed, 1 insertion(+) create mode 100644 sub.txt $ git push Enumerating
はじめに 「サイゼリヤで1000円あれば最大何kcal摂れるのか」を量子アニーリング計算(Wildqat)で解いてみた。 「サイゼリヤで1000円あれば最大何kcal摂れるのか」をSMTソルバー(Z3)で解いてみた。 「サイゼリヤで1000円あれば最大何kcal摂れるのか」を整数計画法ソルバー(PuLP)で解いてみた。 N番煎じですが、これらの記事を見てマルコフ連鎖モンテカルロで解いてみました。コードは以下に置いてあります。 https://github.com/kaityo256/saizeriya_mc 方針 全メニューについて、「注文する/しない」を0/1の状態ベクトルとして、そのベクトルについて最適化をかけます。カロリーをエネルギーとして、カロリーを最大化するようにします。試行は「メニューの追加/削除」の二種類です。状態の更新はメトロポリス法を使います。すると、メニューの追加試行は
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに 少し前(2019年4月頃)に、「AI人材」という言葉がニュースを賑わせていました。「現在流行っているディープラーニングその他を使いこなせる人材」くらいの意味だと思いますが、こういうバズワードの例の漏れず、人によって意味が異なるようです。併せて「AI人材のために線形代数の教育をどうするか」ということも話題になっています。 線形代数という学問は、本来は極めて広く、かつ強力な分野ですが、とりあえずは「行列とベクトルの性質を調べる学問」と思っておけば良いです。理工系の大学生は、まず基礎解析とともに線形代数を学ぶと思います。そして、何に
TL;DR VSCodeでコピーする際に、「書式なし」でクリップボードにコピーするためには「設定」の「テキストエディター」の「Copy With Syntax Highlighting」のチェックを外す この状態で「書式付き」でコピーするには、コマンドパレットから「Copy With Syntax Highlighting」を実行する。 なお、記事執筆時点のVSCodeのバージョンは1.33.0。 はじめに 最終的にWordで提出しなければならない書類でも、最初はテキストエディタで書いて、最後に貼り付けて体裁を整える、ということをやっている人は多いと思う。しかし、最近のVSCodeはデフォルトでコピーが「書式つき」になっている。そうすると、例えばVSCodeで「プレーンテキスト」で書いているつもりが、Wordに貼り付けると背景色などがコピーされて困ることになる。 Wordなどは「形式を選択
はじめに 理工学部の学生にとって、フーリエ変換、ラプラス変換は必須の科目であろう。しかし、フーリエ変換については物理的な意味がわかりやすく、変換もきれいなので受け入れられる学生さんも多いのだが、ラプラス変換については「逆変換の積分がなぜ複素平面を「縦」に、しかも軸がずれて走るのかわからない」とか「微分をラプラス変換するとゴミがでるのが気持ち悪い」など、「フーリエ変換に比べると美しくない」と感じる人がいるようだ。 しかし、ラプラス変換とフーリエ変換はきってもきれない仲である。本稿では、あまり話題にされないラプラス変換とフーリエ変換の関係についてまとめておく。 フーリエ変換 まず、フーリエ変換を定義しておこう。変換前の変数を$x$、変換後は$k$としよう。これは実空間と波数空間に対応する。関数$f(x)$のフーリエ変換は以下のように定義する。 $$ \mathcal{F}[f] \equiv
はじめに malloc沼、ハマってますか?>挨拶 僕はどっぷりハマってもうイヤになりました。必要に応じてメモリを確保し、解放するという、一見単純な作業はとても奥が深いです。 特にglibc mallocはかなりアドホックなことをやっており、チューニング可能なパラメータがたくさんあります。それらのパラメタは、多くの一般的なアプリケーションでそこそこの性能が出るように選ばれていますが、アプリケーションによっては相性が悪く、性能が劣化する場合があります。その場合、mallocに関連するパラメタをいじる必要がでてきますが、これがなかなか面倒だし、設定したことでどんな変化が表れるかがわかりにくいことが多いです。 本稿では、環境変数から設定可能なmalloc関連のパラメタをいくつか紹介します。特に、環境変数を設定することで振る舞いがなるべくわかりやすく変わるサンプルコードを用意しました。 malloc
はじめに 今年(2019年)のゴールデンウィークは10連休だそうで、高速道路が相当混むことが予想される。車での移動において、渋滞は頭の痛い問題だ。では、渋滞はなぜ起きるのだろうか? よく言われるのが「坂道が始まるところで渋滞が起きる」というものだ。坂道では知らないうちに車のスピードが落ちる。すると車間距離が縮まることで、後続の車がブレーキを踏み、それを見たさらに後ろの車がブレーキを・・・と連鎖して、最終的に渋滞になると説明される。また、ドライバーなら合流地点があったり、車線が狭くなるところなどでよく渋滞が起きることも経験的に知っているだろう。合流地点や車線が狭くなるところは流量が落ちるから詰まって渋滞になりやすそうである。 しかし、これらは「渋滞がどこで起きやすいか」ということを説明しているに過ぎず、「渋滞がなぜ起きるか?」ということの答えにはなっていない。そもそも渋滞はなぜ起きるのか?何
次のページ
このページを最初にブックマークしてみませんか?
『@kaityo256のマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く