.-- --

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 comment(-) trackback(-)
.01 2013

K-means法理解 (2)

こんにちわ。Uedaです。

今回は、前回のブログの内容の説明をします。

まず、10x10の範囲でランダムな点をDATA_COUNTだけ生成します。これが与えられたデータになります。


for (int i = 0 ; i < DATA_COUNT; i++)
{
double *data = new double[3];
data[0] = [self random] * 10.0;
data[1] = [self random] * 10.0;
double classVal = [self random];
for (int j = 0; j < CLASS_COUNT; j++)
{
if ( classVal < ((j+1) / (double)CLASS_COUNT) )
{
data[2] = j;
break;
}
}
dataArray.push_back(data);
NSLog(@"%f,%f,%d, %f", data[0], data[1], (int)data[2], classVal);
}


このデータをまとまりに分割しよう(今回は5つ)。分割の方法にk-means法を使おうといった具合です。

前回紹介したサイトに、k-means法の手順がわかりやすく掲載されています。これが、前回実装したコードのどこの部分にあたるか説明します。

① 各点にランダムにクラスタを割り当てる (上のコード)
② クラスタの重心を計算する。
③ 点のクラスタを、一番近い重心のクラスタに変更する
④ 変化がなければ終了。変化がある限りは 2. に戻る。


while (!bFinish)
{

for (int i = 0; i < CLASS_COUNT; i++)
{
double *center = centerArray.at(i);
double x = 0.0, y = 0.0;
int count = 0;
for (int j = 0; j < DATA_COUNT; j++)
{
double *data = dataArray.at(j);
if ((int)data[2] == i) // あるクラスタに割り振られたデータかどうか
{
x += data[0]; // 重心計算中
y += data[1]; //
count++;
}
}
center[0] = x / (double)count; // 重心計算
center[1] = y / (double)count; // 重心計算
}

bFinish = true;

for (int i = 0; i < DATA_COUNT; i++)
{
double *data = dataArray.at(i);
double minDist = 0.0;
int min = -1;
int prev = (int) data[2];
for (int j = 0; j < CLASS_COUNT; j++)
{
double* center = centerArray.at(j);
double dx = data[0] - center[0];
double dy = data[1] - center[1];
double dist = sqrt(dx*dx + dy*dy);
if (min < 0 || dist < minDist) // あるデータがどのクラスタの重心に近いか
{
min = j;
minDist = dist;
data[2] = j;
}
}
int cur = (int) data[2];
if (prev != cur) bFinish = false; // ← ④ (ひとつでもクラスタが変われば、もう一度)
}
calcCount++;
}
NSLog(@"計算回数 %d", calcCount);


以上です。

ようは、DATA_COUNT種類の料理を縦軸に甘い順に、横軸に辛い順に並べて、味の近いかどうかで分割しよう。といったことをやってみました。
関連記事
スポンサーサイト

Comment

Post comment

  • comment
  • secret
  • 管理者にだけ表示を許可する

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/254-abefc8ba

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。