Unsupervised Learningপড়তে ৭ মিনিট লাগবে

কে-মিনস ক্লাস্টারিং (K-Means Clustering)

সেন্ট্রয়েডগুলোকে (centroids) একটু কাছে সরিয়ে এনে সাধারণ বা ন্যাচারাল (natural) গ্রুপগুলো খুঁজে বের করুন
algorithm:ইটারেটিভ বা বারবার করা কাজ (Iterative) · অ্যাসাইন বা নির্ধারণ করা, তারপর আপডেট বা পরিবর্তন করা · এবং এমনটি বারবার করাtime complexity:O(n × k × i) · n সংখ্যক পয়েন্ট (points), k সংখ্যক ক্লাস্টার (clusters), i সংখ্যক ইটারেশন বা বারবার করাtype:আনসুপারভাইজড (Unsupervised) · এর জন্য কোনো লেবেলের (labels) দরকার নেই

ভাবুন তো আপনি একটি হাউস পার্টির (house party) আয়োজন করেছেন এবং সেখানে খাবার রাখার জন্য আপনি ৩টি স্টেশন বা জায়গা রেখেছেন: একটি পিজ্জার জন্য, একটি টাকোর (tacos) জন্য, এবং একটি সুশির (sushi) জন্য। শুরুতে আপনি জাস্ট অনুমান করে খাবারগুলো এমন ৩টি জায়গায় রাখলেন — একটি বসার ঘরে বা লিভিং রুমে, একটি রান্নাঘরে, এবং একটি বারান্দা বা ছাদে।

লোকেরা যখন আসা শুরু করবে, তারা খুব স্বাভাবিকভাবেই তাদের পছন্দের খাবারের চারপাশে ভিড় জমাবে। আপনি খেয়াল করে দেখলেন যে লিভিং রুমে পিজ্জার চারপাশে ২০ জন ভিড় করে আছে, কিন্তু রান্নাঘরে টাকোর কাছে আছে মাত্র ৩ জন — কারণ এখানকার বেশিরভাগ টাকো প্রেমী মানুষগুলো আড্ডা দিচ্ছে ওই বারান্দায় বা ছাদে।

তাই আপনি এবার টাকো স্টেশনটিকে সরিয়ে ওই টাকো-প্রেমী মানুষদের ভিড়ের ঠিক মাঝখানে নিয়ে আসলেন। এরপর লোকেরা আবার এদিক সেদিক সরে যাবে, এবং আপনি আবারও আপনার খাবারগুলোকে একটু একটু করে ঠিক জায়গায় সরিয়ে আনবেন। এভাবে কয়েকবার করার পর, প্রতিটি স্টেশন এমন একটি একেবারে পারফেক্ট বা নিখুঁত জায়গায় চলে আসবে যেখানে সবারই হেঁটে গিয়ে খাবার আনতে সবচেয়ে কম সময় লাগে।

আর এটিই হলো কে-মিনস ক্লাস্টারিং (K-Means clustering)। এতে প্রথমে k সংখ্যক মাঝের পয়েন্ট বা সেন্ট্রয়েড (centroids) বসানো হয়, এরপর প্রতিটি ডেটা পয়েন্টকে তার সবচেয়ে কাছের সেন্ট্রয়েডের সাথে যুক্ত করে দেওয়া হয়। তারপর সেন্ট্রয়েডগুলোকে সেগুলোর সাথে যুক্ত থাকা পয়েন্টগুলোর একেবারে ঠিক মাঝখানে সরিয়ে আনা হয়, এবং যতক্ষণ না আর কিছুই পরিবর্তন হচ্ছে ততক্ষণ পর্যন্ত এই পুরো কাজটি বারবার করা হতে থাকে।

অ্যালগরিদমের প্রতিটি ধাপ (The algorithm, step by step)

  1. k বেছে নিন (Choose k) — আপনি ঠিক কতগুলো ক্লাস্টার বা ভাগ চান তা ঠিক করুন (আর এটিই হলো মূলত কে-মিনসের বা K-Means-এর সেই "K")
  2. ইনিশিয়ালাইজ বা শুরু করুন (Initialize) — আপনার ডেটার মাঝে রেন্ডম বা দৈবভাবে k সংখ্যক সেন্ট্রয়েড বসিয়ে দিন
  3. অ্যাসাইন বা যুক্ত করুন (Assign) — প্রতিটি ডেটা পয়েন্ট তার সবচেয়ে কাছের সেন্ট্রয়েডের ক্লাস্টারের সাথে গিয়ে যুক্ত হবে
  4. আপডেট বা পরিবর্তন করুন (Update) — এরপর প্রতিটি সেন্ট্রয়েডকে তার সাথে যুক্ত হওয়া সকল পয়েন্টের গড় (mean বা average) অবস্থানে সরিয়ে আনুন
  5. পুনরাবৃত্তি বা বারবার করতে থাকুন (Repeat) — যতক্ষণ না সেন্ট্রয়েডগুলো আর একদমই না নড়ছে (যাকে কনভার্জেন্স বা convergence বলা হয়) ততক্ষণ পর্যন্ত এই ৩-৪ নং ধাপের পুনরাবৃত্তি করতে থাকুন

