exponenta event banner

Создание кода для объектов распределения вероятностей

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

Сначала определите функцию точки входа, использующую fitdist для создания объекта распределения вероятностей и использует его объектные функции для оценки подобранного распределения. Затем создайте код для функции точки входа с помощью codegen (Кодер MATLAB). Функция точки входа может иметь объект распределения вероятности как входной аргумент, так и выходной аргумент. Таким образом, в качестве альтернативы можно определить две функции точки входа: одну для подгонки распределения и другую для оценки подгоняемого распределения. Первая функция точки входа возвращает аппроксимированное распределение, а вторая функция точки входа принимает аппроксимированное распределение в качестве входного аргумента. В этом примере сначала описывается рабочий процесс с одной функцией точки входа, а затем кратко описывается рабочий процесс с двумя функциями точки входа.

fitdist поддерживает генерацию кода для бета, экспоненциальных, экстремальных значений, логнормальных, нормальных и Вейбулловых распределений. Поддерживаемые объектные функции подогнанных объектов распределения вероятностей, созданные fitdistявляются cdf, icdf, iqr, mean, median, pdf, std, truncate, и var.

Дополнительные сведения о создании кода см. в разделе Общий рабочий процесс создания кода.

Определение функции точки входа

Определение функции точки входа с именем myFitandEvaluate при этом берутся данные выборки, имя распределения, пределы усечения распределения и значения данных, при которых оценивается кумулятивная функция распределения (cdf) и функция плотности вероятности (pdf). В рамках функции точки входа поместите объект распределения вероятности в выборочные данные, усечите распределение до заданных пределов усечения, вычислите среднее усеченного распределения и вычислите значения cdf и pdf при заданных значениях данных.

Отображение содержимого myFitandEvaluate.m файл.

type myFitandEvaluate.m
function [pd_truncated,st] = myFitandEvaluate(data,distname,truncation_limits,x) %#codegen
% Fit a probability distribution object to data.
pd = fitdist(data,distname);

% Truncate pd.
pd_truncated = truncate(pd,truncation_limits(1),truncation_limits(2));

% Compute the mean of the truncated pd.
mean_val = mean(pd_truncated);

% Compute the cdf and pdf, evaluated at x.
cdf_val = cdf(pd_truncated,x);
pdf_val = pdf(pd_truncated,x);

% Create a structure array containing the mean, cdf, and pdf values.
st = struct('mean', mean_val,'cdf',cdf_val,'pdf',pdf_val);
end

Примечание.Если нажать кнопку, расположенную в правом верхнем разделе этой страницы, и открыть этот пример в MATLAB ®, MATLAB откроет папку примеров. Эта папка содержит файлы функций начального уровня для этого примера.

Создать код

Укажите типы входных аргументов myFitandEvaluate с использованием массива ячеек «4 на 1». Назначьте каждой ячейке каждый тип входного аргумента функции точки входа. Укажите тип данных и точный размер входного массива на примере значения, представляющего набор значений с определенным типом данных и размером массива.

ARGS = cell(4,1);
ARGS{1} = ones(100,1);
ARGS{2} = coder.Constant('Exponential');
ARGS{3} = ones(1,2);
ARGS{4} = ones(10,1);

Второй вход myFitandEvaluate является именем распределения, которое является вторым входным аргументом fitdist. Этот аргумент должен быть константой времени компиляции. Поэтому необходимо указать ARGS{2} с помощью coder.Constant (Кодер MATLAB).

Если требуется указать ARGS{1} и ARGS{3} в качестве входных данных переменного размера, coder.typeof (Кодер MATLAB). Дополнительные сведения см. в разделе Общий рабочий процесс создания кода.

Создание функции MEX из функции точки входа myFitandEvaluate. Укажите типы входных аргументов с помощью -args параметр и массив ячеек ARGS.

codegen myFitandEvaluate -args ARGS
Code generation successful.

codegen (Кодер MATLAB) генерирует функцию MEX myFitandEvaluate_mex с зависящим от платформы расширением в текущей папке.

Проверить созданный код

Передать некоторые данные, чтобы проверить, myFitandEvaluate и myFitandEvaluate_mex возвращает те же выходные данные.

rng('default') % For reproducibility
data = exprnd(1,[100,1]); % Exponential random numbers with mean parameter 1
distname = 'Exponential';
truncation_limits = [0,4];
x = (0:9)';
[pd_truncated,st] = myFitandEvaluate(data,distname,truncation_limits,x);
[pd_truncated_mex,st_mex] = myFitandEvaluate_mex(data,distname,truncation_limits,x);

Сравнение объектов распределения вероятностей pd_truncated и pd_truncated_mex.

pd_truncated
pd_truncated = 
  ExponentialDistribution

  Exponential distribution
    mu = 0.917049
  Truncated to the interval [0, 4]

pd_truncated_mex
pd_truncated_mex = 
  ExponentialDistribution

  Exponential distribution
    mu = 0.917049
  Truncated to the interval [0, 4]

