code: def adjusted_mutual_information(
      feature_list0: List[np.ndarray],
      feature_list1: List[np.ndarray],
      is_categorical_list0: List[bool],
      is_categorical_list1: List[bool],
      k: int = 3,
      estimate_method: str = "larger_data",
      weight_feature: Optional[np.ndarray] = None,
      filter_feature: Optional[np.ndarray] = None,
      seed: Optional[int] = None,
  ) -> float:
      """Computes adjusted MI between two lists of features.
  
      Args:
        feature_list0: (list(np.ndarray)) a list of features represented as numpy
          arrays.
        feature_list1: (list(np.ndarray)) a list of features represented as numpy
          arrays.
        is_categorical_list0: (list(bool)) Whether the first list of features are
          categorical or not.
        is_categorical_list1: (list(bool)) Whether the second list of features are
          categorical or not.
        k: (int) The number of nearest neighbors. It has to be an integer no less
          than 3.
        estimate_method: (str) 'smaller_data' or 'larger_data' estimator in the
          above paper.
        weight_feature: (np.ndarray) numpy array that are weights for each example.
        filter_feature: (np.ndarray) numpy array that is used as the filter to drop
          all data where this has missing values. By default, it is None and no
          filtering is done.
        seed: (int) the numpy random seed.
  
      Returns:
        The adjusted mutual information between the features in feature_list0 and
        feature_list1.
      """
      _validate_args(
          feature_list0,
          feature_list1,
          is_categorical_list0,
          is_categorical_list1,
          k,
          estimate_method,
          weight_feature,
          filter_feature,
          False,
          seed,
      )
  
      (
          cf_list0,
          cf_list1,
          df_list0,
          df_list1,
          weights,
      ) = _feature_list_to_numpy_arrays(
          feature_list0,
          feature_list1,
          is_categorical_list0,
          is_categorical_list1,
          weight_feature,
          filter_feature,
      )
  
      return _adjusted_mi_for_arrays(
          cf_list0,
          cf_list1,
          df_list0,
          df_list1,
          weights,
          k,
          estimate_method,
          seed,
      )
  
imports: import functools
  import itertools
  import math
  from typing import Any, List, Optional, Tuple, Union
  import uuid
  import numpy
  import pandas
  import scipy.special
  import sklearn.neighbors
label_desc: Use image node_id 2 for calling a global function with example usage: adjusted_mutual_information(feature_list0, feature_list1, is_categorical_list0, is_categorical_list1, k, estimate_method, weight_feature, filter_feature, seed) and returns: _adjusted_mi_for_arrays