What are practical uses for STL's 'partial_sum'?

前端 未结 11 1701
耶瑟儿~
耶瑟儿~ 2021-02-04 03:47

What/where are the practical uses of the partial_sum algorithm in STL?

What are some other interesting/non-trivial examples or use-cases?

11条回答
  •  抹茶落季
    2021-02-04 04:36

    In nonparametric Bayesian methods there is a Metropolis-Hastings step (per observation) that determines to sample a new or an existing cluster. If an existing cluster has to be sampled this needs to be done with different weights. These weighted likelihoods are simulated in the following example code.

    #include                                                                                                        
    #include                                                                                                      
    #include                                                                                                     
    
    int main() {                                                                                                            
    
        std::default_random_engine generator(std::random_device{}());                                                       
        std::uniform_real_distribution distribution(0.0,1.0);                                                       
    
        int K = 8;                                                                                                          
    
        std::vector weighted_likelihood(K);                                                                         
        for (int i = 0; i < K; ++i) {                                                                                       
            weighted_likelihood[i] = i*10;                                                                                  
        }                                                                                                                   
        std::cout << "Weighted likelihood: ";                                                                               
        for (auto i: weighted_likelihood) std::cout << i << ' ';                                                            
        std::cout << std::endl;                                                                                             
    
        std::vector cumsum_likelihood(K);                                                                           
        std::partial_sum(weighted_likelihood.begin(), weighted_likelihood.end(), cumsum_likelihood.begin());                
    
        std::cout << "Cumulative sum of weighted likelihood: ";                                                             
        for (auto i: cumsum_likelihood) std::cout << i << ' ';                                                              
        std::cout << std::endl;                                                                                             
    
        std::vector frequency(K);                                                                                      
    
        int N = 280000;                                                                                                     
        for (int i = 0; i < N; ++i) {                                                                                       
            double pick = distribution(generator) * cumsum_likelihood.back();                                               
    
            auto lower = std::lower_bound(cumsum_likelihood.begin(), cumsum_likelihood.end(), pick);                        
            int index = std::distance(cumsum_likelihood.begin(), lower);                                                    
            frequency[index]++;                                                                                             
        }                                                                                                                   
    
        std::cout << "Frequencies: ";                                                                                       
        for (auto i: frequency) std::cout << i << ' ';                                                                      
        std::cout << std::endl;                                                                                             
    
    }
    

    Note that this is not different from the answer by https://stackoverflow.com/users/13005/steve-jessop. It's added to give a bit more context about a particular situation (nonparametric Bayesian mehods, e.g. the algorithms by Neal using the Dirichlet process as prior) and the actual code which uses partial_sum in combination with lower_bound.

提交回复
热议问题