加入高斯噪声

Adding Gaussian noise

本文关键字:噪声 高斯      更新时间:2023-10-16

我有一个包含浮点数列表的.arff文件。我需要为每个数字添加高斯噪声,在MATLAB中为:

m = m+k*randn(size(m)

,其中m是列表中的数字之一,k是标准差,其值为0.1C++randn()的等价值是多少?

你能举个例子吗?

使用std::normal_distribution和适当的生成器(std::default_random_engine通常可以工作)。有关c++标准库中所有随机数生成工具的详细信息,请参阅http://en.cppreference.com/w/cpp/numeric/random。

(生活)

#include <iostream>
#include <iterator>
#include <random>
int main() {
    // Example data
    std::vector<double> data = {1., 2., 3., 4., 5., 6.};
    // Define random generator with Gaussian distribution
    const double mean = 0.0;
    const double stddev = 0.1;
    std::default_random_engine generator;
    std::normal_distribution<double> dist(mean, stddev);
    // Add Gaussian noise
    for (auto& x : data) {
        x = x + dist(generator);
    }
    // Output the result, for demonstration purposes
    std::copy(begin(data), end(data), std::ostream_iterator<double>(std::cout, " "));
    std::cout << "n";
    return 0;
}
输出:

0.987803 1.89132 3.06843 3.89248 5.00333 6.07448 

进一步考虑

对于合适的统计属性,您可能希望选择std::mersenne_twister_engine生成器(或者,为了方便,使用std::mt19937预定义版本),并使用std::random_device:

将其种子化。
std::mt19937 generator(std::random_device{}()); 

[注意:从std::random_device播种是进入的好做法;如果你使用当前时间作为种子,你最终可以在多个生成器中使用相同的种子值(例如,在很短的时间内初始化几个生成器)。std::random_device将从系统中获得熵,如果可用。]

为了避免每次都将生成器传递给分发版,您可以这样做:

auto dist = std::bind(std::normal_distribution<double>{mean, stddev},
                      std::mt19937(std::random_device{}()));

,你可以这样使用:

double val = dist();

(带有这些修改的实例)

c++标准现在包含了几个随机数的分布。

你正在寻找std::normal_distribution。

在文档中你也可以找到一个代码示例

  // construct a trivial random generator engine from a time-based seed:
  unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
  std::default_random_engine generator (seed);
  std::normal_distribution<double> distribution (0.0,1.0);
  std::cout << "some Normal-distributed(0.0,1.0) results:" << std::endl;
  for (int i=0; i<10; ++i)
    std::cout << distribution(generator) << std::endl;

给构造函数std::normal_distribution的参数首先是均值(0.0)和标准差(1.0)。