es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obteniendo el AIC de distribuciones lognormales utilizando GMM de Scikit.

Tengo los siguientes datos generados mediante:

from scipy.stats import skewnorm
import matplotlib.pyplot as plt
import numpy as np

numValues = 10000
maxValue = 100
skewness = -5   
data = skewnorm.rvs(a = skewness,loc=maxValue, size=numValues) 

enter image description here

Para el modelo gaussiano, he calculado el AIC utilizando el siguiente código:

from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components = 1).fit(X=np.expand_dims(data,1))
gmm_aic = gmm.aic(X=np.expand_dims(data,1))
gmm_bic = gmm.bic(X=np.expand_dims(data,1))

Para el modelo logarítmico normal, tomé el logaritmo de los datos y ajusté una distribución gaussiana utilizando el siguiente código:

log_gmm = GaussianMixture(n_components = 1).fit(X=np.expand_dims(np.log(data),1))

y calculé el AIC para este modelo en los datos y no en np.log(data)

log_gmm_aic = log_gmm.aic(X=np.expand_dims(data,1))
log_gmm_bic = log_gmm.bic(X=np.expand_dims(data,1))

De esta manera, mis valores de AIC y BIC en ambos casos son los siguientes:

Gaussiano - AIC: 18790.27 BIC:18804.69 

lognormal - AIC: 2231500479614.06 BIC:2231500479628.48

Los valores parecen incomparables. ¿Qué estoy haciendo mal si quiero calcular el AIC y BIC del modelo lognormal?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Un posible error es que se debe tomar el logaritmo de los valores de verosimilitud al calcular AIC y BIC para el modelo lognormal, ya que el modelo se ajusta a los datos transformados con logaritmos.

    Para corregir esto, se puede modificar el código de la siguiente manera:

    log_gmm_aic = 2 * (log_gmm.lower_bound_) - (2 * log_gmm.n_components_)
    log_gmm_bic = (np.log(len(data)) * log_gmm.n_components_) - 2 * log_gmm.lower_bound_
    

    Aquí, log_gmm.lower_bound_ es el logaritmo de la verosimilitud para el modelo lognormal, obtenido a partir de log_gmm.score(X=np.expand_dims(np.log(data),1)). Al multiplicar log_gmm.lower_bound_ por 2 y restarle 2 veces el número de parámetros (es decir, el número de componentes en el modelo de mezcla), obtenemos el valor de AIC. Al utilizar la fórmula para BIC con el logaritmo del tamaño de la muestra log(len(data)), podemos obtener el valor correspondiente de BIC.

    Con esta modificación, debería ser posible obtener valores comparables de AIC y BIC para los dos modelos.

Comments are closed.