# কে-মিনস ক্লাস্টারিং

সাদৃশ্যতার উপর ভিত্তি করে ডেটার ভেতরে কোন গ্রুপ আছে কিনা সেটা খুঁজে বের করা হয় কে-মিনস ক্লাস্টারিং এর মাধ্যমে। এটি একটি আনসুপারভাইজড লার্নিং। আমরা অনেক সময় ক্লাস্টারিং এবং ক্লাসিফিকেশন এর বিষয়ে কনফিউজড হয়ে যাই, তবে এই বিষয় দুইটি সম্পূর্ণ আলাদা এবং প্রয়োগ ক্ষেত্রও আলাদা।&#x20;

![ছবি - কে মিনস ক্লাস্টারিং ( সম্পাদিত )](/files/-MAtim19RWJKDHwQ7FRQ)

> * **ক্লাসিফিকেশন** - ক্লাসিফিকেশন হচ্ছে সুপারভাইজড লার্নিং। ক্লাসিফিকেশনে লেবেল ডেটার মাধ্যমে মেশিনকে ট্রেইনিং দেয়া হয়। এরপর একটি অজানা ডেটা ইনপুট দিয়ে সেটি কোন ক্লাসের তা প্রেডিক্ট করা হয়। উদাহরন হিসেবে আইরিস ডেটাসেটের কথা বলা যেতে পারে। বিভিন্ন আইরিস ফুলের বৃত্তাংশ ও পাপড়ির পরিমাপ মেশিনকে ইনপুট দেয়া হয় একই সাথে বলে দেয়া হয় ফুলটি কোন প্রজাতির ছিল। এরপর একটি অজানা ফুলের বৃত্তাংশ ও পাপড়ির পরিমাপ ইনপুট দিলে মডেল অনুমান করতে পারে নতুন ফুলটি কোন প্রজাতির।&#x20;
> * **ক্লাস্টারিং**- ক্লাস্টারিং হচ্ছে আনসুপারভাইজড লার্নিং। এই পদ্ধতিতে মেশিনকে কোন লেবেল ডেটা দিয়ে ট্রেইনিং দেয়া হয় না, বরং মেশিন নিজ থেকেই আবিস্কার করে ডেটাগুলোর সাদৃশ্যতার উপর ভিত্তি করে এদের ভেতর কয়টি গ্রুপ রয়েছে।&#x20;

**কে-মিনস ক্লাস্টারিং যেভাবে করা হয়**

* প্রথমে একটি র‍্যান্ডমলি কে-এর মান নির্ধারণ করা হয় । ক্লাস্টার এর সংখ্যা কয়টি হবে সেটি কে দ্বারা প্রকাশ করা হয়।
* প্রতিটি ক্লাস্টারের জন্য আলাদা আলাদা  সেন্ট্রয়েড ভ্যালু অ্যাসাইন করা হয় । সেন্ট্রয়েড গুলোর সাথে ডেটা পয়েন্টের দূরত্ব কত সেটাও বের করা হয়।&#x20;
* সেন্ট্রয়েডগুলোর পজিশন পরিবর্তন করে ডেটাপয়েন্টে গুলোর সাথে  ডিসট্যান্স পুনরায় গননা করা হয় এবং দেখা হয় এরফলে  এভারেজ ডিসট্যান্স কমেছে কিনা ?&#x20;
* এভাবে উপরের ধাপগুলো বার বার করা হয় যতক্ষন না প্রতিটি ক্লাস্টারের সেন্ট্রয়েড তার ডেটা পয়েন্টের সাথে মিনিমাম ডিসট্যান্স এ না আসে।&#x20;

![ছবি - কে মিনস এর ধাপসমূহ ( সূত্র - ইন্টারনেট )  ](/files/-MA_D8ixXpNUWeTfWVuA)

**ডিস্ট্যান্স নির্ণয়**

কে-মিনস ক্লাস্টারিং-এ যেকোনো ডেটা পয়েন্টের পরস্পরের দূরত্ব নির্ণয়ের জন্য আমরা ইউক্লিডিয়ান ডিস্ট্যান্স ব্যবহার করে থাকি। নিচের উদাহরনের দিকে লক্ষ্য করলে দেখবেন দুইজন কাস্টমারের ডেটার দূরত্ব নির্ণয় করা হয়েছে। ইউক্লিডিয়ান ডিস্ট্যান্স-এ ভ্যারিয়েবলের সংখ্যা বাড়তে থাকলে আমরা কেবল বিয়োগে ভ্যারিয়েবলের সংখ্যা বাড়াতে থাকি।&#x20;

