Мой вопрос заключается в том, можно ли преобразовать вектор, в котором хранятся образцы исходного CDF (накопительная функция плотности) …
что-то вроде этого:
class normal
{
public:
float mean;
float sigma;
float variance = sigma * sigma;
float left_margin = mean - 4 * sigma;
float right_margin = mean + 4 * sigma;
normal():mean(0), sigma(1){}
normal(float m, float s):mean(m), sigma(s){}
float cdf(float x);
float pdf(float x);
};
float normal::pdf(float x)
{
if (x < left_margin || x > right_margin) return 0;
float coefficient = 1 / (float)sqrt(2 * PI * variance);
float x_mean = x - mean;
float result = coefficient * exp(-(x_mean * x_mean) / 2 * variance);
return result;
}
float normal::cdf(float x)
{
if (x <= left_margin) return 0;
if (x >= right_margin) return 1;
float x_mean = x - mean;
float result = (float)(0.5 * (1 + erf((x_mean) / sqrt(2 * variance))));
if (result > 1) return 1;
else return result;
}
std::vector<float> discrete_normal_cdf(normal& X)
{
std::vector<float> vec;
float L = (float)(X.left_margin);
float R = (float)(1.2 * X.right_margin);
while (L <= R)
{
vec.push_back(X.cdf(L));
L = (float)(L + 0.1);
}
std::vector<float> tmp;
// take three samples
tmp.push_back(vec.at(1)); // first non_zero element
tmp.push_back(vec.at(40)); // add element with value of 0.5
tmp.push_back(vec.at(80)); // element with value of 0.99std::vector<float> cdf_v(5, 0);
for (auto i = 0; i < tmp.size(); i++)
cdf_v.push_back(tmp.at(i));
int l = 0;
while (l < 5)
{
cdf_v.push_back(1);
l++;
}
return cdf_v;
}
На самом деле то, что мне нужно, это: если у нас есть нормальный
normal n1(5, 1);
возьмите образцы его CDF, чтобы разрезать линейный CDF:
vector<float> foo = discrete_normal_cdf(n1);
затем восстановить кусочно-линейный CDF в нормальный
normal function(foo)
{
return normal(5, 1);
}
Эта функция действительна?
Я написал функцию, которая принимает вектор в качестве входа
и поиск всех элементов вектора для значения 0,5
и возвращает индекс этого элемента как среднее от нормального
но это не всегда так.
normal vec2normal(vector<float>& vec)
{
int mean;
mean = std::find(vec.begin(), vec.end(), 0.5) - vec.begin();
return normal(mean, 1);
}
Я понятия не имею, как это сделать, поэтому любые предложения будут оценены
благодарю вас.
Задача ещё не решена.
Других решений пока нет …