//
  // メンバーシップを更新  
  //     
  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;
  }
Example #2
0
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;
}