![চিত্র - একটি ভ্যারিয়েবল সমন্বিত দুজন কাস্টমারের ডিস্ট্যান্স ](/files/-MAtjPqYAVDBU1s5jP6N)

![চিত্র - একাধিক ভ্যারিয়েবল সমন্বিত দুজন কাস্টমারের ডিস্ট্যান্স ](/files/-MAtk_RRt9TMUUNZcuv7)

**কে মিনস ক্লাস্টারিং এর কিছু বৈশিষ্ট্য**&#x20;

* ইমপ্লিমেন্ট করা তুলনামূলক সহজ এবং প্রাপ্ত ফলাফল ইন্টারপ্রেট করাও সহজ।&#x20;
* অপেক্ষাকৃত দ্রুত কাজ করে।&#x20;
* প্রাথমিক ভাবে সঠিক কে-এর মান নির্ণয় কষ্টকর , যদিও এলবো মেথড প্রয়োগ করে তা নির্ণয় করা সম্ভব।&#x20;
* নয়েজ এবং আউটলায়ার থাকলে মডেল প্রভাবিত হয়।

**বাস্তব প্রয়োগ ক্ষেত্র**

* একাডেমিক পারফরম্যান্স ভিত্তিক ক্লাস্টার তৈরিতে
* মার্কেটিং ,সেলস এবং কাস্টমার সেগমেন্টেশন তৈরিতে
* ডকুমেন্টস ক্লাস্টার তৈরিতে&#x20;
* সার্চ ইঞ্জিন
* টেলিকমিউনিকেশন ইন্ডাস্ট্রিতে
* হেলথকেয়ার গবেষণায়&#x20;

**বয়স এবং আয়ের ক্লাস্টারিং**&#x20;

কে-মিনস ক্লাস্টারিং এর জন্য আমরা যে ডেটাসেট টি ব্যবহার করবো সেটি কিছু ব্যাক্তির বয়স এবং ইনকাম এর ডেটাসেট। আমাদের কাজ হবে বিভিন্ন মানুষদের বয়স এবং আয়ের উপর ভিত্তি করে তাদেরকে আলাদা আলাদা গ্রুপে ভাগ করা।&#x20;

ডেটাসেটের বিবরন,

* Name- ব্যাক্তির নাম
* Age- ব্যাক্তির বয়স
* Income- ব্যাক্তির আয়&#x20;

কে-মিনস ক্লাস্টারিং এর জন্য আমরা প্রয়োজনীয় লাইব্রেরী ইমপোর্ট  এবং ডেটাসেট লোড করে নেব,

```
import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt 
from sklearn.cluster import KMeans 
%matplotlib inline
from sklearn.preprocessing import MinMaxScaler

df = pd.read_csv('https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-income-age-group.csv')
df.head()
```

আমাদের ডেটাসেটটি দেখতে অনেকটা এরকম,&#x20;

![](/files/-M7az1yccbcWdRCtDzQG)

এ পর্যায়ে আমরা Name কলামটি মুছে ফেলবো এবং dfp নামক আরেকটি ডেটাফ্রেমে তৈরি করবো।ক্যাটেগরিক্যাল ভ্যালুকে স্কেলাইজড করা যায় না এজন্যই ডেটা স্কেলাইজড করার আগে আমরা  Name কলামটি মুছে ফেলবো।&#x20;

```
dfp = df.drop('Name', axis=1)
```

কে-মিনস ক্লাস্টারিং এর জন্য আমাদের ডেটাসেট কে স্কেলাইজড করতে হবে। এজন্য আমরা বিভিন্ন পদ্ধতী অবলম্বন করতে পারি। তবে এখানে আমরা ম্যাক্স-মিন স্কেলার ব্যবহার করবো।&#x20;

```
scaler = MinMaxScaler()
scaler.fit(dfp)
scaled = pd.DataFrame(scaler.transform(dfp),columns=dfp.columns)
scaled.head()
```

স্কেলাইজড হবার পরে আমাদের ডেটাসেটের ভ্যালুসমূহ ম্যাক্স-মিন  স্কেলে পরিবর্তিত হয়ে যাবে।&#x20;

![](/files/-M7b1Y8lAT2zE6QtBQpD)

