Если ваш ввод указан в виде ненормализованной гистограммы, то просто с помощью встроенной функции quantile()
автоматически вычисляется точка данных для указанного квантиля, что и делает обратный CDF. Если гистограмма нормализована по количеству точек данных (что делает ее вектором вероятности), то сначала просто умножьте ее на количество точек данных. См. здесь для подробностей quantile()
. По сути, вы предполагаете, что с учетом вашей гистограммы / данных первый параметр является фиксированным, что превращает quantiles()
в функцию только с указанными значениями вероятности p
. Вы можете легко написать функцию-обертку, чтобы сделать ее более удобной в случае необходимости. Это избавляет от необходимости явно вычислять CDF с cumsum()
.
Добавлена
Если мы предположим, что гистограмма, ячейки и количество точек данных равны h, b, and N
соответственно, то:
h1 = N*h; %// Only if histogram frequencies have been normalized.
data = [];
for kk = 1:length(h1)
data = [data repmat(b(kk), 1, h1(kk))];
end
%// Set p to the probability you want the inv-cdf for...
p = 0.5;
inv_cdf = quantiles(data,p)
Добавлена
Для решений, которые должны использовать существующий вектор PDF, мы можем сделать следующее. Предположим, что x_old
и pdf_old
- это ячейки гистограммы и частоты гистограммы соответственно.
p = 0.5; %// the inv-cdf probability that I want
num_points_i_want = 100; %// the number of points I want in my histogram vector
x_new = linspace(min(x_old),max(x_old),num_points_i_want);
pdf_new = interp1(x_old,pdf_old,x_new);
cdf_new = cumsum(pdf_new);
inv_cdf = min(x_new(cdf_new >= p));
В качестве альтернативы, мы могли бы сначала создать cumsum()
CDF и использовать interp1()
для этого, если нежелательно сначала интерполировать.