Отрицательные значения BIC для GaussianMixture в scikit-learn (sklearn)

#python #scikit-learn #probability #bayesian

#python #машинное обучение #scikit-learn #вероятность #байесовский

Вопрос:

В scikit-learn GaussianMixture объекте есть метод bic(X) , который реализует байесовский информационный критерий для выбора количества компонентов, которые лучше соответствуют данным. Это пример использования:

 from sklearn import mixture
for n in range(0,10):
    gmm = mixture.GaussianMixture(n_components=n, max_iter=1000, covariance_type='diag', n_init=50)
    gmm.fit(data)
    bic_n = gmm.bic(data)
  

Я устанавливаю GMM на набор данных с 600 тыс. строк и 7 столбцов. Значения BIC всегда отрицательны, например [-2000, -3000, -3300, ..] .
В документации к методу bic() написано «Чем ниже, тем лучше». В случае отрицательных значений, как в моем примере, это -3300 наилучшее значение или оно относится к наименьшему значению в абсолютном выражении?

Ответ №1:

Как правило, цель состоит в том, чтобы минимизировать BIC, поэтому, если вы находитесь на отрицательной территории, отрицательное число с наибольшим модулем (самое глубокое на отрицательной территории) указывает на предпочтительную модель.

Посмотрите на исходный код: https://github.com/scikit-learn/scikit-learn/blob/0fb307bf3/sklearn/mixture/_gaussian_mixture.py#L727

     def bic(self, X):
        """Bayesian information criterion for the current model on the input X.
        Parameters
        ----------
        X : array of shape (n_samples, n_dimensions)
        Returns
        -------
        bic : float
            The lower the better.
        """
        return (-2 * self.score(X) * X.shape[0]  
                self._n_parameters() * np.log(X.shape[0]))