@@ 397-418 (lines=22) @@ | ||
394 | p = (K - 1) + dimension * K + 1; |
|
395 | ||
396 | # splitting criterion |
|
397 | for index_cluster in range(0, len(clusters), 1): |
|
398 | n = len(clusters[index_cluster]); |
|
399 | ||
400 | L = n * log(n) - n * log(N) - n * 0.5 * log(2.0 * numpy.pi) - n * dimension * 0.5 * log(sigma_sqrt) - (n - K) * 0.5; |
|
401 | ||
402 | # BIC calculation |
|
403 | scores[index_cluster] = L - p * 0.5 * log(N); |
|
404 | ||
405 | return sum(scores); |
|
406 | ||
407 | ||
408 | def __update_clusters(self, centers, available_indexes = None): |
|
409 | """! |
|
410 | @brief Calculates Euclidean distance to each point from the each cluster. |
|
411 | Nearest points are captured by according clusters and as a result clusters are updated. |
|
412 | ||
413 | @param[in] centers (list): Coordinates of centers of clusters that are represented by list: [center1, center2, ...]. |
|
414 | @param[in] available_indexes (list): Indexes that defines which points can be used from imput data, if None - then all points are used. |
|
415 | ||
416 | @return (list) Updated clusters. |
|
417 | ||
418 | """ |
|
419 | ||
420 | bypass = None; |
|
421 | if (available_indexes is None): |
@@ 155-173 (lines=19) @@ | ||
152 | for index_point in range(len(self.__pointer_data)): |
|
153 | index_optim = -1; |
|
154 | dist_optim = 0.0; |
|
155 | ||
156 | for index in range(len(self.__centers)): |
|
157 | # dist = euclidean_distance(data[index_point], centers[index]); # Slow solution |
|
158 | dist = euclidean_distance_sqrt(self.__pointer_data[index_point], self.__centers[index]); # Fast solution |
|
159 | ||
160 | if ( (dist < dist_optim) or (index is 0)): |
|
161 | index_optim = index; |
|
162 | dist_optim = dist; |
|
163 | ||
164 | clusters[index_optim].append(index_point); |
|
165 | ||
166 | # If cluster is not able to capture object it should be removed |
|
167 | clusters = [cluster for cluster in clusters if len(cluster) > 0]; |
|
168 | ||
169 | return clusters; |
|
170 | ||
171 | ||
172 | def __update_centers(self): |
|
173 | """! |
|
174 | @brief Calculate centers of clusters in line with contained objects. |
|
175 | ||
176 | @return (list) Updated centers as list of centers. |