আপনি কীভাবে k বেছে নেবেন? (How do you pick k?)

এর জন্য সবচেয়ে জনপ্রিয় পদ্ধতিটি হলো অ্যালবো মেথড (Elbow Method) বা কনুইয়ের পদ্ধতি। এর জন্য k=1, 2, 3, 4... এই মানগুলো ধরে কে-মিনস (K-Means) চালাতে থাকুন এবং এরপর প্রতিটি সেন্ট্রয়েড থেকে তাদের নিজস্ব পয়েন্টগুলোর মোট দূরত্বের (যাকে ইনারশিয়া বা inertia বলা হয়) একটি গ্রাফ বা প্লট (plot) আঁকুন। এই গ্রাফটিকে দেখতে মানুষের বাঁকা হাতের মতো মনে হবে — এখানকার যে বাঁকা অংশ বা "কনুইয়ের" পর থেকে এদের মধ্যকার দূরত্ব খুব একটা কমে না বা উন্নতি করে না, সেটিই হলো আপনার পারফেক্ট বা সঠিক k-এর মান।

অ্যাকশনে কে-মিনস ক্লাস্টারিং (K-Means Clustering in Action)

from sklearn.cluster import KMeans
import numpy as np
# স্যাম্পল ডেটা তৈরি: ৩টি স্বাভাবিক বা ন্যাচারাল গ্রুপ (Generate sample data: 3 natural groups)
np.random.seed(42)
group1 = np.random.randn(30, 2) + [0, 0] # (0,0)-তে কেন্দ্র করে
group2 = np.random.randn(30, 2) + [5, 5] # (5,5)-তে কেন্দ্র করে
group3 = np.random.randn(30, 2) + [10, 0] # (10,0)-তে কেন্দ্র করে
X = np.vstack([group1, group2, group3])
# k=3 দিয়ে কে-মিনস (K-Means) চালানো
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
kmeans.fit(X)
print(f"ক্লাস্টারের কেন্দ্র বা সেন্টারগুলো (Cluster centers):\n{np.round(kmeans.cluster_centers_, 2)}")
print(f"লেবেল বা ক্লাস্টারের ধরনগুলো (প্রথম ১০টির জন্য) (Labels (first 10)): {kmeans.labels_[:10]}")
print(f"ইনারশিয়া (Inertia): {kmeans.inertia_:.2f}")
Output
ক্লাস্টারের কেন্দ্র বা সেন্টারগুলো (Cluster centers):
[[ 0.05 -0.11]
 [ 5.01  5.12]
 [ 9.92 -0.03]]
লেবেল বা ক্লাস্টারের ধরনগুলো (প্রথম ১০টির জন্য) (Labels (first 10)): [0 0 0 0 0 0 0 0 0 0]
ইনারশিয়া (Inertia): 168.43

যেসব সীমাবদ্ধতা বা লিমেটেশন (Limitations)-এর দিকে নজর রাখতে হবে

  • আপনাকে অবশ্যই শুরুতে k বেছে নিতে হবে — এই অ্যালগরিদম কখনোই নিজে নিজে ক্লাস্টারের সংখ্যা বের করে দেবে না
  • ইনিশিয়ালাইজেশন বা কীভাবে শুরু করছেন তার ওপর অনেক বেশি নাজুক (Sensitive to initialization) — শুরুতে এর অবস্থানগুলো খারাপ হলে আপনি খারাপ ক্লাস্টারও পেতে পারেন (এর সমাধান হলো: এটি বেশ কয়েকবার ভিন্ন ভিন্ন শুরুর অবস্থান থেকে চালানো, যেমন: sklearn-এর n_init=10)
  • এটি ধরে নেয় যে ক্লাস্টারগুলো গোল বা গোলাকার (spherical) হবে — এটি অনেক লম্বাটে (elongated) বা অদ্ভুত আকৃতির (oddly-shaped) গ্রুপগুলোর ক্ষেত্রে খুব একটা ভালো কাজ করতে পারে না
  • স্কেলের (scale) ব্যাপারে এটি অনেক বেশি নাজুক (Sensitive to scale) — তাই সব সময় কাজ শুরু করার আগে ডেটাগুলো নরমাল (normalize) বা সমান করে নেবেন, নয়তো দূরত্ব হিসেব করার সময় বড় মান থাকা ফিচারগুলোই সেখানে সবচেয়ে বেশি ভূমিকা রাখবে

