class_docstr: !
  @brief Class represents clustering algorithm K-Medoids (PAM algorithm).
  @details PAM is a partitioning clustering algorithm that uses the medoids instead of centers like in case of K-Means
            algorithm. Medoid is an object with the smallest dissimilarity to all others in the cluster. PAM algorithm
            complexity is $O\left ( k\left ( n-k 
  ight )^{2} 
  ight )$.
  
            The performance of the algorithm depends on initial medoids and it is recommended to use BUILD PAM
            initialization algorithm for that purpose. K-Means++ is also could be considered as an initialization
            algorithm with smaller complexity `O(nk)`, but produces a worse starting point.
  
  Implementation based on paper @cite inproceedings::cluster::kmedoids::1.
  
  There is an example where PAM algorithm is used to cluster `Tetra` data where PAM BUILD algorithm is used to
  initialize medoids:
  @code
      from pyclustering.cluster.kmedoids import kmedoids, build
      from pyclustering.cluster import cluster_visualizer
      from pyclustering.utils import read_sample
      from pyclustering.samples.definitions import FCPS_SAMPLES
  
      # Load list of points `Tetra` for cluster analysis.
      sample = read_sample(FCPS_SAMPLES.SAMPLE_TETRA)
  
      # Initialize initial medoids using PAM BUILD algorithm
      initial_medoids = build(sample, 4).initialize()
  
      # Create instance of K-Medoids (PAM) algorithm.
      kmedoids_instance = kmedoids(sample, initial_medoids)
  
      # Run cluster analysis
      kmedoids_instance.process()
  
      # Display clustering results to console.
      print("Clusters:", kmedoids_instance.get_clusters())
      print("Labels:", kmedoids_instance.get_labels())
      print("Medoids:", kmedoids_instance.get_medoids())
      print("Total Deviation:", kmedoids_instance.get_total_deviation())
      print("Iterations:", kmedoids_instance.get_iterations())
  
      # Display clustering results.
      visualizer = cluster_visualizer()
      visualizer.append_clusters(kmedoids_instance.get_clusters(), sample)
      visualizer.append_cluster(initial_medoids, sample, markersize=120, marker='*', color='dimgray')
      visualizer.append_cluster(kmedoids_instance.get_medoids(), sample, markersize=120, marker='*', color='black')
      visualizer.show()
  @endcode
  
  The following clustering results are expected in a console:
  @code
      Clusters: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199], [200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299], [300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399]]
      Labels: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
      Medoids: [0, 100, 201, 300]
      Total Deviation: 239.25250279395595
      Iterations: 3
  @endcode
  
  And the following visualization is expected:
  @image html pam_clustering_tetra.png "Fig. 1. K-Medoids (PAM) clustering results `Tetra` (PAM BUILD initialization)."
  
  There is an example where PAM algorithm is used to cluster `TwoDiamonds` data where K-Means++ algorithm is used
  to initialize medoids:
  @code
      from pyclustering.cluster.kmedoids import kmedoids
      from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
      from pyclustering.cluster import cluster_visualizer
      from pyclustering.utils import read_sample
      from pyclustering.samples.definitions import FCPS_SAMPLES
  
      # Load list of points for cluster analysis.
      sample = read_sample(FCPS_SAMPLES.SAMPLE_TWO_DIAMONDS)
  
      # Initialize initial medoids using K-Means++ algorithm
      initial_medoids = kmeans_plusplus_initializer(sample, 2).initialize(return_index=True)
  
      # Create instance of K-Medoids (PAM) algorithm.
      kmedoids_instance = kmedoids(sample, initial_medoids)
  
      # Run cluster analysis and obtain results.
      kmedoids_instance.process()
      clusters = kmedoids_instance.get_clusters()
      medoids = kmedoids_instance.get_medoids()
  
      # Print allocated clusters.
      print("Clusters:", clusters)
  
      # Display clustering results.
      visualizer = cluster_visualizer()
      visualizer.append_clusters(clusters, sample)
      visualizer.append_cluster(initial_medoids, sample, markersize=12, marker='*', color='gray')
      visualizer.append_cluster(medoids, sample, markersize=14, marker='*', color='black')
      visualizer.show()
  @endcode
  
  @image html pam_clustering_two_diamonds.png "Fig. 2. K-Medoids (PAM) clustering results `TwoDiamonds` (K-Means++ initialization)."
  
  Metric for calculation distance between points can be specified by parameter additional `metric`:
  @code
      # create Minkowski distance metric with degree equals to '2'
      metric = distance_metric(type_metric.MINKOWSKI, degree=2)
  
      # create K-Medoids algorithm with specific distance metric
      kmedoids_instance = kmedoids(sample, initial_medoids, metric=metric)
  
      # run cluster analysis and obtain results
      kmedoids_instance.process()
      clusters = kmedoids_instance.get_clusters()
  @endcode
  
  Distance matrix can be used instead of sequence of points to increase performance and for that purpose parameter `data_type` should be used:
  @code
      # calculate distance matrix for sample
      sample = read_sample(path_to_sample)
      matrix = calculate_distance_matrix(sample)
  
      # create K-Medoids algorithm for processing distance matrix instead of points
      kmedoids_instance = kmedoids(matrix, initial_medoids, data_type='distance_matrix')
  
      # run cluster analysis and obtain results
      kmedoids_instance.process()
  
      clusters = kmedoids_instance.get_clusters()
      medoids = kmedoids_instance.get_medoids()
  @endcode
  
  @see pam_build
