2016-07-05 2 views
0

Как создать экспоненциальное распределение для набора данных с помощью boost C++.Создание экспоненциального распределения для набора данных с помощью boost C++

У меня есть вектор, содержащий переменные float с именем vararr и с использованием Boost C++, и я хочу, чтобы он соответствовал экспоненциальному распределению и получал соответствующий параметр скорости (лямбда) для подгонки. Код equivalance в Matlab является:

PD = fitdist(vararr,'exponential'); 
vararr = sort(vararr); 
fxx = pdf(PD,vararr); 

мне нужно реализовать в C++

+0

AFAIK boost имеет * нет метода * для подгонки данных к распределению, только для генерации данных. Я помню, что в Numerical Recipes есть бот для вашего здравомыслия. Надеюсь, вы найдете лучший вариант. вы можете, например, запишите все элементы, затем примените линейную регрессию. – peterchen

ответ

1

экспоненциальное распределение есть, чтобы сгенерировать случайное число следующего определенным распределением. Чтобы использовать экспоненциальное распределение, вы делаете что-то вроде этого:

#include <iostream> 
#include <boost/random.hpp> 

int main() { 
    boost::mt19937 seed(5u); 
    boost::variate_generator<boost::mt19937&, boost::exponential_distribution<>> random_n(seed, boost::exponential_distribution<>()) ; 
    cout << random_n() << endl; return 0; 
} 

Теперь, я подозреваю, что вы хотите сделать что-то, но это не так ясно для меня. Вы хотите сортировать или что-то еще? Выберите случайное число в вашем векторе?

Редактировать: OK. Короче говоря, даже если у вас есть доступ к C++ 11, вы не можете зайти очень далеко. Большая часть случайного генератора теперь находится в стандарте. Но не PDF. Если вам интересно, почему: вот оно: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1398.html. Итак, вам определенно нужен инструментарий boost.math, это единственный способ вычислить ваш PDF-файл. Вот некоторые примеры код для вас:

#include <boost/math/distributions/exponential.hpp> 

int main() { 
    const auto lbda = 1.0; 
    const auto d = exponential_distribution<> { lbda }; 
    cout << pdf(d, 0) << endl; // e(0) = 1 
    cout << pdf(d, 1) << endl; // e(-1) = 0.3678 
    return 0; 
} 

Короче говоря: для использования подталкивания PDF, вам не нужен сам по себе вектору вызвать функцию PDF знает, как вычислить его распределение.

Редактировать 2: Если вам нужно заполнить вектор некоторым дистрибутивом, вы можете просто использовать std::generate и применить к нему дистрибутив, вот пример с std::exponential_distribution (C++ 11, но вы можете использовать boost) ,

std::vector<float> v(20); 

random_device rd; 
mt19937_64 gen(rd()); 
exponential_distribution<float> dis(1); 
auto rand = bind(dis, gen); 
generate(begin(v), end(v), rand); 
for (auto& e : v) cout << e << endl; 

код я показываю здесь, заполняющие vector из 20 элементов с экспоненциальным распределением. Вы можете переключиться на std::array, изменить поплавок на все, что вам нужно, увеличить размер вектора или массива.

Вы также можете взглянуть на эту старую C++-библиотеку (ныне pytonic), которая делает то, что вам нужно: http://myfitter.hepforge.org/. Вероятно, это ваш лучший выбор. Он использует непараметрический метод. Версия C++ довольно старая, и я не настолько уверен в полном функциональности, но, возможно, это пойдет вам.

+0

У меня есть вектор, содержащий поплавковые переменные с именем ** vararr ** и используя Boost C++, и я хочу, чтобы он соответствовал экспоненциальному распределению и получал соответствующий параметр скорости для соответствия. Код эквивалентности в Matlab: PD = fitdist (vararr, 'exponential'); vararr = sort (vararr); fxx = pdf (PD, vararr); –

+0

OK Я добавил несколько дополнительных объяснений. – Gibet

+0

Насколько я понимаю ОП, он хочет * приспосабливать * данные к экспоненциальному распределению. – peterchen

Смежные вопросы