বাস্তব জীবনের বিভিন্ন ব্যবহার (Real-world uses)

  • কাস্টমার সেগমেন্টেশন (Customer segmentation) — কীভাবে মার্কেটিং করলে ভালো কাজ হবে, সেটি ভেবে কাস্টমারদের কেনাকাটার ধরন অনুযায়ী তাদের বিভিন্ন গ্রুপে ভাগ করা
  • ইমেজ কম্প্রেশন (Image compression) — কোনো ছবির লক্ষ লক্ষ রঙের থেকে সেগুলোকে কমিয়ে এনে সবচেয়ে দরকারি বা প্রয়োজনীয় k সংখ্যক রঙে রূপান্তর করা
  • অ্যানোমালি বা অস্বাভাবিকতা শনাক্ত করা (Anomaly detection) — কোনো সেন্ট্রয়েড থেকে খুব দূরে থাকা পয়েন্টগুলো মূলত কোনো আউটলায়ার (outliers) বা সন্দেহজনক কিছু হতে পারে
Note: কে-মিনস (K-Means) হলো একটি আনসুপারভাইজড (unsupervised) পদ্ধতি — এর জন্য কোনো লেবেল (labels) দেওয়ার দরকার নেই। আপনি শুধু একে কিছু ডেটা দিয়ে বলবেন যে 'এখান থেকে ৩টি গ্রুপ খুঁজে বের করো।' আর এটি নিজে থেকেই এখানকার গঠন বা কাঠামোটি খুঁজে বের করবে। আর যখন আপনার কাছে লেবেল করা ডেটা থাকবে না (এবং বাস্তব জীবনে প্রায় সব সময়ই এমনটি হয়), তখন এটি অবিশ্বাস্যভাবে অনেক কাজের ও দরকারি একটি টুল হিসেবে কাজ করে।

Key Metrics

📍 অ্যাসাইনমেন্টের ধাপ (Assignment Step)
প্রতিটি পয়েন্ট থেকে প্রতিটি সেন্ট্রয়েডের দূরত্ব হিসাব করে
O(n × k) প্রতিটি পয়েন্ট k সংখ্যক সেন্ট্রয়েড চেক বা পরীক্ষা করে
🔄 আপডেটের ধাপ (Update Step)
এর সাথে অ্যাসাইন হওয়া বা যুক্ত হওয়া পয়েন্টগুলোর গড় (mean) নিয়ে সেন্ট্রয়েডগুলোকে নতুন করে হিসাব করে
O(n × d) n সংখ্যক পয়েন্টের জন্য d সংখ্যক ডাইমেনশন বা দিকের গড় বা এভারেজ বের করে
⏱️ টোট্যাল বা সম্পূর্ণ রানটাইম (Total Runtime)
সাধারণত ১০-৫০ বার কাজের বা ইটারেশনের পরপরই এটি কনভার্জ (converges) বা স্থির হয়ে যায়
O(n × k × i × d) i সংখ্যক ইটারেশন বা বারবার করা কাজ, d সংখ্যক ডাইমেনশন (dimensions)
💾 স্পেস (Space)
এটির মেমরি খরচের পরিমাণ খুবই কম (memory-efficient)
O(n + k) পয়েন্ট + সেন্ট্রয়েড বা কেন্দ্রগুলোকে স্টোর করে বা জমা রাখে

ছোট কুইজ

কে-মিনস (K-Means)-এ 'আপডেট (update)' ধাপটি আসলে কী কাজ করে?
Challenge

পড়া চালিয়ে যান

পিসিএ (Principal Component Analysis - PCA)
১০০টি ফিচারকে (features) স্কোয়াশ (Squash) করে বা ছেঁটে নিয়ে শুধুমাত্র সবচেয়ে বেশি দরকারীগুলোকেই রাখা
ফিচার ইঞ্জিনিয়ারিং (Feature Engineering)
কাঁচা বা র (raw) ডেটাকে পরিবর্তন করে এমন ইনপুটে পরিণত করা যা কোনো মডেল আসলেই ব্যবহার করতে পারে
মডেল ইভ্যালুয়েশন বা মূল্যায়ন (Model Evaluation)
অ্যাকুরেসি বা নির্ভুলতাই সবকিছু নয় — আসুন আরও ভালোভাবে আরওসি (ROC), এইউসি (AUC), এফ১ (F1) সম্পর্কে জেনে নিই