Numpy lomax означает, что функция возвращает «inf» вместо значения - PullRequest
0 голосов
/ 12 декабря 2018

После этого урока я создал churn.py файл:

import numpy as np
import scipy as sp
import scipy.stats as stats

#duration of alive subscriptions
censored = np.array([419,513, ... ,316,14])
#duration of completed subscriptions
uncensored = np.array([389,123,340, ... ,56,31])

#Log likelihoods for censored data
def log_likelihood_lomax(args):
    shape, scale = args
    val = stats.lomax.logpdf(uncensored, shape, loc=0, scale=scale).sum() + stats.lomax.logsf(censored, shape, loc=0, scale=scale).sum()
    return -val

res_lomax = sp.optimize.minimize(log_likelihood_lomax,   [1, 1], bounds=((0.001, 1000000), (0.001, 1000000)))

print("lomax shape", res_lomax.x[0], ", scale=", res_lomax.x[1])
print("lomax mean", stats.lomax.mean(res_lomax.x[0], scale=res_lomax.x[1]))
print("lomax median", stats.lomax.median(res_lomax.x[0], scale=res_lomax.x[1]))

Примечание : ... в censored & uncensored массивы здесь для целей конфиденциальности.В настоящий сценарий я включил реальные значения.

Когда я запускаю этот сценарий с python3 churn.py, я получаю следующие результаты:

lomax shape 0.36948878639375643 , scale= 1440.4384891101636
lomax mean inf
lomax median 7961.447172364986

Я знаю дляфакт, что значение, возвращаемое для медианы, неверно.

Но самое главное, я не понимаю, почему среднее значение lomar возвращает inf.

Что-то не так в моем сценарии?

1 Ответ

0 голосов
/ 12 декабря 2018

Ваш результат показывает

lomax shape 0.36948878639375643 

То есть, используя нотацию scipy, параметр формы c равен 0.36948878639375643 (в статье в Википедии , c - это α).Для c ≤ 1 среднее значение распределения равно бесконечно (т. Е. Интеграл, определяющий среднее, расходится).

Вы спросили «Что-то не так вмой сценарий? " Есть одно важное изменение, которое я рекомендую: после вызова minimize проверьте, что res_lomax.success имеет значение True, прежде чем использовать значения в res_lomax.x.Как то так:

res_lomax = sp.optimize.minimize(log_likelihood_lomax, [1, 1], bounds=((0.001, 1000000), (0.001, 1000000)))
if res_lomax.success:
    print("lomax shape", res_lomax.x[0], ", scale=", res_lomax.x[1])
    print("lomax mean", stats.lomax.mean(res_lomax.x[0], scale=res_lomax.x[1]))
    print("lomax median", stats.lomax.median(res_lomax.x[0], scale=res_lomax.x[1]))
else:
    print("minimization failed:", res_lomax.message)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...