def __process_by_ccore(self): """! @brief Performs cluster analysis using CCORE (C/C++ part of pyclustering library). """ cure_data_pointer = wrapper.cure_algorithm( self.__pointer_data, self.__number_cluster, self.__number_represent_points, self.__compression) self.__clusters = wrapper.cure_get_clusters(cure_data_pointer) self.__representors = wrapper.cure_get_representors(cure_data_pointer) self.__means = wrapper.cure_get_means(cure_data_pointer) wrapper.cure_data_destroy(cure_data_pointer)
def process(self): """! @brief Performs cluster analysis in line with rules of CURE algorithm. @remark Results of clustering can be obtained using corresponding get methods. @see get_clusters() """ if (self.__ccore is True): cure_data_pointer = wrapper.cure_algorithm( self.__pointer_data, self.__number_cluster, self.__number_represent_points, self.__compression) self.__clusters = wrapper.cure_get_clusters(cure_data_pointer) self.__representors = wrapper.cure_get_representors( cure_data_pointer) self.__means = wrapper.cure_get_means(cure_data_pointer) wrapper.cure_data_destroy(cure_data_pointer) else: while (len(self.__queue) > self.__number_cluster): cluster1 = self.__queue[0] # cluster that has nearest neighbor. cluster2 = cluster1.closest # closest cluster. #print("Merge decision: \n\t", cluster1, "\n\t", cluster2); self.__queue.remove(cluster1) self.__queue.remove(cluster2) self.__delete_represented_points(cluster1) self.__delete_represented_points(cluster2) merged_cluster = self.__merge_clusters(cluster1, cluster2) self.__insert_represented_points(merged_cluster) # Pointers to clusters that should be relocated is stored here. cluster_relocation_requests = [] # Check for the last cluster if (len(self.__queue) > 0): merged_cluster.closest = self.__queue[0] # arbitrary cluster from queue merged_cluster.distance = self.__cluster_distance( merged_cluster, merged_cluster.closest) for item in self.__queue: distance = self.__cluster_distance( merged_cluster, item) # Check if distance between new cluster and current is the best than now. if (distance < merged_cluster.distance): merged_cluster.closest = item merged_cluster.distance = distance # Check if current cluster has removed neighbor. if ((item.closest is cluster1) or (item.closest is cluster2)): # If previous distance was less then distance to new cluster then nearest cluster should be found in the tree. #print("Update: ", item); if (item.distance < distance): (item.closest, item.distance) = self.__closest_cluster( item, distance) # TODO: investigation of root cause is required. # Itself and merged cluster should be always in list of neighbors in line with specified radius. # But merged cluster may not be in list due to error calculation, therefore it should be added # manually. if (item.closest is None): item.closest = merged_cluster item.distance = distance # Otherwise new cluster is nearest. else: item.closest = merged_cluster item.distance = distance cluster_relocation_requests.append(item) elif (item.distance > distance): item.closest = merged_cluster item.distance = distance cluster_relocation_requests.append(item) # New cluster and updated clusters should relocated in queue self.__insert_cluster(merged_cluster) for item in cluster_relocation_requests: self.__relocate_cluster(item) # Change cluster representation self.__clusters = [ cure_cluster_unit.indexes for cure_cluster_unit in self.__queue ] self.__representors = [ cure_cluster_unit.rep for cure_cluster_unit in self.__queue ] self.__means = [ cure_cluster_unit.mean for cure_cluster_unit in self.__queue ]