当前位置 : 首页 » 互动问答 » 正文

如何在MATLAB中标准化直方图?

分类 : 互动问答 | 发布时间 : 2011-03-16 11:19:48 | 评论 : 7 | 浏览 : 185374 | 喜欢 : 46

如何对直方图进行归一化,使得概率密度函数下的面积等于1?

回答(7)

  • 1楼
  • 我对此的回答与对之前的问题的回答相同。对于概率密度函数,整个空间的积分是1 。除以总和将not给出正确的密度。要获得正确的密度,您必须除以面积。为了说明我的观点,请尝试以下示例。

     [f,x] = hist(randn(10000,1),50); %从正态分布创建直方图。
    g = 1 / sqrt(2 * pi)* exp(-0.5 * x。^ 2); %pdf的正态分布
    
    %方法1:按SUM分割
    图1)
    bar(x,f / sum(f));等一下
    plot(x,g,'r');推迟
    
    %方法2:按区域划分
    图(2)
    bar(x,f / trapz(x,f));等一下
    plot(x,g,'r');推迟
    

    你可以自己看看哪种方法与正确的答案一致(红色曲线)。

    enter image description here

    另一种方法(比方法2更简单)来规范化直方图是除以 sum(f * dx)来表示概率的积分密度函数,即

    %方法3:使用sum()除以面积
    图(3)
    dx = diff(x(1:2))
    bar(x,f / sum(f * dx));等一下
    plot(x,g,'r');推迟
  • 2楼
  • 自2014b以来,Matlab具有这些原生嵌入的规范化例程 in the histogram函数(请参阅此函数提供的6个例程的help file)。下面是使用 PDF规范化(所有bin的总和为1)的示例。

     data = 2 * randn(5000,1)+ 5; %生成正常随机(m = 5,std = 2)
    h =直方图(数据,'标准化','pdf')%PDF标准化
    

    相应的PDF是

     Nbins = h.NumBins;
    edges = h.BinEdges;
    x =零(1,Nbins);
    for counter = 1:Nbins
        midPointShift = abs(edge(counter)-edges(counter + 1))/ 2;
        x(计数器)=边(计数器)+ midPointShift;
    结束
    
    mu = mean(数据);
    sigma = std(数据);
    
    f = exp( - (x-mu)。^ 2./(2*sigma^2))./(sigma*sqrt(2*pi));
    

    两者合在一起

     hold on;
    图(x和F '线宽',1.5)
    

    enter image description here

    一个很好的改进可能是由于实际问题的成功和已接受的答案!


    编辑 - 应该使用hist and histc is 不推荐 now, and histogram代替。请注意,使用这个新函数创建二进制文件的6种方法都不会产生二进制文件hist and histc。有一个Matlab脚本可以更新以前的代码以适应调用histogram的方式(bin边缘而不是bin中心 - link)。通过这样做,可以比较pdf规范化方法 of @abcd (trapz and sum)和Matlab(pdf).

    The 3 pdf规范化方法给出几乎相同的结果(在eps).

    TEST:

     A = randn(10000)范围内,1);
    中心= -6:0.5:6;
    d = diff(center)/ 2;
    edges = [centers(1)-d(1),center(1:end-1)+ d,center(end)+ d(end)];
    edge(2:end)= edges(2:end)+ eps(edges(2:end));
    
    数字;
    副区(2,2,1);
    HIST(A,中心);
    标题('HIST未规范化');
    
    副区(2,2,2);
    h =直方图(A,边缘);
    标题('HISTOGRAM未标准化');
    
    副区(2,2,3)
    [计数,中心] = hist(A,center); %使用hist获取计数
    酒吧(中心,计数/ trapz(中心,计数))
    标题('带有PDF规范化的HIST');
    
    
    副区(2,2,4)
    h =直方图(A,边缘,'标准化','pdf')
    标题('带有PDF规范化的直方图');
    
    dx = diff(中心(1:2))
    normalization_difference_trapz = abs(计数/陷阱(中心,计数) -  h.Values);
    normalization_difference_sum = abs(计数/总和(计数* dx) -  h.Values);
    
    MAX(normalization_difference_trapz)
    MAX(normalization_difference_sum)
    

    enter image description here

    新PDF规范化与前者之间的最大差异为5.5511e-17。

  • 3楼
  • hist不仅可以绘制直方图,还可以返回每个bin中元素的数量,因此您可以获得该计数,通过将每个bin除以总数来标准化,并使用bar. Example:

     Y = rand(10,1)绘制结果;
    C = hist(Y);
    C = C ./ sum(C);
    杆(C)
    

    或者如果你想要一个单行:

     bar(hist(Y)./ sum(hist(Y)))
    

    文档:

    Edit:此解决方案回答问题如何使所有二进制的总和等于1。仅当您的bin大小相对于数据的方差较小时,此近似才有效。这里使用的总和对应于一个简单的求积公式,更复杂的公式可以像trapz一样使用R. M.

  • 4楼
  • 并[f,X] = HIST(数据)
    

    每个单独栏的区域是高度*宽度。由于MATLAB将为条形选择等距点,因此宽度为:

     delta_x = x(2) -  x(1)
    

    现在,如果我们总结所有单个条形图,则总面积将显示为

     A = sum(f)* delta_x
    

    因此正确缩放的图是通过

     bar获得的(x,f / sum(f)/(x(2)-x(1)))
  • 5楼
  • abcd的PDF区域不是一个,这在许多评论中都是不可能的。 这里的许多答案中做出的假设

    1. 假设连续边之间的距离恒定。
    2. pdf下的概率应该是1.规范化应该以规范化 with 概率, not as 规范化 with pdf,histogram()和hist()来完成。

    图。 1 hist()方法的输出,图2直方图的输出()方法

    enter image description here enter image description here

    最大振幅在两种方法之间不同,这提出了hist()方法中存在一些错误,因为histogram()的方法使用了标准规范化。 我假设这里的hist()方法的错误是关于标准化为部分pdf,不完全是概率.

    代码与hist()[不赞成]

    一些备注

    1. 首先检查:sum(f)/N gives 1 if Nbins手动设置。
    2. pdf需要图表中的bin(dx)的宽度g

    Code

    %http://stackoverflow.com/a/5321546/54964
    N = 10000;
    Nbins = 50;
    并[f,X] = HIST(randn(N,1),Nbins); %从ND创建直方图
    
    %方法4:计算密度,而不是总和!
    图(3)
    DX = DIFF(×(1:2)); bin的宽度%
    g = 1 / sqrt(2 * pi)* exp(-0.5 * x。^ 2)。* dx; ND的%pdf与dx
    %1.0000
    bar(x,f / sum(f));等等
    情节(x,g,'r');推迟
    

    输出如图1所示。

    带有直方图的代码()

    一些备注

    1. 首先检查:a)sum(f) is 1 if Nbins用histogram()调整为标准化为概率,b)sum(f)/N is 1 if Nbins手动设置而不进行规范化。
    2. pdf需要图形中的bin宽度(dxg

    Code

     %%方法5:使用histogram()
    %http://stackoverflow.com/a/38809232/54964
    N = 10000;
    
    图(4);
    h =直方图(randn(N,1),'Normalization','probability')%hist()已弃用!
    Nbins = h.NumBins;
    边缘= h.BinEdges;
    X =零(1,Nbins);
    F = h.Values;
    for counter = 1:Nbins
        midPointShift = ABS(边缘(计数器)-edges(计数器+ 1))/ 2;所有人的百分比相同
        X(计数器)=边缘(计数器)+ midPointShift;
    结束
    DX = DIFF(×(1:2));所有的%constast
    g = 1 / sqrt(2 * pi)* exp(-0.5 * x。^ 2)。* dx; ND的%pdf
    %如果Nbins手动设置,则使用
    %new_area = sum(f)/连续边缘的N%diff常数
    %使用if histogarm()归一化概率
    new_area =总和(F)
    %1.0000
    %此处需要bar()with histogram()归一化概率
    等一下;
    情节(x,g,'r');推迟
    

    图2中的输出和预期输出满足:面积1.0000。

    Matlab:2016a
    系统:Linux Ubuntu 16.04 64位
    Linux内核4.6

  • 6楼
  • 对于一些发行版,Cauchy我认为,我发现trapz会高估该区域,因此pdf将根据您选择的bin数量而改变。在这种情况下,我做

     [N,h] = hist(q_f./theta,30000); %有一个很大的范围,但大多数的箱子都是空的
    情节(H,N /(总和(N)*意味着(差异(H))), '+ R')

相关阅读:

How to plot two histograms together in R?

How do I iterate through each element in an n-dimensional matrix in MATLAB?

How to create a new figure in MATLAB?

Standardize data columns in R

Setting graph figure size

如何在MongoDB中执行SQL Join等效操作?

Automatically plot different colored lines

Changing Fonts Size in Matlab Plots

R MAT不能做什么?

如何有效地在MATLAB中规范化矢量?任何相关的内置功能?