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

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

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

محاسبه ی میانگین (Mean) داده های درون یک خوشه

توی قسمت قبلی ما تونستیم داده ها رو توی خوشه های تصادفی قرار بدیم. کاری که باید الان انجام بدیم اینه که میانگین داده های درون هر خوشه رو محاسبه کنیم. در واقع، همین میانگین هست که نهایتاً تصمیم میگیره که کدوم DataPoint توی کدوم خوشه قرار بگیره. اسم الگوریتم هم از همینجا میاد: کا-میانگین (K-Means). خب چجوری اینو انجام بدیم؟ و کجا ذخیره کنیم؟ یادتونه که یه کالکشن با اسم _culsters تعریف کرده بودم که یک لیست جنریک از نوع DataPoint بود. در واقع ما به ازای هر خوشه یا Centroid یه DataPoint توی این کالکشن قرار میدیم. پروپرتی Cluster توی داده های درون این لیست اندیس هر خوشه رو نگه میدارن و دو تا پروپرتی Height و Weight به ترتیب میانگین مقادیر این دو تا پروپرتی رو برای تمامی DataPoint های درون اون خوشه نگه می دارند.

برای روشن تر شدن بحث یه مثال میزنم. فرض کنید توی کالکشن _rawDataToCluster سه تا DataPoint با مقادیر

  • DataPoint{32,65,1}
  • DataPoint{16,87,1}
  • DataPoint{17,60,1}

داریم. بر اساس پروپرتی Cluster می تونیم بفهمیم که هر سه تای این DataPoint ها توی خوشه ای با اندیس 1 هستند. حالا اگر به کالکشن _clusters نگاه کنیم، می بینیم یه DataPoint با مقدار

DataPoint{21.6,70.6,1}

وجود داره. اندیس این خوشه 1 هست. پروپرتی های Height و Weight به ترتیب حاوی میانگین این دو تا پروپرتی در سه تا DataPoint ی هست که درون این خوشه هستند. برای محاسبه ی میانگین هم کافیه مقادیر هر پروپرتی رو جمع و تقسیم بر تعداد DataPoint درون اون خوشه کنیم. حالا کد زیر رو نگاه کنید:

 


private bool UpdateDataPointMeans()
{
if (EmptyCluster(_normalizedDataToCluster)) return false;

var groupToComputeMeans = _normalizedDataToCluster.GroupBy(s => s.Cluster).OrderBy(s => s.Key);
int clusterIndex = 0;
double height = 0.0;
double weight = 0.0;
foreach (var item in groupToComputeMeans)
{
foreach (var value in item)
{
height += value.Height;
weight += value.Weight;
}
_clusters[clusterIndex].Height = height / item.Count();
_clusters[clusterIndex].Weight = weight / item.Count();
clusterIndex++;
height = 0.0;
weight = 0.0;
}
return true;
}

توی این متد اول چک کردم که هیچ خوشه ای خالی نباشه. اگر اینجوری بود سریع false رو بر میگردونم. در غیر اینصورت، بر اساس همون دستور LINQ و گروه بندی ای روی کالکشن _clusters بر اساس پروپرتی Cluster کردم میانگین پروپرتی ها رو توی کالکشن _normalizedDataToCluster محاسبه می کنم و توی DataPoint های متناظر درون _clusters قرار میدم. همونطور که گفتم کافیه جمع همه ی مقادیر این دو تا پروپرتی رو به دست بیاریم و بر تعداد تقسیم کنیم.

تا اینجای کار من تونستم کدی را بنویسم که میانگین داده های درون هر خوشه رو حساب کنه و ذخیره کنه. توی قسمت بعدی کار رو ادامه می دیم.

نظر بدهید

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