如何创建一个以几何分布形式给出概率的函数?

时间:2019-04-29 21:04:17

标签: matlab probability-distribution

我正在使用MATLAB制作一个函数,当我输入p,q和no的值时,该函数返回几何分布的概率质量函数。尝试次数(x)作为输入。

我的功能:

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)

  

???类型为“ double”的输入参数的未定义函数或方法“ Geometric”。

我尝试过更改功能,并将其简化为一个输入和一个输出。

我希望概率可以计算出来,但事实并非如此。

1 个答案:

答案 0 :(得分:2)

出了什么问题?

p*q^x-1       % Your original code

您的原始代码占用q,将其提升为第x次幂,再乘以p,然后 then 减去1。这等效于遵循您肯定没有的代码。

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

考虑order of operations,更容易进行校正。

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

另一个可能错误源是您的函数未保存为独立的m文件“ Geometric.m”,该文件也必须位于您的MATLAB路径中(MATLAB必须“查看”它)。如果您的函数文件“ MyFunction.m ”存储在一个文件夹中,则可以使用一行将其添加到MATLAB的可见路径(或手动导航到该文件夹​​)。有关更多详细信息,请参见how to create a function

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

全面解决方案(3种方法)
Geometric distribution的参数化中,您需要{1,2,3,4,...}的支持。

两件事。 (1)我会推荐anonymous function这样的东西。 (2)确实不需要将 p q 分离为单独的变量,因为 p + < em> 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

以上代码完全是vectorized,因此您可以向其传递矢量和/或输入数组。

快速检查以确认它是有效的probability mass function (pmf)

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

方法2:功能(带错误检查)
顺便说一句,如果您想在函数输入上添加错误检查以确保 k 是正整数且 p ,则在MATLAB中创建函数非常有意义。在[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,...}”的其他“版本”进行参数化的(请参阅{{3 }})。

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

您可以通过调整输入来进行更正。

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

代码已通过MATLAB R2018b测试。