void euclid(Real *v,char *out) { int i,j; int nearest_item; float error=0; float nearest_distance=1000000000.0,d; for(i=0;i<PHO_SLOTS;i++) { nearest_item=-1; for(j=0;j<phocount;j++) { d=euclid_distance(&v[i*PHO_FEATURES],phonemes[j].vector); if ((nearest_item == -1) || (d < nearest_distance)) { nearest_item=j; nearest_distance=d; } } error += d; out[i]=phonemes[nearest_item].ch; } out[PHO_SLOTS]=0; }
void Kmeans::m_step(const MatrixXdRowMajor& data_points) { validate_centroids(data_points); MatrixXdRowMajor tmp = MatrixXdRowMajor::Zero(centroids.rows(), centroids.cols()); for (int i=0; i<data_points.rows(); i++) tmp.row(membership(i)) += data_points.row(i); for (int i=0; i<centroids.rows(); i++) { tmp.row(i) /= points_per_centroid(i); double tmp_error = euclid_distance(centroids.row(i), tmp.row(i)); if (tmp_error != 0.0) changed_centroids++; if (tmp_error > error) error = tmp_error; centroids.row(i) = tmp.row(i); } }