def __get_average_intra_cluster_distance(self, entry): """! @brief Calculates average intra cluster distance between current and specified clusters. @param[in] entry (cfentry): Clustering feature to which distance should be obtained. @return (double) Average intra cluster distance. """ linear_part_first = list_math_addition( self.linear_sum, entry.linear_sum ) linear_part_second = linear_part_first linear_part_distance = sum( list_math_multiplication(linear_part_first, linear_part_second) ) general_part_distance = ( 2.0 * (self.number_points + entry.number_points) * (self.square_sum + entry.square_sum) - 2.0 * linear_part_distance ) return ( general_part_distance / ( (self.number_points + entry.number_points) * (self.number_points + entry.number_points - 1.0) ) ) ** 0.5
def __get_variance_increase_distance(self, entry): """! @brief Calculates variance increase distance between current and specified clusters. @param[in] entry (cfentry): Clustering feature to which distance should be obtained. @return (double) Variance increase distance. """ linear_part_12 = list_math_addition(self.linear_sum, entry.linear_sum) variance_part_first = (self.square_sum + entry.square_sum) - \ 2.0 * sum(list_math_multiplication(linear_part_12, linear_part_12)) / (self.number_points + entry.number_points) + \ (self.number_points + entry.number_points) * sum(list_math_multiplication(linear_part_12, linear_part_12)) / (self.number_points + entry.number_points)**2.0 linear_part_11 = sum( list_math_multiplication(self.linear_sum, self.linear_sum)) variance_part_second = -(self.square_sum - (2.0 * linear_part_11 / self.number_points) + (linear_part_11 / self.number_points)) linear_part_22 = sum( list_math_multiplication(entry.linear_sum, entry.linear_sum)) variance_part_third = -( entry.square_sum - (2.0 / entry.number_points) * linear_part_22 + entry.number_points * (1.0 / entry.number_points**2.0) * linear_part_22) return (variance_part_first + variance_part_second + variance_part_third)
def __add__(self, entry): """! @brief Overloaded operator add. Performs addition of two clustering features. @param[in] entry (cfentry): Entry that is added to the current. @return (cfentry) Result of addition of two clustering features. """ number_points = self.number_points + entry.number_points result_linear_sum = list_math_addition(self.linear_sum, entry.linear_sum) result_square_sum = self.square_sum + entry.square_sum return cfentry(number_points, result_linear_sum, result_square_sum)
def __add__(self, entry): """! @brief Overloaded operator add. Performs addition of two clustering features. @param[in] entry (cfentry): Entry that is added to the current. @return (cfentry) Result of addition of two clustering features. """ number_points = self.number_points + entry.number_points; linear_sum = list_math_addition(self.linear_sum, entry.linear_sum); square_sum = self.square_sum + entry.square_sum; return cfentry(number_points, linear_sum, square_sum);
def __get_average_intra_cluster_distance(self, entry): """! @brief Calculates average intra cluster distance between current and specified clusters. @param[in] entry (cfentry): Clustering feature to which distance should be obtained. @return (double) Average intra cluster distance. """ linear_part_first = list_math_addition(self.linear_sum, entry.linear_sum); linear_part_second = linear_part_first; linear_part_distance = sum(list_math_multiplication(linear_part_first, linear_part_second)); general_part_distance = 2.0 * (self.number_points + entry.number_points) * (self.square_sum + entry.square_sum) - 2.0 * linear_part_distance; return (general_part_distance / ( (self.number_points + entry.number_points) * (self.number_points + entry.number_points - 1.0) )) ** 0.5;
def __update_centers(self): """! @brief Calculate centers of clusters in line with contained objects. @return (list) Updated centers as list of centers. """ centers = [[] for i in range(len(self.__clusters))]; for index in range(len(self.__clusters)): point_sum = [0] * len(self.__pointer_data[0]); for index_point in self.__clusters[index]: point_sum = list_math_addition(point_sum, self.__pointer_data[index_point]); centers[index] = list_math_division_number(point_sum, len(self.__clusters[index])); return centers;
def __get_centers(data, clusters): """ @brief Centers of clusters in line with contained objects. @param[in] clusters (list): Clusters that contain indexes of objects from data. @return (list) Centers. """ centers = [[] for i in range(len(clusters))] dimension = len(data[0]) for index in range(len(clusters)): point_sum = [0.0] * dimension for index_point in clusters[index]: point_sum = list_math_addition(point_sum, data[index_point]) centers[index] = list_math_division_number(point_sum, len(clusters[index])) return centers
def __update_centers(self, clusters): """! @brief Updates centers of clusters in line with contained objects. @param[in] clusters (list): Clusters that contain indexes of objects from data. @return (list) Updated centers. """ centers = [[] for _ in range(len(clusters))]; dimension = len(self.__pointer_data[0]) for index in range(len(clusters)): point_sum = [0.0] * dimension; for index_point in clusters[index]: point_sum = list_math_addition(point_sum, self.__pointer_data[index_point]); centers[index] = list_math_division_number(point_sum, len(clusters[index])); return centers;
def __update_centers(self, clusters): """! @brief Updates centers of clusters in line with contained objects. @param[in] clusters (list): Clusters that contain indexes of objects from data. @return (list) Updated centers. """ centers = [[] for i in range(len(clusters))]; dimension = len(self.__pointer_data[0]) for index in range(len(clusters)): point_sum = [0.0] * dimension; for index_point in clusters[index]: point_sum = list_math_addition(point_sum, self.__pointer_data[index_point]); centers[index] = list_math_division_number(point_sum, len(clusters[index])); return centers;
def __get_variance_increase_distance(self, entry): """! @brief Calculates variance increase distance between current and specified clusters. @param[in] entry (cfentry): Clustering feature to which distance should be obtained. @return (double) Variance increase distance. """ linear_part_12 = list_math_addition(self.linear_sum, entry.linear_sum); variance_part_first = (self.square_sum + entry.square_sum) - \ 2.0 * sum(list_math_multiplication(linear_part_12, linear_part_12)) / (self.number_points + entry.number_points) + \ (self.number_points + entry.number_points) * sum(list_math_multiplication(linear_part_12, linear_part_12)) / (self.number_points + entry.number_points)**2.0; linear_part_11 = sum(list_math_multiplication(self.linear_sum, self.linear_sum)); variance_part_second = -( self.square_sum - (2.0 * linear_part_11 / self.number_points) + (linear_part_11 / self.number_points) ); linear_part_22 = sum(list_math_multiplication(entry.linear_sum, entry.linear_sum)); variance_part_third = -( entry.square_sum - (2.0 / entry.number_points) * linear_part_22 + entry.number_points * (1.0 / entry.number_points ** 2.0) * linear_part_22 ); return (variance_part_first + variance_part_second + variance_part_third);