0

ランダムなデータセットがあるとしましょう

X       Y
1.2     16
5.7     0.256
128.54  6.879
0       2.87
6.78    0
2.98    3.7
...     ...
 x'      y'

このデータセットの重心座標を見つけるにはどうすればよいですか?

psここで試してみましたが、間違った結果が得られました

float Dim1[K];
float Dim2[K];
float centroidD1[K];
float centroidD2[K];

int K = 4;
int counter[K];
for(int i = 0; i < K ; i++)
{
    Dim1[i] = 0;
    Dim2[i] = 0;
    counter[i] = 0;
    for(int j = 0; j < hash["Cluster"].size(); j++)
    {
        if(hash["Cluster"].value(j) == i+1)
        {
            Dim1[i] += hash["Dim_1"].value(j);
            Dim2[i] += hash["Dim_2"].value(j);
            counter[i]++;
        }
    }
}

for(int l = 0; l < K; l++)
{
    centroidD1[l] = Dim1[l] / counter[l];
    centroidD2[l] = Dim2[l] / counter[l];
}

間違った結果が得られるため、間違ったアルゴリズムを選択したと思います。

4

1 に答える 1

1

大きなデータ セットがある場合、合計を計算して N で割ることはお勧めできません。浮動小数点アキュムレータが大きくなると、新しいポイントを追加すると、マグニチュードの違いにより、最終的に機能しなくなります。増分式の方が適切に機能する場合があります。https ://math.stackexchange.com/questions/106700/incremental-averageing を参照してください。

問題のデータ セットが大きすぎる場合は、手作業で検証された結果を含む小さなデータ セットを使用して、コードの基本的な機能を検証できます。たとえば、1 つのデータ ポイントだけ、または 10 個のデータ ポイントなどです。

于 2013-09-11T00:40:11.407 に答える