1

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

我的功能:

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

现在,每当我尝试通过输入pqx的值来计算概率时,例如:

Geometric(0.5, 0.5, 1),

确切的错误:

几何(0.5,0.5,1)

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

我尝试过更改功能,并将它们减少为一个输入和一个输出。

我希望计算概率,但他们只是没有。

4

1 回答 1

2

怎么了?

p*q^x-1       % Your original code

您的原始代码是q,将其提高xth 次方,将其乘以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)实际上没有必要将pq作为单独的变量分开,因为p + q = 1,因此一个决定另一个(即q = 1-p)。

方法一:匿名函数

% 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:函数(带错误检查)
顺便说一句,如果您想在函数输入上添加错误检查以确保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 测试的代码。

于 2019-04-30T02:00:41.617 回答