class_docstr_tok: ["!","@","brief","Class","represents","clustering","algorithm","K-Medoids","(","PAM","algorithm",")",".","@","details","PAM","is","a","partitioning","clustering","algorithm","that","uses","the","medoids","instead","of","centers","like","in","case","of","K-Means","algorithm",".","Medoid","is","an","object","with","the","smallest","dissimilarity","to","all","others","in","the","cluster",".","PAM","algorithm","complexity","is","$","O\\left","(","k\\left","(","n-k","ight",")","^","{","2","}","ight",")","$",".","The","performance","of","the","algorithm","depends","on","initial","medoids","and","it","is","recommended","to","use","BUILD","PAM","initialization","algorithm","for","that","purpose",".","K-Means++","is","also","could","be","considered","as","an","initialization","algorithm","with","smaller","complexity","`","O","(","nk",")","`",",","but","produces","a","worse","starting","point",".","Implementation","based","on","paper","@","cite","inproceedings",":",":cluster",":",":kmedoids",":",":1",".","There","is","an","example","where","PAM","algorithm","is","used","to","cluster","`","Tetra","`","data","where","PAM","BUILD","algorithm","is","used","to","initialize","medoids",":","@","code","from","pyclustering.cluster.kmedoids","import","kmedoids",",","build","from","pyclustering.cluster","import","cluster_visualizer","from","pyclustering.utils","import","read_sample","from","pyclustering.samples.definitions","import","FCPS_SAMPLES","#","Load","list","of","points","`","Tetra","`","for","cluster","analysis",".","sample","=","read_sample","(","FCPS_SAMPLES.SAMPLE_TETRA",")","#","Initialize","initial","medoids","using","PAM","BUILD","algorithm","initial_medoids","=","build","(","sample",",","4",")",".initialize","(",")","#","Create","instance","of","K-Medoids","(","PAM",")","algorithm",".","kmedoids_instance","=","kmedoids","(","sample",",","initial_medoids",")","#","Run","cluster","analysis","kmedoids_instance.process","(",")","#","Display","clustering","results","to","console",".","print","(","``","Clusters",":","''",",","kmedoids_instance.get_clusters","(",")",")","print","(","``","Labels",":","''",",","kmedoids_instance.get_labels","(",")",")","print","(","``","Medoids",":","''",",","kmedoids_instance.get_medoids","(",")",")","print","(","``","Total","Deviation",":","''",",","kmedoids_instance.get_total_deviation","(",")",")","print","(","``","Iterations",":","''",",","kmedoids_instance.get_iterations","(",")",")","#","Display","clustering","results",".","visualizer","=","cluster_visualizer","(",")","visualizer.append_clusters","(","kmedoids_instance.get_clusters","(",")",",","sample",")","visualizer.append_cluster","(","initial_medoids",",","sample",",","markersize=120",",","marker=","'","*","'",",","color='dimgray","'",")","visualizer.append_cluster","(","kmedoids_instance.get_medoids","(",")",",","sample",",","markersize=120",",","marker=","'","*","'",",","color='black","'",")","visualizer.show","(",")","@","endcode","The","following","clustering","results","are","expected","in","a","console",":","@","code","Clusters",":","[","[","0",",","1",",","2",",","3",",","4",",","5",",","6",",","7",",","8",",","9",",","10",",","11",",","12",",","13",",","14",",","15",",","16",",","17",",","18",",","19",",","20",",","21",",","22",",","23",",","24",",","25",",","26",",","27",",","28",",","29",",","30",",","31",",","32",",","33",",","34",",","35",",","36",",","37",",","38",",","39",",","40",",","41",",","42",",","43",",","44",",","45",",","46",",","47",",","48",",","49",",","50",",","51",",","52",",","53",",","54",",","55",",","56",",","57",",","58",",","59",",","60",",","61",",","62",",","63",",","64",",","65",",","66",",","67",",","68",",","69",",","70",",","71",",","72",",","73",",","74",",","75",",","76",",","77",",","78",",","79",",","80",",","81",",","82",",","83",",","84",",","85",",","86",",","87",",","88",",","89",",","90",",","91",",","92",",","93",",","94",",","95",",","96",",","97",",","98",",","99","]",",","[","100",",","101",",","102",",","103",",","104",",","105",",","106",",","107",",","108",",","109",",","110",",","111",",","112",",","113",",","114",",","115",",","116",",","117",",","118",",","119",",","120",",","121",",","122",",","123",",","124",",","125",",","126",",","127",",","128",",","129",",","130",",","131",",","132",",","133",",","134",",","135",",","136",",","137",",","138",",","139",",","140",",","141",",","142",",","143",",","144",",","145",",","146",",","147",",","148",",","149",",","150",",","151",",","152",",","153",",","154",",","155",",","156",",","157",",","158",",","159",",","160",",","161",",","162",",","163",",","164",",","165",",","166",",","167",",","168",",","169",",","170",",","171",",","172",",","173",",","174",",","175",",","176",",","177",",","178",",","179",",","180",",","181",",","182",",","183",",","184",",","185",",","186",",","187",",","188",",","189",",","190",",","191",",","192",",","193",",","194",",","195",",","196",",","197",",","198",",","199","]",",","[","200",",","201",",","202",",","203",",","204",",","205",",","206",",","207",",","208",",","209",",","210",",","211",",","212",",","213",",","214",",","215",",","216",",","217",",","218",",","219",",","220",",","221",",","222",",","223",",","224",",","225",",","226",",","227",",","228",",","229",",","230",",","231",",","232",",","233",",","234",",","235",",","236",",","237",",","238",",","239",",","240",",","241",",","242",",","243",",","244",",","245",",","246",",","247",",","248",",","249",",","250",",","251",",","252",",","253",",","254",",","255",",","256",",","257",",","258",",","259",",","260",",","261",",","262",",","263",",","264",",","265",",","266",",","267",",","268",",","269",",","270",",","271",",","272",",","273",",","274",",","275",",","276",",","277",",","278",",","279",",","280",",","281",",","282",",","283",",","284",",","285",",","286",",","287",",","288",",","289",",","290",",","291",",","292",",","293",",","294",",","295",",","296",",","297",",","298",",","299","]",",","[","300",",","301",",","302",",","303",",","304",",","305",",","306",",","307",",","308",",","309",",","310",",","311",",","312",",","313",",","314",",","315",",","316",",","317",",","318",",","319",",","320",",","321",",","322",",","323",",","324",",","325",",","326",",","327",",","328",",","329",",","330",",","331",",","332",",","333",",","334",",","335",",","336",",","337",",","338",",","339",",","340",",","341",",","342",",","343",",","344",",","345",",","346",",","347",",","348",",","349",",","350",",","351",",","352",",","353",",","354",",","355",",","356",",","357",",","358",",","359",",","360",",","361",",","362",",","363",",","364",",","365",",","366",",","367",",","368",",","369",",","370",",","371",",","372",",","373",",","374",",","375",",","376",",","377",",","378",",","379",",","380",",","381",",","382",",","383",",","384",",","385",",","386",",","387",",","388",",","389",",","390",",","391",",","392",",","393",",","394",",","395",",","396",",","397",",","398",",","399","]","]","Labels",":","[","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","0",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","1",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","2",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3",",","3","]","Medoids",":","[","0",",","100",",","201",",","300","]","Total","Deviation",":","239.25250279395595","Iterations",":","3","@","endcode","And","the","following","visualization","is","expected",":","@","image","html","pam_clustering_tetra.png","``","Fig",".","1",".","K-Medoids","(","PAM",")","clustering","results","`","Tetra","`","(","PAM","BUILD","initialization",")",".","''","There","is","an","example","where","PAM","algorithm","is","used","to","cluster","`","TwoDiamonds","`","data","where","K-Means++","algorithm","is","used","to","initialize","medoids",":","@","code","from","pyclustering.cluster.kmedoids","import","kmedoids","from","pyclustering.cluster.center_initializer","import","kmeans_plusplus_initializer","from","pyclustering.cluster","import","cluster_visualizer","from","pyclustering.utils","import","read_sample","from","pyclustering.samples.definitions","import","FCPS_SAMPLES","#","Load","list","of","points","for","cluster","analysis",".","sample","=","read_sample","(","FCPS_SAMPLES.SAMPLE_TWO_DIAMONDS",")","#","Initialize","initial","medoids","using","K-Means++","algorithm","initial_medoids","=","kmeans_plusplus_initializer","(","sample",",","2",")",".initialize","(","return_index=True",")","#","Create","instance","of","K-Medoids","(","PAM",")","algorithm",".","kmedoids_instance","=","kmedoids","(","sample",",","initial_medoids",")","#","Run","cluster","analysis","and","obtain","results",".","kmedoids_instance.process","(",")","clusters","=","kmedoids_instance.get_clusters","(",")","medoids","=","kmedoids_instance.get_medoids","(",")","#","Print","allocated","clusters",".","print","(","``","Clusters",":","''",",","clusters",")","#","Display","clustering","results",".","visualizer","=","cluster_visualizer","(",")","visualizer.append_clusters","(","clusters",",","sample",")","visualizer.append_cluster","(","initial_medoids",",","sample",",","markersize=12",",","marker=","'","*","'",",","color='gray","'",")","visualizer.append_cluster","(","medoids",",","sample",",","markersize=14",",","marker=","'","*","'",",","color='black","'",")","visualizer.show","(",")","@","endcode","@","image","html","pam_clustering_two_diamonds.png","``","Fig",".","2",".","K-Medoids","(","PAM",")","clustering","results","`","TwoDiamonds","`","(","K-Means++","initialization",")",".","''","Metric","for","calculation","distance","between","points","can","be","specified","by","parameter","additional","`","metric","`",":","@","code","#","create","Minkowski","distance","metric","with","degree","equals","to","'","2'","metric","=","distance_metric","(","type_metric.MINKOWSKI",",","degree=2",")","#","create","K-Medoids","algorithm","with","specific","distance","metric","kmedoids_instance","=","kmedoids","(","sample",",","initial_medoids",",","metric=metric",")","#","run","cluster","analysis","and","obtain","results","kmedoids_instance.process","(",")","clusters","=","kmedoids_instance.get_clusters","(",")","@","endcode","Distance","matrix","can","be","used","instead","of","sequence","of","points","to","increase","performance","and","for","that","purpose","parameter","`","data_type","`","should","be","used",":","@","code","#","calculate","distance","matrix","for","sample","sample","=","read_sample","(","path_to_sample",")","matrix","=","calculate_distance_matrix","(","sample",")","#","create","K-Medoids","algorithm","for","processing","distance","matrix","instead","of","points","kmedoids_instance","=","kmedoids","(","matrix",",","initial_medoids",",","data_type='distance_matrix","'",")","#","run","cluster","analysis","and","obtain","results","kmedoids_instance.process","(",")","clusters","=","kmedoids_instance.get_clusters","(",")","medoids","=","kmedoids_instance.get_medoids","(",")","@","endcode","@","see","pam_build"]
docstr: !
  @brief Calculates the closest cluster to each point.
  
  @param[in] points (array_like): Points for which closest clusters are calculated.
  
  @return (list) List of closest clusters for each point. Each cluster is denoted by index. Return empty
           collection if 'process()' method was not called.
  
  An example how to calculate (or predict) the closest cluster to specified points.
  @code
      from pyclustering.cluster.kmedoids import kmedoids
      from pyclustering.samples.definitions import SIMPLE_SAMPLES
      from pyclustering.utils import read_sample
  
      # Load list of points for cluster analysis.
      sample = read_sample(SIMPLE_SAMPLES.SAMPLE_SIMPLE3)
  
      # Initial medoids for sample 'Simple3'.
      initial_medoids = [4, 12, 25, 37]
  
      # Create instance of K-Medoids algorithm with prepared centers.
      kmedoids_instance = kmedoids(sample, initial_medoids)
  
      # Run cluster analysis.
      kmedoids_instance.process()
  
      # Calculate the closest cluster to following two points.
      points = [[0.35, 0.5], [2.5, 2.0]]
      closest_clusters = kmedoids_instance.predict(points)
      print(closest_clusters)
  @endcode
