خوشهبندی k-میانگین
نقطهها را به k خوشه تقسیم میکند: هر نقطه به نزدیکترین مرکز میپیوندد و هر مرکز به میانگین نقطههایش میرود، تا وقتی هیچ نقطهای خوشهاش را عوض نکند. هزینه هر دور کم میشود، ولی جواب ممکن است بهینهی موضعی باشد.
n نقطه داریم و میخواهیم آنها را به k خوشه تقسیم کنیم و برای هر خوشه یک مرکز بگذاریم، طوری که مجموع مربع فاصلهی هر نقطه تا مرکز خوشهاش کمینه شود. پیدا کردن جواب بهینه NP-سخت است.
- زمان:
O(n · k) per round - حافظه:
O(n + k) - CLRS، بخش ۳۳.۱
هشت نقطه در دو گروه روشن؛ با k = ۲ و شروع از دو نقطهی اول (که هر دو در یک گروهاند)، مرکزها در دو سه دور جای درستشان را پیدا میکنند.
def k_means(P, k):# P: points (x, y). Lloyd's algorithm, starting from the first k points as centres so the run is deterministic.n = len(P)if k > n:return Nonecentres = [[P[i][0], P[i][1]] for i in range(k)]rows = [[i + 1, P[i][0], P[i][1], "·"] for i in range(n)] # for the picture: point, x, y, clustercluster = [-1] * nrounds = 0changed = Truewhile changed:changed = Falserounds = rounds + 1# Assignment step: every point joins its nearest centre.for i in range(n):best = 0for c in range(k):if dist2(P[i], centres[c]) < dist2(P[i], centres[best]):best = cif best != cluster[i]:cluster[i] = bestchanged = Truerows[i][3] = best + 1# Update step: every centre moves to the mean of its points.for c in range(k):members = [P[i] for i in range(n) if cluster[i] == c]if members:centres[c] = [round(sum(p[0] for p in members) / len(members), 2),round(sum(p[1] for p in members) / len(members), 2)]cost = round(sum(dist2(P[i], centres[cluster[i]]) for i in range(n)), 2)return clusterdef dist2(p, q):return (p[0] - q[0]) ** 2 + (p[1] - q[1]) ** 2
شروع اجرا
جدول هنوز خالی است.
متغیرهای محلی
نارنجی = در همین گام عوض شد
P list
Call stack
- k_means()خط 1
توضیح
مسئله
n نقطه داریم و میخواهیم آنها را به k خوشه تقسیم کنیم و برای هر خوشه یک مرکز بگذاریم، طوری که مجموع مربع فاصلهی هر نقطه تا مرکز خوشهاش کمینه شود. پیدا کردن جواب بهینه NP-سخت است.
الگوریتم لوید
با k مرکز اولیه شروع کن (اینجا k نقطهی اول، تا اجرا تکرارپذیر باشد)، و این دو گام را تکرار کن:
- انتساب: هر نقطه به خوشهی نزدیکترین مرکز برود.
- بهروزرسانی: هر مرکز به میانگین نقطههای خوشهاش برود.
هر گام هزینه را کم میکند یا ثابت نگه میدارد (میانگین، نقطهای است که مجموع مربع فاصلهها را کمینه میکند). وقتی هیچ نقطهای خوشهاش را عوض نکند، تمام است.
محدودیت
جواب به مرکزهای اولیه بستگی دارد و ممکن است فقط بهینهی موضعی باشد (پیشتنظیم «بهینهی موضعی»). در عمل چند بار با شروعهای مختلف اجرا میکنند، یا مرکزهای اولیه را هوشمندانه انتخاب میکنند (k-means++).
ورودی
هر سطر P یک نقطه (x, y) است و k تعداد خوشهها.