コード例 #1
0
 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;
コード例 #2
0
ファイル: kmedoids.py プロジェクト: annoviko/pyclustering
    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
コード例 #3
0
ファイル: kmedoids.py プロジェクト: zgsxwsdxg/pyclustering
    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
コード例 #4
0
    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
コード例 #5
0
ファイル: kmedoids.py プロジェクト: zzp-seeker/pyclustering
    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