【问题标题】:How to plot PDF and CDF for a normal distribution in matlab如何在matlab中为正态分布绘制PDF和CDF
【发布时间】:2013-11-30 13:13:25
【问题描述】:

我在 matlab 中找不到实现获取正态分布的均值和标准差并绘制其PDFCDF 的函数。

恐怕我在下面实现的两个函数缺少一些东西,因为我得到了大于 1 的 pdfNormal 的最大值。

function plotNormPDF(u,s,color)
    mu = u; 
    sigma = s; 
    x = (mu - 5 * sigma) : (sigma / 100) : (mu + 5 * sigma); 
    pdfNormal = normpdf(x, mu, sigma);
    string = 'the maximal pdfNormal is';
    string = sprintf('%s :%d', string,max(pdfNormal));
    disp(string)
    plot(x, pdfNormal/max(pdfNormal),color); 
end

对于 CDF 规范

function plotNormCDF(u,s,color)
    mu = u; 
    sigma = s; 
    x = (mu -  5*sigma) : (sigma / 100) : (mu + 5*sigma); 
    pdfNormal = normpdf(x, mu, sigma);
    plot(x,cumsum(pdfNormal)./max(cumsum(pdfNormal)),color)
end

以下是同时使用两者的示例:

plotNormCDF(0.2, 0.1,'r')
plotNormPDF(0.2, 0.1,'r')

【问题讨论】:

  • 如果pdf的最大值大于1就可以了:曲线下的密度需要积分为1。考虑一下:在pdf上取一个点并将其值设置为100万.该点下方的面积仍为 0,因此 pdf 下方的面积不受影响。或者,考虑 [0,.5] 上的均匀分布:要积分为 1,pdf 在支持的任何地方都等于 2。有关更多信息,请参考以下 whuber 评论和他提供的链接:stats.stackexchange.com/questions/47714/…
  • “与概率不同,概率密度函数可以取大于 1 的值”在您参考的*页面中。

标签: matlab normal-distribution cdf


【解决方案1】:

你不需要所有的代码,看看它有多简单:

mu = 0.2; sigma = 0.1;
x = linspace (mu-4*sigma, mu+4*sigma);
plot(x, normpdf (x,mu,sigma))
plot(x, normcdf (x,mu,sigma))

【讨论】:

  • +1 只需将第三个参数添加到linspace 即可实现对x 轴的更精细采样
  • linspace(mu-4*sigma, mu+4*sigma, 10000)
【解决方案2】:

你的函数plotNormPDF 是正确的,只是你不应该除以最大值。正如大卫马克思所写,概率密度函数可以达到的值没有上限,只有在可能值范围内的积分限制。

function plotNormPDF(u,s,color)
mu = u;
sigma = s;
x = (mu - 5 * sigma) : (sigma / 100) : (mu + 5 * sigma);
pdfNormal = normpdf(x, mu, sigma);
string = 'the maximal pdfNormal is';
string = sprintf('%s :%d', string,max(pdfNormal));
disp(string)
plot(x, pdfNormal,color);
end

您的函数plotNormCDF 原则上是正确的,但可能不是很精确,因为它通过累积和来近似积分。最好使用函数normcdf。此处将最大值归一化为 1 既没有必要也没有效果。

function plotNormCDF(u,s,color)
mu = u;
sigma = s;
x = (mu -  5*sigma) : (sigma / 100) : (mu + 5*sigma);
cdfNormal = normcdf(x, mu, sigma);
plot(x,cdfNormal,color)
end

【讨论】: