1. michihito_t

    No comment

    michihito_t
Changes in body
Source | HTML | Preview

第4章に正規(ガウス)分布の乱数を生成するコードが有る。

擬似的に正規分布の乱数を最も簡単に作る方法

-0.5~0.5の乱数の12回の平均。

def norm_rand
  random = Random.new()
  result = 0
  12.times do
    result += random.rand(-0.5..0.5)
  end
  result / 12
end

とはいえ、色々面倒だし、これを使って行列を作るのもなんとも不便。
そこで、乱数を生成してくれるライブラリ、Numo::GSLを導入する。

Numo::GSLの導入

基本的にはDockerのRuby上で行っています。
環境構築に関しては、敢えてRubyで学ぶ「ゼロから作るDeep Learning」Docker環境構築編をご確認ください。

# まずは元となるGSLを導入
$ apt install -y gsl-bin
# 次にNumo::GSLのgemを導入
$ gem install numo-gsl

Numo::GSLでの正規乱数の生成

require 'numo/gsl'
require 'numo/narray'

## 標準正規分布のrow * colの行列を作る
def randn(row, col)
  r = Numo::GSL::Rng::Rand.new
  r.gaussian(1, row * col).reshape(row, col)
end

追記 Numo::Narrayから正規乱数の生成

@kojix2 さんよりコメント頂きました、Numo::NArrayで正規乱数を作る方法も記載しておきます。

require 'numo/narray'

## 標準正規分布のrow * colの行列を作る
def randn(row, col)
  Numo::DFloat.new(row * col).rand_norm(0,1).seq(row, col)
end
require 'numo/narray'

## 標準正規分布のrow * colの行列を作る
Numo::DFloat.new(row,col).rand_norm(0,1)