def process(self): """! @brief Performs cluster analysis in line with rules of K-Medoids algorithm. @remark Results of clustering can be obtained using corresponding get methods. @see get_clusters() @see get_medoids() """ if (self.__ccore is True): self.__clusters = wrapper.kmedoids(self.__pointer_data, self.__medoid_indexes, self.__tolerance); self.__medoids, self.__medoid_indexes = self.__update_medoids(); else: changes = float('inf'); stop_condition = self.__tolerance * self.__tolerance; # Fast solution #stop_condition = self.__tolerance; # Slow solution while (changes > stop_condition): self.__clusters = self.__update_clusters(); updated_medoids, update_medoid_indexes = self.__update_medoids(); # changes should be calculated before asignment changes = max([euclidean_distance_square(self.__medoids[index], updated_medoids[index]) for index in range(len(updated_medoids))]); # Fast solution self.__medoids = updated_medoids; self.__medoid_indexes = update_medoid_indexes;
def process(self): """! @brief Performs cluster analysis in line with rules of K-Medoids algorithm. @return (kmedoids) Returns itself (K-Medoids instance). @remark Results of clustering can be obtained using corresponding get methods. @see get_clusters() @see get_medoids() """ if self.__ccore is True: ccore_metric = metric_wrapper.create_instance(self.__metric) self.__clusters, self.__medoid_indexes = wrapper.kmedoids(self.__pointer_data, self.__medoid_indexes, self.__tolerance, self.__itermax, ccore_metric.get_pointer(), self.__data_type) else: changes = float('inf') iterations = 0 while changes > self.__tolerance and iterations < self.__itermax: self.__clusters = self.__update_clusters() update_medoid_indexes = self.__update_medoids() changes = max([self.__distance_calculator(self.__medoid_indexes[index], update_medoid_indexes[index]) for index in range(len(update_medoid_indexes))]) self.__medoid_indexes = update_medoid_indexes iterations += 1 return self
def process(self): """! @brief Performs cluster analysis in line with rules of K-Medoids algorithm. @remark Results of clustering can be obtained using corresponding get methods. @see get_clusters() @see get_medoids() """ if self.__ccore is True: ccore_metric = metric_wrapper.create_instance(self.__metric) self.__clusters = wrapper.kmedoids(self.__pointer_data, self.__medoid_indexes, self.__tolerance, ccore_metric.get_pointer(), self.__data_type) self.__medoid_indexes = self.__update_medoids() else: changes = float('inf') stop_condition = self.__tolerance while changes > stop_condition: self.__clusters = self.__update_clusters() update_medoid_indexes = self.__update_medoids() changes = max([self.__distance_calculator(self.__medoid_indexes[index], update_medoid_indexes[index]) for index in range(len(update_medoid_indexes))]) self.__medoid_indexes = update_medoid_indexes
def process(self): """! @brief Performs cluster analysis in line with rules of K-Medoids algorithm. @return (kmedoids) Returns itself (K-Medoids instance). @remark Results of clustering can be obtained using corresponding get methods. @see get_clusters() @see get_medoids() """ if self.__ccore is True: ccore_metric = metric_wrapper.create_instance(self.__metric) self.__clusters, self.__medoid_indexes = wrapper.kmedoids( self.__pointer_data, self.__medoid_indexes, self.__tolerance, self.__itermax, ccore_metric.get_pointer(), self.__data_type) else: changes = float('inf') previous_deviation, current_deviation = float('inf'), float('inf') iterations = 0 if self.__itermax > 0: current_deviation = self.__update_clusters() while (changes > self.__tolerance) and (iterations < self.__itermax): swap_cost = self.__swap_medoids() if swap_cost != float('inf'): previous_deviation = current_deviation current_deviation = self.__update_clusters() changes = previous_deviation - current_deviation else: break iterations += 1 self.__erase_empty_clusters() return self
def process(self): """! @brief Performs cluster analysis in line with rules of K-Medoids algorithm. @return (kmedoids) Returns itself (K-Medoids instance). @remark Results of clustering can be obtained using corresponding get methods. @see get_clusters() @see get_medoids() """ if self.__ccore is True: ccore_metric = metric_wrapper.create_instance(self.__metric) self.__clusters, self.__medoid_indexes, self.__iterations, self.__total_deviation = kmedoids_wrapper.kmedoids(self.__pointer_data, self.__medoid_indexes, self.__tolerance, self.__itermax, ccore_metric.get_pointer(), self.__data_type) # TODO: calculate it on C++ side as well for index_cluster in range(len(self.__clusters)): for index_point in self.__clusters[index_cluster]: self.__labels[index_point] = index_cluster else: changes = float('inf') previous_deviation, self.__total_deviation = float('inf'), 0 self.__iterations = 0 if self.__itermax > 0: self.__total_deviation = self.__update_clusters() while (changes > self.__tolerance) and (self.__iterations < self.__itermax): self.__iterations += 1 swap_cost = self.__swap_medoids() if swap_cost != float('inf'): previous_deviation = self.__total_deviation self.__total_deviation = self.__update_clusters() changes = previous_deviation - self.__total_deviation else: break self.__erase_empty_clusters() return self