.-- --

スポンサーサイト

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

K-means法理解

こんにちわ。Uedaです。

今回はクラスタリングの代表的なアルゴリズムであるk-means法を検証してみました。

参考サイト
http://tech.nitoyon.com/ja/blog/2009/04/09/kmeans-visualise/

ほうほう。では早速実装。


...
#ifdef _k_means_

std::vector dataArray;
const int DATA_COUNT = 100;
const int CLASS_COUNT = 5;
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);
}

std::vectorcenterArray;
for (int i = 0; i < CLASS_COUNT; i++)
{
double *center = new double[2];
centerArray.push_back(center);
}

Boolean bFinish = false;
int calcCount = 0;
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);

for (int i = 0 ; i < DATA_COUNT; i++)
{
double *data = dataArray.at(i);
NSLog(@"%f,%f,%d", data[0], data[1], (int)data[2]);
}
NSLog(@"重心");
for (int i = 0 ; i < CLASS_COUNT; i++)
{
double *center = centerArray.at(i);
NSLog(@"%f,%f,%d", center[0], center[1], i);
}

#endif

...

検証データ

Before

k-means_prev.png

After

k-means_cur.png

みごと、データを5つのクラスに分けることができました。

関連記事
スポンサーサイト

Comment

Post comment

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

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/253-c6304092

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


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


  • Ehara:
    ...


  • Hayate:
    ...


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


  • Ueda:
    ...



リンク

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