@@ 250-268 (lines=19) @@ | ||
247 | self.__centers.pop(indexes[1]); # remove merged center. |
|
248 | ||
249 | ||
250 | def __merge_by_complete_link(self): |
|
251 | """! |
|
252 | @brief Merges the most similar clusters in line with complete link type. |
|
253 | ||
254 | """ |
|
255 | ||
256 | minimum_complete_distance = float('Inf'); |
|
257 | indexes = None; |
|
258 | ||
259 | for index_cluster1 in range(0, len(self.__clusters)): |
|
260 | for index_cluster2 in range(index_cluster1 + 1, len(self.__clusters)): |
|
261 | candidate_maximum_distance = self.__calculate_farthest_distance(index_cluster1, index_cluster2); |
|
262 | ||
263 | if (candidate_maximum_distance < minimum_complete_distance): |
|
264 | minimum_complete_distance = candidate_maximum_distance; |
|
265 | indexes = [index_cluster1, index_cluster2]; |
|
266 | ||
267 | self.__clusters[indexes[0]] += self.__clusters[indexes[1]]; |
|
268 | self.__clusters.pop(indexes[1]); # remove merged cluster. |
|
269 | ||
270 | ||
271 | def __calculate_farthest_distance(self, index_cluster1, index_cluster2): |
|
@@ 208-226 (lines=19) @@ | ||
205 | ||
206 | minimum_average_distance = float('Inf'); |
|
207 | ||
208 | for index_cluster1 in range(0, len(self.__clusters)): |
|
209 | for index_cluster2 in range(index_cluster1 + 1, len(self.__clusters)): |
|
210 | ||
211 | # Find farthest objects |
|
212 | candidate_average_distance = 0.0; |
|
213 | for index_object1 in self.__clusters[index_cluster1]: |
|
214 | for index_object2 in self.__clusters[index_cluster2]: |
|
215 | candidate_average_distance += euclidean_distance_sqrt(self.__pointer_data[index_object1], self.__pointer_data[index_object2]); |
|
216 | ||
217 | candidate_average_distance /= (len(self.__clusters[index_cluster1]) + len(self.__clusters[index_cluster2])); |
|
218 | ||
219 | if (candidate_average_distance < minimum_average_distance): |
|
220 | minimum_average_distance = candidate_average_distance; |
|
221 | indexes = [index_cluster1, index_cluster2]; |
|
222 | ||
223 | self.__clusters[indexes[0]] += self.__clusters[indexes[1]]; |
|
224 | self.__clusters.pop(indexes[1]); # remove merged cluster. |
|
225 | ||
226 | ||
227 | def __merge_by_centroid_link(self): |
|
228 | """! |
|
229 | @brief Merges the most similar clusters in line with centroid link type. |