Обучите обобщенную линейную модель, а затем сгенерируйте код из функции, которая классифицирует новые наблюдения на основе модели. Этот пример основан на примере Use Custom-Defined Link Function.
Введите выборочные данные.
Предположим, что обратный режим PDF является подходящей функцией ссылки для задачи.
Задайте функцию с именем myInvNorm.m
который принимает значения и возвращает соответствующие значения обратной переменной стандартного нормального cdf.
function in = myInvNorm(mu) %#codegen
%myInvNorm Inverse of standard normal cdf for code generation
% myInvNorm is a GLM link function that accepts a numeric vector mu, and
% returns in, which is a numeric vector of corresponding values of the
% inverse of the standard normal cdf.
%
in = norminv(mu);
end
Задайте другую функцию с именем myDInvNorm.m
который принимает значения и возвращает соответствующие значения производной функции ссылки.
function din = myDInvNorm(mu) %#codegen
%myDInvNorm Derivative of inverse of standard normal cdf for code
%generation
% myDInvNorm corresponds to the derivative of the GLM link function
% myInvNorm. myDInvNorm accepts a numeric vector mu, and returns din,
% which is a numeric vector of corresponding derivatives of the inverse
% of the standard normal cdf.
%
din = 1./normpdf(norminv(mu));
end
Задайте другую функцию с именем myInvInvNorm.m
который принимает значения и возвращает соответствующие значения обратной функции ссылки.
function iin = myInvInvNorm(mu) %#codegen
%myInvInvNorm Standard normal cdf for code generation
% myInvInvNorm is the inverse of the GLM link function myInvNorm.
% myInvInvNorm accepts a numeric vector mu, and returns iin, which is a
% numeric vector of corresponding values of the standard normal cdf.
%
iin = normcdf(mu);
end
Создайте массив структур, который задает каждую из функций ссылки. В частности, массив структур содержит поля с именем 'Link'
, 'Derivative'
, и 'Inverse'
. Соответствующими значениями являются имена функций.
link =
struct with fields:
Link: 'myInvNorm'
Derivative: 'myDInvNorm'
Inverse: 'myInvInvNorm'
Подбор GLM для y
на x
использование функции link link
. Верните массив структур статистики.
b
является вектором 2 на 1 коэффициентах регрессии.
В текущей рабочей папке задайте функцию, называемую classifyGLM.m
что:
Принимает измерения с столбцами, соответствующими показателям в x
, коэффициенты регрессии, размерности которых соответствуют b
, функцию ссылки связи, структуру статистики GLM и любые действительные glmval
аргумент пары "имя-значение"
Возвращает предсказания и доверительные интервальные поля ошибки
function [yhat,lo,hi] = classifyGLM(b,x,link,varargin) %#codegen
%CLASSIFYGLM Classify measurements using GLM model
% CLASSIFYGLM classifies the n observations in the n-by-1 vector x using
% the GLM model with regression coefficients b and link function link,
% and then returns the n-by-1 vector of predicted values in yhat.
% CLASSIFYGLM also returns margins of error for the predictions using
% additional information in the GLM statistics structure stats.
narginchk(3,Inf);
if(isstruct(varargin{1}))
stats = varargin{1};
[yhat,lo,hi] = glmval(b,x,link,stats,varargin{2:end});
else
yhat = glmval(b,x,link,varargin{:});
end
end
Сгенерируйте MEX-функцию из classifyGLM.m
. Поскольку на C используется статическое типирование, codegen
необходимо определить свойства всех переменных в файлах MATLAB ® во время компиляции. Чтобы убедиться, что MEX-функция может использовать те же входы, используйте -args
аргумент для задания следующего в заданном порядке:
Коэффициенты регрессии b
как константа времени компиляции
Наблюдения в выборке x
Ссылка как константа времени компиляции
Результат статистики GLM как константа времени компиляции
Имя 'Confidence'
как константа времени компиляции
Доверительный уровень 0.9
Чтобы обозначить аргументы как константы времени компиляции, используйте coder.Constant
.
Code generation successful.
codegen
генерирует файл MEX classifyGLM_mex.mexw64
в текущей папке. Расширение файла зависит от вашей системной платформы.
Сравнение предсказаний при помощи glmval
и classifyGLM_mex
. Задайте аргументы пары "имя-значение" в том же порядке, что и в -args
аргумент в вызове codegen
.
agree1 =
logical
1
agree2 =
logical
1
agree3 =
logical
1
Сгенерированная MEX-функция производит те же предсказания, что и predict
.