🐕
Sobol'列の Python 実装
Sobol'列
準モンテカルロ法による数値積分に用いる一様乱数列のひとつに Sobol'列がある。数値積分の話は以下の解説記事が参考になる。
機械学習(最適化)の分野では効率的に空間を網羅して近似誤差を速やかに減少させるために用いられる。Sobol'列は以下に実装が公開されている。
使いやすくした
この公開されているプログラムがあまり Python ライクではないので修正したのが以下になる。一応、もとのプログラムと生成結果が一致するかチェックするテストは書いている。
PyPI に公開しているので以下でインストールできる。
$ pip install quasimc
インポートして使うだけ。
from quasimc.sobol import Sobol
# 引数は 次元数、 シード(任意)
sobol = Sobol(10, 5)
# 引数は 生成個数、 スキップする個数(任意)
sobol.generate(20)
array([[0.90625 , 0.40625 , 0.28125 , 0.78125 , 0.53125 , 0.03125 ,
0.046875, 0.546875, 0.796875, 0.296875, 0.421875, 0.921875,
0.671875, 0.171875, 0.234375, 0.734375, 0.984375, 0.484375,
0.359375, 0.859375],
[0.40625 , 0.90625 , 0.28125 , 0.78125 , 0.03125 , 0.53125 ,
0.265625, 0.765625, 0.015625, 0.515625, 0.140625, 0.640625,
0.390625, 0.890625, 0.078125, 0.578125, 0.328125, 0.828125,
0.453125, 0.953125],
[0.28125 , 0.78125 , 0.15625 , 0.65625 , 0.90625 , 0.40625 ,
0.609375, 0.109375, 0.359375, 0.859375, 0.234375, 0.734375,
0.984375, 0.484375, 0.796875, 0.296875, 0.046875, 0.546875,
0.421875, 0.921875],
[0.59375 , 0.09375 , 0.96875 , 0.46875 , 0.71875 , 0.21875 ,
0.578125, 0.078125, 0.828125, 0.328125, 0.703125, 0.203125,
0.953125, 0.453125, 0.140625, 0.640625, 0.390625, 0.890625,
0.015625, 0.515625],
[0.09375 , 0.59375 , 0.21875 , 0.71875 , 0.96875 , 0.46875 ,
0.703125, 0.203125, 0.453125, 0.953125, 0.328125, 0.828125,
0.578125, 0.078125, 0.140625, 0.640625, 0.890625, 0.390625,
0.765625, 0.265625],
[0.15625 , 0.65625 , 0.53125 , 0.03125 , 0.78125 , 0.28125 ,
0.640625, 0.140625, 0.890625, 0.390625, 0.265625, 0.765625,
0.015625, 0.515625, 0.578125, 0.078125, 0.828125, 0.328125,
0.453125, 0.953125],
[0.34375 , 0.84375 , 0.71875 , 0.21875 , 0.46875 , 0.96875 ,
0.265625, 0.765625, 0.515625, 0.015625, 0.390625, 0.890625,
0.640625, 0.140625, 0.328125, 0.828125, 0.578125, 0.078125,
0.453125, 0.953125],
[0.40625 , 0.90625 , 0.53125 , 0.03125 , 0.78125 , 0.28125 ,
0.671875, 0.171875, 0.921875, 0.421875, 0.046875, 0.546875,
0.296875, 0.796875, 0.359375, 0.859375, 0.109375, 0.609375,
0.984375, 0.484375],
[0.71875 , 0.21875 , 0.84375 , 0.34375 , 0.59375 , 0.09375 ,
0.578125, 0.078125, 0.828125, 0.328125, 0.703125, 0.203125,
0.953125, 0.453125, 0.640625, 0.140625, 0.890625, 0.390625,
0.515625, 0.015625],
[0.71875 , 0.21875 , 0.59375 , 0.09375 , 0.34375 , 0.84375 ,
0.046875, 0.546875, 0.796875, 0.296875, 0.921875, 0.421875,
0.171875, 0.671875, 0.109375, 0.609375, 0.859375, 0.359375,
0.984375, 0.484375]])
Discussion