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

Этот пример показывает, как сгенерировать код, который подходит для распределения вероятностей к выборочным данным и оценивает подобранное распределение.

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

fitdist поддерживает генерацию кода для бета, экспоненциальных, экстремальных значений, lognormal, normal и распределений Weibull. Поддерживаемые функции объектов распределения вероятностей, созданные 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 Coder).

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

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

codegen myFitandEvaluate -args ARGS
Code generation successful.

codegen (MATLAB Coder) генерирует 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'), как описано в Pass a Entry-Point Function Output as a Input (MATLAB Coder). Вы не можете использовать 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 Coder) генерирует MEX-функцию myFitandEvaluate_mex2. Для получения дополнительной информации о генерации кода для нескольких функций точки входа, смотрите Сгенерируйте код для нескольких функций точки входа (MATLAB Coder).

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

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

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 CODER)

Похожие темы