【问题标题】:Adding Gaussian noise添加高斯噪声
【发布时间】:2015-10-01 13:49:25
【问题描述】:

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

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

其中m 是列表中的数字之一,k 是标准差,其值为0.1C++ 相当于 randn() 是什么?

你能举个例子吗?

【问题讨论】:

    标签: c++ matlab


    【解决方案1】:

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

    (live example)

    #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();
    

    (Live example with these modifications)

    【讨论】:

      【解决方案2】:

      c++ 标准现在包括多个随机数分布。

      您正在寻找std::normal_distribution

      您还可以在文档中找到code sample

        // 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)。

      【讨论】:

        猜你喜欢
        • 2011-09-12
        • 2013-10-14
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 2015-02-04
        • 1970-01-01
        • 1970-01-01
        • 2014-08-26
        相关资源
        最近更新 更多