class_docstr: !
  @brief Represent algorithm for searching optimal number of clusters using specified K-algorithm (K-Means,
          K-Medians, K-Medoids) that is based on Silhouette method.
  
  @details This algorithm uses average value of scores for estimation and applicable for clusters that are well
            separated. Here is an example where clusters are well separated (sample 'Hepta'):
  @code
      from pyclustering.cluster import cluster_visualizer
      from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
      from pyclustering.cluster.kmeans import kmeans
      from pyclustering.cluster.silhouette import silhouette_ksearch_type, silhouette_ksearch
      from pyclustering.samples.definitions import FCPS_SAMPLES
      from pyclustering.utils import read_sample
  
      sample = read_sample(FCPS_SAMPLES.SAMPLE_HEPTA)
      search_instance = silhouette_ksearch(sample, 2, 10, algorithm=silhouette_ksearch_type.KMEANS).process()
  
      amount = search_instance.get_amount()
      scores = search_instance.get_scores()
  
      print("Scores: '%s'" % str(scores))
  
      initial_centers = kmeans_plusplus_initializer(sample, amount).initialize()
      kmeans_instance = kmeans(sample, initial_centers).process()
  
      clusters = kmeans_instance.get_clusters()
  
      visualizer = cluster_visualizer()
      visualizer.append_clusters(clusters, sample)
      visualizer.show()
  @endcode
  
  Obtained Silhouette scores for each K:
  @code
  Scores: '{2: 0.418434, 3: 0.450906, 4: 0.534709, 5: 0.689970, 6: 0.588460, 7: 0.882674, 8: 0.804725, 9: 0.780189}'
  @endcode
  
  K = 7 has the bigger average Silhouette score and it means that it is optimal amount of clusters:
  @image html silhouette_ksearch_hepta.png "Silhouette ksearch's analysis with further K-Means clustering (sample 'Hepta')."
  
  @see silhouette_ksearch_type
docstr: !
  @brief Checks algorithm's arguments and if some of them is incorrect then exception is thrown.
docstr_tok: ["!","@","brief","Checks","algorithm","'s","arguments","and","if","some","of","them","is","incorrect","then","exception","is","thrown","."]
code: def __verify_arguments(self):
      """!
      @brief Checks algorithm's arguments and if some of them is incorrect then exception is thrown.
  
      """
      if self.__kmax > len(self.__data):
          raise ValueError(
              "K max value '"
              + str(self.__kmax)
              + "' is bigger than amount of objects '"
              + str(len(self.__data))
              + "' in input data."
          )
  
      if self.__kmin <= 1:
          raise ValueError(
              "K min value '"
              + str(self.__kmin)
              + "' should be greater than 1 (impossible to provide "
              "silhouette score for only one cluster)."
          )
  
imports: from enum import IntEnum
  import numpy
  from pyclustering.cluster.kmeans import kmeans
  from pyclustering.cluster.kmedians import kmedians
  from pyclustering.cluster.kmedoids import kmedoids
  from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
  from pyclustering.utils.metric import distance_metric, type_metric
  from pyclustering.core.wrapper import ccore_library
  from pyclustering.core.metric_wrapper import metric_wrapper
  import pyclustering.core.silhouette_wrapper
label_desc: Use image node_id 9 for calling the silhouette_ksearch obj's underlying member method code with example usage: obj.__verify_arguments() without return types