verifyMEX_pd = isequal(pd_truncated,pd_truncated_mex)
verifyMEX_pd = logical
   1

isequal возвращает логический 1 (true), что означает pd_truncated и pd_truncated_mex равны.

Сравните массивы структуры, содержащие средние значения, значения cdf и pdf.

verifyMEX_st = isequal(st,st_mex)
verifyMEX_st = logical
   1

Сравнение подтверждает, что myFitandEvaluate и myFitandEvaluate_mex возвращает те же выходные данные. Сгенерированный код может не дать таких же числовых результатов с плавающей запятой, как MATLAB, как описано в разделе Различия между сгенерированным кодом и кодом MATLAB (MATLAB Coder). В этом случае сравните значения, допускающие небольшой допуск.

Поток операций с двумя функциями точки входа

Функция точки входа может иметь объект распределения вероятности как входной аргумент, так и выходной аргумент. Таким образом, можно определить две функции точки входа: одну для подгонки распределения, а другую для оценки подгоняемого распределения. Затем создайте код для двух функций точки входа.

Определение функций точек входа

Определите две функции точки входа. Первая функция точки входа myFitDist подгоняет объект распределения вероятности к данным выборки. Вторая функция точки входа myEvaluateDist усекает распределение, вычисляет среднее усеченного распределения и вычисляет значения cdf и pdf при заданных значениях данных. myEvaluateDist принимает выходные данные myFitDist в качестве входного аргумента.

Отображение содержимого myFitDist.m и myEvaluateDist.m файлы.

type myFitDist.m
function pd = myFitDist(data,dist) %#codegen
% Fit probability distribution object to data.
pd = fitdist(data,dist);
end
type myEvaluateDist.m
function [pd_truncated,st] = myEvaluateDist(pd,truncation_limits,x) %#codegen
% Truncate pd.
pd_truncated = truncate(pd,truncation_limits(1),truncation_limits(2));

% Compute the mean of the truncated pd.
mean_val = mean(pd_truncated);

% Compute the cdf and pdf, evaluated at x.
cdf_val = cdf(pd_truncated,x);
pdf_val = pdf(pd_truncated,x);

% Create a structure array containing the mean, cdf, and pdf values.
st = struct('mean', mean_val,'cdf',cdf_val,'pdf',pdf_val);
end

Создать код

Укажите типы входных аргументов myFitDist и myEvaluateDist.

ARGS_myFitDist = cell(2,1);
ARGS_myFitDist{1} = ones(100,1);
ARGS_myFitDist{2} = coder.Constant('Exponential');

ARGS_myEvaluateDist = cell(3,1);
ARGS_myEvaluateDist{1} = fitdist(exprnd(1,[100,1]),'Exponential');
ARGS_myEvaluateDist{2} = ones(1,2); 
ARGS_myEvaluateDist{3} = ones(10,1);

Если не требуется создавать функцию MEX, можно указать ARGS_myEvaluateDist{1} как coder.OutputType('myFitdist'), как описано в разделе Передача выходного сигнала функции точки входа в качестве входного сигнала (кодер MATLAB). Вы не можете использовать coder.OutputType (MATLAB Coder) при генерации функции MEX, поскольку тип данных вывода из myFitDist не соответствует типу данных ввода для myEvaluateDist в сгенерированной функции MEX.

Создайте код для двух функций точки входа.

codegen -o myFitandEvaluate_mex2 myFitDist -args ARGS_myFitDist myEvaluateDist -args ARGS_myEvaluateDist
Code generation successful.

codegen (Кодер MATLAB) генерирует функцию MEX myFitandEvaluate_mex2. Дополнительные сведения о создании кода для нескольких функций точки входа см. в разделе Создание кода для нескольких функций точки входа (кодер MATLAB).

Проверить созданный код

Проверьте созданный код.

rng('default') 
data = exprnd(1,[100,1]);
distname = 'Exponential';
truncation_limits = [0,4];
x = (0:9)';
pd2 = myFitDist(data,distname);
[pd_truncated2,st2] = myEvaluateDist(pd2,truncation_limits,x);
pd_mex2 = myFitandEvaluate_mex2('myFitDist',data,distname);
[pd_truncated_mex2,st_mex2] = myFitandEvaluate_mex2('myEvaluateDist',pd_mex2,truncation_limits,x);
verifyMEX_pd2 = isequal(pd2,pd_mex2)
verifyMEX_pd2 = logical
   1

verifyMEX_pd_truncated2 = isequal(pd_truncated2,pd_truncated_mex)
verifyMEX_pd_truncated2 = logical
   1

verifyMEX_st2 = isequal(st2,st_mex2)
verifyMEX_st2 = logical
   1

isequal возвращает логический 1 (true), что означает, что функции начальной точки и соответствующие функции MEX возвращают одни и те же выходные сигналы.

См. также

| | | | | | | (кодер MATLAB)

Связанные темы