Как сделать функцию, которая дает вероятности в геометрическом распределении? - PullRequest
1 голос
/ 30 апреля 2019

Я использую MATLAB для создания функции, которая возвращает функцию вероятности для геометрического распределения, когда я ввожу значения p, q и no. попыток (х) в качестве входных данных.

Моя функция:

function Probability = Geometric(p, q, x)
Probability = p*q^x-1

Теперь всякий раз, когда я пытаюсь вычислить вероятность, введите значения p , q и x , например:

Geometric(0.5, 0.5, 1),

Точная ошибка:

Геометрическая (0.5,0.5,1)

* * ??? 1 022 Неопределенная функция или метод 'Geometric' для входных аргументов типа 'double'.

Я пытался изменить функции и сократить их до одного входа и одного выхода.

Я ожидаю, что вероятности будут рассчитаны, но они просто не делают.

1 Ответ

2 голосов
/ 30 апреля 2019

Что не так?

p*q^x-1       % Your original code

Ваш исходный код принимает q, увеличивая его на x th, умножая на p, , затем , вычитая 1. Это эквивалентно следующему коду, который вы наверняка не делали Т намерения

(p*(q^x)) - 1     % What your code was doing written differently 

Учитывая порядок операций , исправление легко.

p*q^(x-1)         % Your corrected code     

Другой возможный источник ошибок - ваша функция не сохранена как отдельный m-файл "Geometric.m", который также должен находиться в вашем пути MATLAB (MATLAB должен его "увидеть"). Если у вас есть файл функции " MyFunction.m ", хранящийся в папке, вы можете добавить эту папку в видимый путь MATLAB одной строкой (или перейти туда вручную). Подробнее см. , как создать функцию .

.
mypathtoMyFunction = 'C:\Users\SonnyJordan\Documents\SweetCode\FunctionFolder';
path(path,'mypathtoMyFunction')    

Полное решение (3 подхода)
Из вашей параметризации Геометрическое распределение вам нужна поддержка {1, 2, 3, 4, ...}.

Две вещи. (1) Я бы порекомендовал анонимную функцию для чего-то подобного. (2) На самом деле нет необходимости разделять p и q как отдельные переменные, поскольку p + q = 1 и, следовательно, один определяет другой (т. Е. q = 1-p).

Подход 1: Анонимная функция

% MATLAB R2018b
geopmfh =@(p,k) p.*((1-p).^(k-1));     % Define pmf
k = 5;                                 % Number of trials
p = 0.2;                               % Prob("Success" on trial)
geopmfh(p,k)                           % Probability

Выше код полностью векторизован , так что вы можете передавать ему векторы и / или массивы входов.

Быстрая проверка, чтобы подтвердить, что это действительная функция вероятности массы (pmf) .

M = 500;     
sum(geopmfh(p,[1:M]))                % should return 1 if M large enough

Подход 2: Функция (без проверки ошибок)
Кроме того, создание функции в MATLAB имело бы большой смысл, если бы вы хотели добавить проверку ошибок на входах функций, чтобы убедиться, что k является положительным целым числом и что p находится между [0 1].

function [pmf] = geopmf(p,k)
%GEOPMF Calculates pmf for Geometric(p,k) distribution on {1,2,3,...}
%     pmf = geopmf(p,k)
%       p = n x d matrix of n d-dimensional success probabilities; must be [0,1]
%       k = m x d matrix of m d-dimensional numbers of trials
%     pmf = n x m matrix of probabilities 
%
% Examples:
% k = 4; p = .5;
% pmf = geopmf(p,k)   %  pmf = 0.0625      

% Input Error Checking ****************************************************
if isempty(p) | isempty(k), pmf = []; return, end
if nargin ~= 2, error('Function requires two inputs.'), end
if p < 0 | p > 1, error('p must be between 0 and 1.'), end
if k < 1 | ~isint(k), error('k must be positive integer & k > 0.'), end   % with this parameterization

n = size(p,1); d = size(p,2);
m = size(k,1); 
if isempty(p) | ~isnumeric(p) | ~ismatrix(p)
    error('p must be non-empty numeric scalar, vector, or 2-D matrix.');
elseif isempty(k) | ~isnumeric(k) | ~ismatrix(k) 
    error('k must be non-empty numeric scalar, vector, or 2-D matrix.');
elseif size(k,2) ~=d
    error('Rows of p and k must have same dimensions.');
end
% End (Input Error Checking) **********************************************

pmf = p.*((1-p).^(k-1));
end

Подход 3: Встроенная функция MATLAB
Если у вас есть набор инструментов статистики, в MATLAB для этого уже есть функция geopdf, но обратите внимание, что она параметризована в соответствии с другой «версией» с поддержкой {0, 1, 2, ...} ( см. вики-страницу ).

p.*((1-p).^k)          % The other parameterization
geopdf(k,p)            % Note order of inputs

Вы можете исправить это, отрегулировав свой ввод.

geopdf(k-1,p)          % Subtract 1 trial

Код, протестированный с MATLAB R2018b.

...