কে-মিনস ক্লাস্টারিং-এ কে এর মান কত হবে বা ক্লাস্টারের সংখ্যা কয়টি হবে সেটা অনুমান করা বেশ কঠিন, তবে এলবো মেথডের মাধ্যমে আমরা সহজেই তা বের করতে পারি। এলবো মেথডে কে এর মান বের করার জন্য নিচের কোডটুক রান করতে হবে।&#x20;

```
Sum_of_squared_distances = []
K = range(1,15)
for k in K:
    km = KMeans(n_clusters=k)
    km = km.fit(scaled)
    Sum_of_squared_distances.append(km.inertia_)

plt.plot(K, Sum_of_squared_distances, 'bx-')
plt.xlabel('k')
plt.ylabel('Sum_of_squared_distances')
plt.title('Elbow Method For Optimal k')
plt.show()
```

নিচের ছবির দিকে লক্ষ্য করলে দেখা যাবে কে এর মান যখন ১ থেকে ২ এ নেমেছে তখন সাম অব স্কয়ারড ডিস্ট্যান্স ৫ থেকে ২-এ নেমে এসেছে। এর পর ২ থেকে ৩ এ নামার পর এই মান ২ থেকে প্রায় ০.৫  এ নেমে এসেছে।এরপর থেকে কে এর মান কমালেও সাম অব স্কয়ারড ডিস্ট্যান্স এর মান উল্লেখযোগ্য পরিমান কমে না, অর্থাৎ ব্যাবধান খুবই কম। সুতরাং আমরা কে এর মান ৩ কে অপটিমাল ভ্যালু হিসাবে ধরে নেব।

![](/files/-M7b1pQ6z_axeVFLruy7)

এবার ক্লাস্টারিং অ্যালগরিদম এর মাধ্যমে আমাদের ডেটাসেটকে ৩  টি ক্লাস্টারে ভাগ করবো ( যেহেতু কে এর মার ৩ পাওয়া গেছে)&#x20;

```
clusterNum = 3
k_means = KMeans(init = "k-means++", n_clusters = clusterNum, n_init = 12)
k_means.fit(scaled)
labels = k_means.labels_
print(labels)
```

আমরা চাইলে ডেটাসেটের সবগুলো রো এর সাথে ক্লাস্টার নাম্বার বসিয়ে ডেটাসেটটি দেখে নিতে পারি।

```
df["Cluster"] = labels
df.head(5)
```

![](/files/-M7b2U2eUDDiuszRxVC6)

এবার আমরা প্রতিটি ক্লাস্টারের গড় ভ্যালু দেখবো। এর মাধ্যমে আমরা সহজেই বুঝতে পারবো কোন ক্লাস্টারের ডেটার বৈশিষ্ট্য কেমন ।  আমরা এখানে দেখতে পাচ্ছি প্রথম ক্লাস্টারের ব্যাক্তিদের গড় বয়স ২৮.৩৩ বছর এবং গড় আয় ৫৮৬১১.১১ ডলার। দ্বিতীয় ক্লাস্টারের ব্যাক্তিদের গড় বয়স ৩৮.২৮ বছর এবং গড় আয় ১৫০০০০ ডলার। তৃতীয় ক্লাস্টারের ব্যাক্তিদের গড় বয়স ৪০.৫ বছর এবং গড় আয় ৬৮৬৬৬.৬৬ ডলার

```
df.groupby('Cluster').mean()
```

![](/files/-M7b2lfLvcrZTPncsqaM)

আমরা চাইলে কোন ক্লাস্টারে কয়টি ডেটা আছে সেটা দেখে নিতে পারি।&#x20;

```python
frame = pd.DataFrame(scaled)
frame['cluster'] = labels
frame['cluster'].value_counts()
```

![](/files/-M7b3scD2wt7BUEC9Vy9)

ক্লাস্টারগুলোকে স্কাটার প্লটের মাধ্যমে ভিজুয়ালাইজ করলে আমরা আলাদা আলাদা তিনটি ডেটা গ্রুপকে দেখতে পাবো।&#x20;

```
df1 = df[df.Cluster==0]
df2 = df[df.Cluster==1]
df3 = df[df.Cluster==2]

plt.scatter(df1.Age,df1['Income($)'],color='yellow')
plt.scatter(df2.Age,df2['Income($)'],color='red')
plt.scatter(df3.Age,df3['Income($)'],color='black')
```

![](/files/-M7b3Oa496fkDFJ4v-W3)

![](/files/-M9bUbQJvAJtKgvoR_JW)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://datasinsightsbd.gitbook.io/dsbook/undefined/kmeans.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
