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

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

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

کنترل خالی نبودن خوشه ها و محاسبه ی فاصله

همونطور که قبلا هم گفتم، یکی از موضوعات مهم در روش کا-میانگین اینه که در هر لحظه، هیچ خوشه ای نباید خالی باشه. به عبارت دیگر، هر خوشه حداقل باید یه عضو داشته باشه وگرنه وجودش بی معنی است. توی قسمت قبلی، قبل از اینکه من میانگین داده های درون یک خوشه را محاسبه کنم چک می کردم که خوشه ها خالی نباشند. کدی که این کار رو برام انجام میده اینه:

 


private bool EmptyCluster(List<DataPoint> data)
{
var emptyCluster =
data.GroupBy(s => s.Cluster).OrderBy(s => s.Key).Select(g => new {Cluster = g.Key, Count = g.Count()});

foreach (var item in emptyCluster)
{
if (item.Count == 0)
{
return true;
}
}
return false;
}

اول کالکشن _clusters رو بر اساس پروپرتی Cluster گروه بندی می کنم و بعد چک می کنم که هر کدوم از گروه ها لااقل یک عضو داشته باشه. (Count که توی دستور LINQ تعریف شده مساوی صفر نباشه.)

محاسبه ی فاصله ی یک DataPoint تا یک خوشه

یه موضوع دیگه که میخوام توی این پست ازش صحبت کنم محاسبه ی فاصله است. حالا که ما توانستیم میانگین داده های درون یک خوشه رو به دست بیاریم، باید فاصله ی یک DataPoint تا اون میانگین رو محاسبه کنیم و تصمیم بگیریم که آیا اون DataPoint باید به اون خوشه منتقل بشه یا نه. در واقع، ما به دنبال خوشه ای هستیم که میانگین داده هاش (پروپروتی های Height و Weight مربوط به DataPoint های درون کالکشن _clusters) کمترین تفاوت رو همین دو پروپرتی از یک DataPoint داشته باشه. وقتی توانستیم یه همچین خوشه ای رو به دست بیاریم، باید اون DataPoint رو به اون خوشه منتقل کنیم. حالا چجوری فاصله رو محاسبه کنیم؟ روش های مختلفی برای این کار وجود داره. من از روش Euclidean (فاصله ی اقلیدسی) استفاده کردم. فرمولش رو از توی این لینک ببنید. کد زیر بر اساس فرمول این روش نوشته شده:

private double EuclideanDistance(DataPoint dataPoint, DataPoint mean)
{
double _diffs = 0.0;
_diffs = Math.Pow(dataPoint.Height - mean.Height, 2);
_diffs += Math.Pow(dataPoint.Weight - mean.Weight, 2);
return Math.Sqrt(_diffs);
}

همونطور که می بنید، این متد دو تا DataPoint رو دریافت می کنه. پارامتر اول همون DataPoint ی هست که میخوایم احتمالاً به یک خوشه ی دیگه منتقلش کنیم. و پارامتر دوم همون خوشه ی هدف هست که میانگین داده هاش درون دو تا پروپرتی ش ذخیره شده. این متد فاصله ی بین Height و Weight رو محاسبه می کنه و به عنوان یک عدد double بر می گردونه.

خب فکر کنم بقیه ی بحث رو توی پست بعدی ادامه بدیم بهتر باشه.

نظر بدهید

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