ノイズのある高次元球からベクトルのサンプルを生成したいと考えています。
IE 任意のベクトル X が R^N にあり、||X+epsilon||^2 = 1 を保持するようなサンプルを作成しようとしています。ここで、epsilon は R^N の iid ベクトルであり、そのコンポーネント epsilon_j は N( 0,シグマ^2)。
誰かがそれを実装する方法を知っていますか? R を使用することをお勧めします。
ありがとうございました!
ノイズのある高次元球からベクトルのサンプルを生成したいと考えています。
IE 任意のベクトル X が R^N にあり、||X+epsilon||^2 = 1 を保持するようなサンプルを作成しようとしています。ここで、epsilon は R^N の iid ベクトルであり、そのコンポーネント epsilon_j は N( 0,シグマ^2)。
誰かがそれを実装する方法を知っていますか? R を使用することをお勧めします。
ありがとうございました!
これはうまくいくはずだと思います。簡単に関数に変換できます。
d = 5 # number of dimensions
n_draws = 100 # number of draws
sigma = 0.2 # standard deviation
まず、単位球に均一に分布するランダムなベクトルをサンプリングします。これを行うには、d 次元の多変量正規分布から描画を正規化します。(このステップを実行するためのより直接的な方法があるかもしれませんが、rmvnorm
後でもう一度使用するので、これは便利です。) 私がそれらを呼び出すdirs
のは、正規化しているため、このステップで実際に行っているのは「方向のサンプリング」だけだからです。 "。
library(mvtnorm)
# sample
dirs = rmvnorm(n = n_draws, mean = rep(0, d))
# normalize
dirs = dirs / sqrt(rowSums(dirs^2))
ここで、多変量法線から別の描画を行い、ノイズを追加します。
x = dirs + rmvnorm(n = n_draws, mean = rep(0, d), sigma = sigma * diag(d))
これを質問で使用した変数にマッピングするには、Y = X + イプシロンを定義します。私dirs
が Y なら、追加するノイズは -epsilon です。それらを追加すると、要求した X が得られます。