شماره تماس 09336863931 | 09178169907 پست الکترونیک info@provid.ir

الگوریتم خوشه بندی کا میانگین در سی شارپ #11

در این پست از وبسایت پرووید با قسمت یازدهم از سری آموزشی “پیاده سازی الگوریتم خوشه بندی کا-میانگین در سی شارپ” در خدمت شما هستیم. به ادامه ی مطلب بروید.

جابجا کردن داده ها درون خوشه ها

خب، بازم به الگوریتم کا-میانگین فکر کنید. این الگوریتم دنبال اینه که اونقدر DataPoint ها رو بین خوشه ها بهینه (که فاصله ی کمتری با یک DataPoint) دارند، جابجا کنه تا به یک خوشه بندی کامل و بهینه برسه. برای جابجا کردن یک DataPoint بین خوشه ها، کافیه که پروپرتی Cluster رو برای هر DataPoint تغییر بدیم. در واقع این پروپرتی نشون دهنده ی اون خوشه ای هست که DataPoint درونش قرار داره. حالا بحث اینه که چجوری اون خوشه رو پیدا کنیم. خیلی راحته. توی هر مرحله از الگوریتم باید فاصله ی DataPoint رو با تمامی خوشه های حاضر محاسبه کنیم و DataPoint رو به اون خوشه ای منتقل کنیم که حداقل فاصله رو با DataPoint داره. البته باید چک کنیم که هیچ خوشه ای هم خالی نباشه. به علاوه، اگر هیچ جابجایی توی عضویت DataPoint ها در خوشه ها اتفاق نیفتاد، دیگه الگوریتم به آخرین مرحله رسیده و تموم میشه. کد زیر رو ببینید:

 


private bool UpdateClusterMembership()
{
bool changed = false;

double[] distances = new double[_numberOfClusters];

StringBuilder sb = new StringBuilder();
for (int i = 0; i < _normalizedDataToCluster.Count; ++i)
{

for (int k = 0; k < _numberOfClusters; ++k)
distances[k] = ElucidanDistance(_normalizedDataToCluster[i], _clusters[k]);

int newClusterId = MinIndex(distances);
if (newClusterId != _normalizedDataToCluster[i].Cluster)
{
changed = true;
_normalizedDataToCluster[i].Cluster = _rawDataToCluster[i].Cluster = newClusterId;
sb.AppendLine("Data Point >> Height: " + _rawDataToCluster[i].Height + ", Weight: " +
_rawDataToCluster[i].Weight + " moved to Cluster # " + newClusterId);
}
else
{
sb.AppendLine("No change.");
}
sb.AppendLine("------------------------------");
txtIterations.Text += sb.ToString();

}
if (changed == false)
return false;
if (EmptyCluster(_normalizedDataToCluster)) return false;
return true;
}

برای پیدا کردن خوشه ای که یک DataPoint کمترین فاصله با اون رو داره از متد MinIndex که در زیر تعریف شده استفاده می کنیم. در واقع این متد یک آرایه رو دریافت می کنه و اندیس کمترین مقدار درون عناصر اون آرایه رو بر میگردونه. این کار توسط یه حلقه ی تکرار انجام میشه. فکر میکنم که کد این متد کاملاً ساده باشه و نیازی به توضیح بیشتری نباشه.

private int MinIndex(double[] distances)
{
int _indexOfMin = 0;
double _smallDist = distances[0];
for (int k = 0; k < distances.Length; ++k)
{
if (distances[k] < _smallDist)
{
_smallDist = distances[k];
_indexOfMin = k;
}
}
return _indexOfMin;
}

بقیه ی بحثمون رو میذاریم واسه پست بعدی. حتماً پست بعدی رو بخونید.

نظر بدهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

CLOSE
CLOSE