Гистограмма Матплотлиба с логарифмическим лапласианом PDF - PullRequest
3 голосов
/ 20 мая 2011

(не забудьте прочитать РЕДАКТИРОВАТЬ в конце поста, прежде чем читать слишком глубоко в источник)

Я строю гистограмму населения, которое, кажется,из log Laplacian дистрибуция: enter image description here

Я пытаюсь нарисовать линию, наиболее подходящую для этого, чтобы проверить мою гипотезу, но у меня возникают проблемы с получением значимых результатов.

Я использую лапласовское определение PDF из Википедии и беру 10 к степени PDF (чтобы "обратить" эффект гистограммы журнала).

Что такоеЯ делаю не так?

Вот мой код.Я передаю данные через стандартный ввод (cat pop.txt | python hist.py) - вот выборка населения.

from pylab import *
import numpy    
def laplace(x, mu, b):
    return 10**(1.0/(2*b) * numpy.exp(-abs(x - mu)/b))    
def main():
    import sys
    num = map(int, sys.stdin.read().strip().split(' '))
    nbins = max(num) - min(num)
    n, bins, patches = hist(num, nbins, range=(min(num), max(num)), log=True, align='left')
    loc, scale = 0., 1.
    x = numpy.arange(bins[0], bins[-1], 1.)
    pdf = laplace(x, 0., 1.)
    plot(x, pdf)
    width = max(-min(num), max(num))
    xlim((-width, width))
    ylim((1.0, 10**7))
    show()
if __name__ == '__main__':
    main()

EDIT

ОК, вотпопытка сопоставить его с регулярным распределением Лапласа (в отличие от логарифмического Лапласа).Отличия от вышеуказанной попытки:

  • гистограмма нормирована
  • гистограмма линейна (не лог)
  • laplace функция определена точно так, как указано в статье Википедии

Вывод: enter image description here

Как видите, это не лучшее совпадение, но цифры (гистограмма и PDF Лапласа), по крайней мере, теперь находятся в одном поле,Я думаю, что бревно Лапласа будет соответствовать намного лучше.Мой подход (источник выше) не сработал.Кто-нибудь может предложить способ сделать это, что работает?

Источник:

from pylab import *
import numpy   
def laplace(x, mu, b):
    return 1.0/(2*b) * numpy.exp(-abs(x - mu)/b)
def main():
    import sys
    num = map(int, sys.stdin.read().strip().split(' '))
    nbins = max(num) - min(num)
    n, bins, patches = hist(num, nbins, range=(min(num), max(num)), log=False, align='left', normed=True)
    loc, scale = 0., 0.54
    x = numpy.arange(bins[0], bins[-1], 1.)
    pdf = laplace(x, loc, scale)
    plot(x, pdf)
    width = max(-min(num), max(num))
    xlim((-width, width))
        show()
if __name__ == '__main__':
    main()

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Я нашел обходной путь для моей проблемы. Вместо использования matplotlib.hist я использую numpy.histogram в сочетании с matplotlib.bar, чтобы вычислить гистограмму и нарисовать ее в два отдельных шага.

Я не уверен, есть ли способ сделать это с помощью matplotlib.hist - это, безусловно, будет более удобным. enter image description here

Вы можете видеть, что это намного лучший матч.

Теперь моя проблема в том, что мне нужно оценить параметр scale в PDF.

Источник:

from pylab import *
import numpy

def laplace(x, mu, b):
    """http://en.wikipedia.org/wiki/Laplace_distribution"""
    return 1.0/(2*b) * numpy.exp(-abs(x - mu)/b)

def main():
    import sys
    num = map(int, sys.stdin.read().strip().split(' '))
    nbins = max(num) - min(num)
    count, bins = numpy.histogram(num, nbins)
    bins = bins[:-1]
    assert len(bins) == nbins
    #
    # FIRST we take the log of the histogram, THEN we normalize it.
    # Clean up after divide by zero
    #
    count = numpy.log(count)
    for i in range(nbins):
        if count[i] == -numpy.inf:
            count[i] = 0
    count = count/max(count)

    loc = 0.
    scale = 4.
    x = numpy.arange(bins[0], bins[-1], 1.)
    pdf = laplace(x, loc, scale)
    pdf = pdf/max(pdf)

    width=1.0
    bar(bins-width/2, count, width=width)
    plot(x, pdf, color='r')
    xlim(min(num), max(num))
    show()

if __name__ == '__main__':
    main()
1 голос
/ 20 мая 2011
  1. Ваша функция laplace () не является распределением Лапласа. Кроме того, numpy.log() является натуральным логарифмом (основание e), а не десятичным.

  2. Ваша гистограмма, похоже, не нормализована, а распределение -.

EDIT:

  1. Не используйте общий импорт from pyplot import *, он вас укусит.

  2. Если вы проверяете согласованность с распределением Лапласа (или его журналом), используйте тот факт, что последний симметричен относительно mu: исправьте mu на максимуме вашей гистограммы, и у вас будет один проблема параметров. И вы можете использовать только половину гистограммы.

  3. Используйте функцию гистограммы numpy - таким образом, вы можете получить саму гистограмму, которую затем сможете добавить в распределение Лапласа (и / или его журнал). Хи-квадрат скажет вам, насколько хорошая (или плохая) последовательность. Для примерки вы можете использовать, например, scipy.optimize.leastsq рутина (http://www.scipy.org/Cookbook/FittingData)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...