我想寫一個k-means聚類類。我想讓我的功能平行。OMP並行減少
void kMeans::findNearestCluster()
{
short closest;
int moves = 0;
#pragma omp parallel for reduction(+:moves)
for(int i = 0; i < n; i++)
{
float min_dist=FLT_MAX;
for(int k=0; k < clusters; k++)
{
float dist_sum = 0.0, dist2 = 0.0;
for(int j = 0; j < dim; j++)
{
dist_sum = centroids[k*dim+j] - data[i*dim+j];
dist2 += dist_sum * dist_sum;
}
if (dist2 < min_dist)
{
min_dist = dist2;
closest = k;
}
}
if (assignment[i] != closest)
{
assignment[i] = closest;
moves++;
}
}
this->moves = moves;
}
這是它應該是如何工作的:
步驟1:查找最近的聚類
遍歷所有的數據點,並且比較所有質心之間的距離。
當找到最接近的質心時,它將存儲在名爲
closest
的變量中。檢查此點是否分配給新找到的最近的羣集。如果沒有,請將其移動到新的位置。 (增量運動)
步驟2:重新計算質心,基於新的分配。 (功能未顯示)
重複步驟1和步驟2,直到沒有更多移動發生。
沒有#parallel
moves
收斂到零。如果我有#parallel
移動具有隨機值。我認爲,因爲並行循環有衝突更新move
。
也許一個更好的策略是讓每個線程都有自己的移動變量,最後他們會有一些。