Hay una manera en MATLAB para comprobar si el histograma de distribución es unimodal o bimodal?

EDITAR

¿Crees que Hartigan Inmersión de Estadística iba a funcionar? Traté de pasar de una imagen, y obtener el valor 0. ¿Qué significa eso?

Y, cuando se pasa de una imagen, qué es la prueba de la distribución del histograma de la imagen en niveles de gris?

Gracias.

Suena como que usted necesita para inspeccionar el gradiente… tal vez findpeaks() va a ser útil.
Tengo una imagen, para que voy a tener un histograma de los valores de nivel de gris de la imagen. Para que histograma, sólo quiero comprobar si es unimodal o bimodal
sólo para ser específicos: el p valor devuelto es la probabilidad de que se equivocan al rechazar la hipótesis nula. Creo que en este caso la hipótesis nula es «la distribución es unimodal». Por lo tanto, un valor pequeño significa «que se puede rechazar la hipótesis nula», es decir, «esta muestra es poco probable que haya sido tomada de una distribución unimodal».

OriginalEl autor Simplicity | 2013-12-28

2 Comentarios

  1. 5

    Aquí es una secuencia de comandos utilizando la Nic Precio de la aplicación de Hartigan Inmersión de Prueba para identificar distribuciones unimodales. El difícil punto fue para calcular xpdf, que no es función de densidad de probabilidad, sino de un criterio de muestra.

    p_value es la probabilidad de obtener un estadístico de prueba de al menos tan extremo como el que realmente se ha observado, suponiendo que la hipótesis nula es verdadera. En este caso la hipótesis nula es que la distribución es unimodal.

    close all; clear all;
    function [x2, n, b] = compute_xpdf(x)
    x2 = reshape(x, 1, prod(size(x)));
    [n, b] = hist(x2, 40);
    % This is definitely not probability density function
    x2 = sort(x2);
    % downsampling to speed up computations
    x2 = interp1 (1:length(x2), x2, 1:1000:length(x2));
    end
    nboot = 500;
    sample_size = [256 256];
    % Unimodal
    sample2d = normrnd(0.0, 10.0, sample_size);
    [xpdf, n, b] = compute_xpdf(sample2d);
    [dip, p_value, xlow, xup] = HartigansDipSignifTest(xpdf, nboot); 
    figure;
    subplot(1,2,1);
    bar(n, b)
    title(sprintf('Probability of unimodal %.2f', p_value))
    % Bimodal
    sample2d = sign(sample2d) .* (abs(sample2d) .^ 0.5);
    [xpdf, n, b] = compute_xpdf(sample2d);
    [dip, p_value, xlow, xup] = HartigansDipSignifTest(xpdf, nboot); 
    subplot(1,2,2);
    bar(n, b)
    title(sprintf('Probability of unimodal %.2f', p_value))
    print -dpng modality.png

    Unimodal o bimodal de distribución en MATLAB

    Gracias por su respuesta. Decir que tengo un 256x256 de la imagen. Qué modificaciones se deben realizar con el fin de aplicar la prueba en mi imagen?
    Dimensionalidad realmente no importa, ya que siempre se puede cambiar con la ayuda de reshape. Ver modificaciones.

    OriginalEl autor divanov

  2. 1

    Hay muchas maneras diferentes de hacer lo que están pidiendo. En el sentido más literal, «bimodal» significa que hay dos picos. Generalmente, sin embargo, usted quiere los dos «picos» para ser separadas por una distancia razonable, y usted quiere que contienen cada uno una razonable proporción del total de la cuenta. Sólo usted sabe lo que es «razonable» para su situación, pero el siguiente enfoque podría ayudar.

    1. Crear un histograma de intensidades
    2. Forma de la distribución acumulativa con cumsum
    3. Para diferentes valores de la «corte» entre las distribuciones de (25%, 30%, 50%, …), calcular la media y la desviación estándar de las dos distribuciones (por encima y por debajo de la corte).
    4. Calcular la distancia entre los medios dividido por la suma de las desviaciones estándar de las dos distribuciones
    5. Que la cantidad será de un máximo en el «mejor corte»

    Usted tiene que decidir qué tamaño de esa cantidad representa «bimodal» para usted. Aquí está el código que se muestra de qué estoy hablando. Genera bimodal de las distribuciones de los diferentes grados de gravedad de los dos Gaussianas, con el aumento de la diferencia entre ellos (pasos = tamaño de la desviación estándar). Puedo calcular la cantidad descrita anteriormente, y la trama es de una gama de diferentes valores de delta. Yo, a continuación, ajuste una parábola a través de esta curva en un rango correspondiente a +- 1 sigma de la distribución completa. Como se puede ver, cuando la distribución se vuelve más bimodal, suceden dos cosas:

    1. La curvatura de esta curva se invierte (se pasa de un valle a pico)
    2. El máximo aumenta (se trata de 1.33 por una Gaussiana).

    Puede ver estas cantidades para algunas de sus propias distribuciones, y decidir donde desea colocar el punto de corte.

    % test for bimodal distribution
    close all
    for delta = 0:10:50
    a1 = randn(100,100) * 10 + 25;
    a2 = randn(100,100) * 10 + 25 + delta;
    a3 = [a1(:); a2(:)];
    [h hb] = hist(a3, 0:100);
    cs = cumsum(h);
    llimi = find(cs < 0.2 * max(cs(:)));
    ulimi = find(cs > 0.8 * max(cs(:)));
    llim = hb(llimi(end));
    ulim = hb(ulimi(1));
    cuts = linspace(llim, ulim, 20);
    dmean = mean(a3);
    dstd = std(a3);
    for ci = 1:numel(cuts)
    d1 = a3(a3<cuts(ci));
    d2 = a3(a3>=cuts(ci));
    m(ci,1) = mean(d1);
    m(ci, 2) = mean(d2);
    s(ci, 1) = std(d1);
    s(ci, 2) = std(d2);
    end
    q = (m(:, 2) - m(:, 1)) ./ sum(s, 2);
    figure; 
    plot(cuts, q);
    title(sprintf('delta = %d', delta))
    % compute curvature of plot around mean:
    xlims = dmean + [-1 1] * dstd;
    indx = find(cuts < xlims(2) && cuts > xlims(1));
    pf = polyfit(cuts(indx), q(indx), 2);
    m = polyval(pf, dmean);
    fprintf(1, 'coefficients: a = %.2e, peak = %.2f\n', pf(1), m);
    end

    Valores de salida:

    coefficients: a = 1.37e-03, peak = 1.32
    coefficients: a = 1.01e-03, peak = 1.34
    coefficients: a = 2.85e-04, peak = 1.45
    coefficients: a = -5.78e-04, peak = 1.70
    coefficients: a = -1.29e-03, peak = 2.08
    coefficients: a = -1.58e-03, peak = 2.48

    Parcelas de muestreo:

    Unimodal o bimodal de distribución en MATLAB

    Unimodal o bimodal de distribución en MATLAB

    Y el histograma para delta = 40:

    Unimodal o bimodal de distribución en MATLAB

    Tiene dos errores de tiempo de ejecución de. Líneas de 30/1, debe ser: indx = encontrar(cortes < xlims(2) & cortes > xlims(1)); pf = polyfit(cortes(indx), q(indx)’, 2);
    Estoy de acuerdo con el primer punto, pero el segundo? Por qué iba yo a querer a la transposición de la q(indx)?
    En mi versión de matlab ambas entradas tienen que ser de la misma dimensión. esto significa que ambos tienen que ser vector de fila o de ambos vectores columna. pf = polyfit(cortes(indx)’, q(indx), 2); también funciona bien

    OriginalEl autor Floris

Dejar respuesta

Please enter your comment!
Please enter your name here