🐕

Sobol'列の Python 実装

2022/08/21に公開

Sobol'列

準モンテカルロ法による数値積分に用いる一様乱数列のひとつに Sobol'列がある。数値積分の話は以下の解説記事が参考になる。

https://qiita.com/convexineq/items/b9629183d2a5fd426991

機械学習(最適化)の分野では効率的に空間を網羅して近似誤差を速やかに減少させるために用いられる。Sobol'列は以下に実装が公開されている。

https://people.sc.fsu.edu/~jburkardt/py_src/sobol/sobol.html

使いやすくした

この公開されているプログラムがあまり Python ライクではないので修正したのが以下になる。一応、もとのプログラムと生成結果が一致するかチェックするテストは書いている。

https://github.com/wsuzume/quasimc

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