docstr_tok: ["!","@","brief","Calculates","the","closest","cluster","to","each","point",".","@","param","[","in","]","points","(","array_like",")",":","Points","for","which","closest","clusters","are","calculated",".","@","return","(","list",")","List","of","closest","clusters","for","each","point",".","Each","cluster","is","denoted","by","index",".","Return","empty","collection","if","'process","(",")","'","method","was","not","called",".","An","example","how","to","calculate","(","or","predict",")","the","closest","cluster","to","specified","points",".","@","code","from","pyclustering.cluster.kmedoids","import","kmedoids","from","pyclustering.samples.definitions","import","SIMPLE_SAMPLES","from","pyclustering.utils","import","read_sample","#","Load","list","of","points","for","cluster","analysis",".","sample","=","read_sample","(","SIMPLE_SAMPLES.SAMPLE_SIMPLE3",")","#","Initial","medoids","for","sample","'Simple3","'",".","initial_medoids","=","[","4",",","12",",","25",",","37","]","#","Create","instance","of","K-Medoids","algorithm","with","prepared","centers",".","kmedoids_instance","=","kmedoids","(","sample",",","initial_medoids",")","#","Run","cluster","analysis",".","kmedoids_instance.process","(",")","#","Calculate","the","closest","cluster","to","following","two","points",".","points","=","[","[","0.35",",","0.5","]",",","[","2.5",",","2.0","]","]","closest_clusters","=","kmedoids_instance.predict","(","points",")","print","(","closest_clusters",")","@","endcode"]
code: def predict(self, points):
      """!
      @brief Calculates the closest cluster to each point.
  
      @param[in] points (array_like): Points for which closest clusters are calculated.
  
      @return (list) List of closest clusters for each point. Each cluster is denoted by index. Return empty
               collection if 'process()' method was not called.
  
      An example how to calculate (or predict) the closest cluster to specified points.
      @code
          from pyclustering.cluster.kmedoids import kmedoids
          from pyclustering.samples.definitions import SIMPLE_SAMPLES
          from pyclustering.utils import read_sample
  
          # Load list of points for cluster analysis.
          sample = read_sample(SIMPLE_SAMPLES.SAMPLE_SIMPLE3)
  
          # Initial medoids for sample 'Simple3'.
          initial_medoids = [4, 12, 25, 37]
  
          # Create instance of K-Medoids algorithm with prepared centers.
          kmedoids_instance = kmedoids(sample, initial_medoids)
  
          # Run cluster analysis.
          kmedoids_instance.process()
  
          # Calculate the closest cluster to following two points.
          points = [[0.35, 0.5], [2.5, 2.0]]
          closest_clusters = kmedoids_instance.predict(points)
          print(closest_clusters)
      @endcode
  
      """
  
      if len(self.__clusters) == 0:
          return []
  
      medoids = [
          self.__pointer_data[index] for index in self.__medoid_indexes
      ]
      differences = numpy.zeros((len(points), len(medoids)))
      for index_point in range(len(points)):
          differences[index_point] = [
              self.__metric(points[index_point], center)
              for center in medoids
          ]
  
      return numpy.argmin(differences, axis=1)
  
imports: import numpy
  from pyclustering.cluster.encoder import type_encoding
  from pyclustering.utils.metric import distance_metric, type_metric
  import pyclustering.core.pam_build_wrapper
  import pyclustering.core.kmedoids_wrapper
  from pyclustering.core.wrapper import ccore_library
  from pyclustering.core.metric_wrapper import metric_wrapper
label_desc: Use image node_id 3 for calling the kmedoids obj's underlying member method code with example usage: obj.predict(points) and returns: numpy, list