// // メンバーシップを更新 // bool Fuzzy::updateMembership () { // i番目の点とj番目のクラスタの中心点の距離(norm)を格納 cv::Mat matrix_norm_one_xi_minus_cj = cv::Mat::zeros (number_clusters_, number_points_, CV_32FC1); // // 距離の初期化 // for (unsigned int i = 0 ; i < number_points_; i++) for (unsigned int j = 0; j < number_clusters_; j++) matrix_norm_one_xi_minus_cj.at<float> (j, i) = 0.0; for (unsigned int i = 0 ; i < number_points_; i++) { // 各クラスタからの距離を計算 cv::Mat point = rows_.row (i); for (unsigned int j = 0; j < number_clusters_; j++) { cv::Mat center = centroids_.row (j); matrix_norm_one_xi_minus_cj.at<float> (j, i) = calc_dist (point, center, dist_type_); } } float coeff; for (unsigned int i = 0 ; i < number_points_; i++) for (unsigned int j = 0; j < number_clusters_; j++){ coeff = 0.0; for (unsigned int k = 0; k < number_clusters_; k++) { // if (matrix_norm_one_xi_minus_cj.at<float> (j, i) == 0) { // coeff += pow (0, 2.0 / (fuzziness_ - 1.0)); // } else if (matrix_norm_one_xi_minus_cj.at<float> (k, i) == 0) { // coeff += pow (1000000.0, 2.0 / (fuzziness_ - 1.0)); // } else { coeff += pow ( (matrix_norm_one_xi_minus_cj.at<float> (j, i) / matrix_norm_one_xi_minus_cj.at<float> (k, i)) , 2.0 / (fuzziness_ - 1.0) ); } // if (coeff == 0) { // new_membership_.at<float> (i, j) = 1.0; // } else { new_membership_.at<float> (i, j) = 1.0 / coeff; // } } if (!can_stop() ){ // 終了しない場合は更新 membership_ = new_membership_.clone (); return false; } return true; }
bool Fuzzy::updateMembership(){ Matrix matrix_norm_one_xi_minus_cj(number_points_, number_clusters_); for (unsigned int i = 0 ; i < number_points_; i++) for (unsigned int j = 0; j < number_clusters_; j++) matrix_norm_one_xi_minus_cj(i, j) = 0.0; // for each point for (unsigned int i = 0 ; i < number_points_; i++) // for each cluster for (unsigned int j = 0; j < number_clusters_; j++) // for each feature for (unsigned int f = 0; f < size_of_a_point_; f++){ // x_i-c_j x_i c_j matrix_norm_one_xi_minus_cj(i, j) += pow(abs(rows_(i, f) - (*p_centroids_)(j, f)),2); //std::cout << "matrix_norm_one_xi_minus_cj("<<i<<","<<j<<")=" // << "rows_("<<i<<", "<<f<<")=" << rows_(i, f) // << " (*p_centroids_)("<<j<<", "<<f // <<")=" << (*p_centroids_)(j, f) // << std::endl; } /******************************* Step 8 ***************************************/ double coeff; // for each point for (unsigned int i = 0 ; i < number_points_; i++) // for each cluster for (unsigned int j = 0; j < number_clusters_; j++){ // for each cluster coeff = 0.0; for (unsigned int k = 0; k < number_clusters_; k++) coeff+= pow ( (matrix_norm_one_xi_minus_cj(i, j) / matrix_norm_one_xi_minus_cj(i, k)) , 2 / (m_ - 1) ); (*p_new_membership_)(j, i) = 1 / coeff; } /******************************* Step 9 ***************************************/ //std::cout << "New membership " << (*p_new_membership_) << std::endl; if (!can_stop()){ (*p_membership_) = (*p_new_membership_); // switch matrices return false; } return true; }