class_docstr: Density estimation based on Gaussian Mixture Model.
  
  Args:
      n_components (int): Number of components used in the GMM.
docstr: Predict the density of a set of feature vectors.
  
  Args:
      features (Tensor): Input feature vectors.
      normalize (bool): Flag indicating if the density should be normalized to min-max stats of the feature bank.
  Returns:
      Tensor: Density scores of the input feature vectors.
code: def predict(self, features: Tensor, normalize: bool = True) -> Tensor:
      """Predict the density of a set of feature vectors.
  
      Args:
          features (Tensor): Input feature vectors.
          normalize (bool): Flag indicating if the density should be normalized to min-max stats of the feature bank.
      Returns:
          Tensor: Density scores of the input feature vectors.
      """
      density = -self.gmm.score_samples(features.cpu())
      density = Tensor(density).to(self.normalization_statistics.device)
      if normalize:
          density = self._normalize(density)
      return density
  
imports: from __future__ import annotations
  from abc import ABC, abstractmethod
  from typing import Any
  import torch
  from sklearn.mixture import GaussianMixture
  from torch import Tensor, nn
  from anomalib.models.ai_vad.features import FeatureType
  from anomalib.utils.metrics.min_max import MinMax
label_desc: Use image node_id 4 for calling the GMMEstimator obj's underlying member method code with example usage: obj.predict(features, normalize) and returns: density