ভূমিকা
K- মানে ক্লাস্টারিং সবচেয়ে ব্যাপকভাবে ব্যবহৃত অ-তত্ত্বাবধানহীন মেশিন লার্নিং অ্যালগরিদমগুলির মধ্যে একটি যা ডেটা উদাহরণগুলির মধ্যে মিলের উপর ভিত্তি করে ডেটার ক্লাস্টার তৈরি করে।
এই নির্দেশিকায়, আমরা প্রথমে একটি সহজ উদাহরণ দেখব যাতে কে-মিনস অ্যালগরিদম স্কিট-লার্ন ব্যবহার করে প্রয়োগ করার আগে কীভাবে কাজ করে। তারপর, আমরা আলোচনা করব কিভাবে কে-মিনসে ক্লাস্টারের সংখ্যা (Ks) নির্ধারণ করা যায়, এবং দূরত্বের মেট্রিক্স, প্রকরণ, এবং কে-মানসের সুবিধা এবং অসুবিধাগুলিও কভার করে।
প্রেরণা
নিম্নলিখিত পরিস্থিতি কল্পনা করুন। একদিন, আশেপাশের আশেপাশে হাঁটার সময়, আপনি লক্ষ্য করলেন যে সেখানে 10টি সুবিধার দোকান রয়েছে এবং আশ্চর্য হতে শুরু করলেন যে কোন দোকানগুলি একই রকম – কাছাকাছি সময়ে একে অপরের কাছাকাছি। এই প্রশ্নের উত্তর দেওয়ার উপায়গুলি অনুসন্ধান করার সময়, আপনি একটি আকর্ষণীয় পদ্ধতির মধ্যে এসেছেন যা একটি মানচিত্রের স্থানাঙ্কগুলির উপর ভিত্তি করে স্টোরগুলিকে গোষ্ঠীগুলিতে বিভক্ত করে৷
উদাহরণস্বরূপ, যদি একটি দোকান 5 কিমি পশ্চিমে এবং 3 কিমি উত্তরে অবস্থিত হয় - আপনি বরাদ্দ করবেন (5, 3)
এটির সাথে সমন্বয় করে এবং এটি একটি গ্রাফে উপস্থাপন করে। কি ঘটছে তা কল্পনা করতে এই প্রথম পয়েন্টটি প্লট করা যাক:
import matplotlib.pyplot as plt
plt.title("Store With Coordinates (5, 3)")
plt.scatter(x=5, y=3)
এটি শুধুমাত্র প্রথম পয়েন্ট, তাই আমরা কীভাবে একটি দোকানকে প্রতিনিধিত্ব করতে পারি তার একটি ধারণা পেতে পারি। বলুন যে আমাদের কাছে ইতিমধ্যে 10টি দোকানে 10টি স্থানাঙ্ক সংগ্রহ করা হয়েছে৷ তাদের আয়োজনের পর ক numpy
অ্যারে, আমরা তাদের অবস্থানগুলিও প্লট করতে পারি:
import numpy as np
points = np.array([[5, 3], [10, 15], [15, 12], [24, 10], [30, 45], [85, 70], [71, 80], [60, 78], [55, 52],[80, 91]])
xs = points[:,0]
ys = points[:,1]
plt.title("10 Stores Coordinates")
plt.scatter(x=xs, y=ys)
কীভাবে ম্যানুয়ালি কে-মিনস অ্যালগরিদম প্রয়োগ করবেন
এখন আমরা একটি গ্রাফে 10টি দোকানের দিকে তাকাতে পারি, এবং মূল সমস্যাটি হল খুঁজে বের করার জন্য এমন একটি উপায় আছে কি তাদের প্রক্সিমিটির ভিত্তিতে বিভিন্ন গ্রুপে ভাগ করা যায়? শুধু গ্রাফে দ্রুত কটাক্ষ করে, আমরা সম্ভবত লক্ষ্য করব দোকান দুটি গ্রুপ - একটি হল নীচের-বাম দিকের নীচের পয়েন্ট, এবং অন্যটি হল উপরের-ডানদিকের বিন্দু। সম্ভবত, আমরা একটি পৃথক গ্রুপ হিসাবে মাঝখানে ঐ দুটি পয়েন্ট পার্থক্য করতে পারেন - তাই তৈরি তিনটি ভিন্ন দল.
এই বিভাগে, আমরা ম্যানুয়ালি ক্লাস্টারিং পয়েন্টের প্রক্রিয়াটি দেখব – সেগুলিকে প্রদত্ত সংখ্যক গ্রুপে বিভক্ত করা। এই ভাবে, আমরা মূলত সাবধানে সব ধাপে যেতে হবে K- মানে ক্লাস্টারিং অ্যালগরিদম. এই বিভাগের শেষে, আপনি K-Means ক্লাস্টারিংয়ের সময় সম্পাদিত সমস্ত পদক্ষেপের একটি স্বজ্ঞাত এবং ব্যবহারিক উপলব্ধি উভয়ই অর্জন করবেন। এর পরে, আমরা এটি স্কিকিট-লার্নকে অর্পণ করব।
পয়েন্টের দুই বা তিনটি গ্রুপ থাকলে তা নির্ধারণের সর্বোত্তম উপায় কী হবে? একটি সহজ উপায় হ'ল কেবল একটি সংখ্যক গ্রুপ বেছে নেওয়া - উদাহরণস্বরূপ, দুটি - এবং তারপর সেই পছন্দের উপর ভিত্তি করে পয়েন্টগুলি গ্রুপ করার চেষ্টা করুন।
ধরা যাক আমরা সেখানে সিদ্ধান্ত নিয়েছি দুটি গ্রুপ আমাদের দোকানের (পয়েন্ট)। এখন, আমাদের বোঝার উপায় খুঁজে বের করতে হবে কোন পয়েন্ট কোন গ্রুপের। এটি প্রতিনিধিত্ব করার জন্য একটি পয়েন্ট নির্বাচন করে করা যেতে পারে গ্রুপ 1 এবং প্রতিনিধিত্ব করার জন্য একটি গ্রুপ 2. প্রতিটি গ্রুপের অন্য সমস্ত পয়েন্ট থেকে দূরত্ব পরিমাপ করার সময় এই পয়েন্টগুলি একটি রেফারেন্স হিসাবে ব্যবহার করা হবে।
যে পদ্ধতিতে, বিন্দু বলুন (5, 3)
গ্রুপ 1 এর অন্তর্গত শেষ, এবং পয়েন্ট (79, 60)
গ্রুপ 2. একটি নতুন পয়েন্ট বরাদ্দ করার চেষ্টা করার সময় (6, 3)
গোষ্ঠীতে, আমাদের এই দুটি পয়েন্টের দূরত্ব পরিমাপ করতে হবে। বিন্দুর ক্ষেত্রে (6, 3)
is কাছাকাছি থেকে (5, 3)
, তাই এটি সেই বিন্দু দ্বারা প্রতিনিধিত্ব করা গ্রুপের অন্তর্গত - গ্রুপ 1. এইভাবে, আমরা সহজেই সমস্ত পয়েন্টকে সংশ্লিষ্ট গোষ্ঠীতে গোষ্ঠীবদ্ধ করতে পারি।
এই উদাহরণে, গোষ্ঠীর সংখ্যা নির্ধারণের পাশাপাশি (ক্লাস্টার) – আমরা একটি হতে কিছু পয়েন্টও বেছে নিচ্ছি উল্লেখ প্রতিটি গ্রুপের নতুন পয়েন্টের দূরত্ব।
আমাদের দোকানের মধ্যে মিল বোঝার জন্য এটাই সাধারণ ধারণা। আসুন এটিকে বাস্তবে প্রয়োগ করা যাক – আমরা প্রথমে দুটি রেফারেন্স পয়েন্ট বেছে নিতে পারি এলোমেলো. এর রেফারেন্স পয়েন্ট গ্রুপ 1 হবে (5, 3)
এবং এর রেফারেন্স পয়েন্ট গ্রুপ 2 হবে (10, 15)
. আমরা আমাদের উভয় পয়েন্ট নির্বাচন করতে পারেন numpy
দ্বারা অ্যারে [0]
এবং [1]
সূচী এবং তাদের মধ্যে সংরক্ষণ করুন g1
(গ্রুপ 1) এবং g2
(গ্রুপ 2) ভেরিয়েবল:
g1 = points[0]
g2 = points[1]
এটি করার পরে, আমাদের অন্যান্য সমস্ত পয়েন্ট থেকে সেই রেফারেন্স পয়েন্টগুলির দূরত্ব গণনা করতে হবে। এটি একটি গুরুত্বপূর্ণ প্রশ্ন উত্থাপন করে - কীভাবে সেই দূরত্ব পরিমাপ করা যায়। আমরা মূলত যেকোন দূরত্ব পরিমাপ ব্যবহার করতে পারি, কিন্তু, এই গাইডের উদ্দেশ্যে, আসুন ইউক্লিডীয় দূরত্ব_ ব্যবহার করি।
এটা জানা দরকারী হতে পারে যে ইউক্লিডীয় দূরত্ব পরিমাপ পিথাগোরাসের উপপাদ্যের উপর ভিত্তি করে:
$$
c^2 = a^2 + b^2
$$
যখন একটি সমতলে পয়েন্টের সাথে অভিযোজিত হয় - (a1, b1)
এবং (a2, b2)
, পূর্ববর্তী সূত্র হয়ে যায়:
$$
c^2 = (a2-a1)^2 + (b2-b1)^2
$$
দূরত্ব হবে এর বর্গমূল c
, তাই আমরা সূত্রটিও লিখতে পারি:
$$
ইউক্লিডিয়ান_{dist} = sqrt[2][(a2 – a1)^2 + (b2 – b1) ^2)]
$$
বিঃদ্রঃ: আপনি বহুমাত্রিক বিন্দুর জন্য ইউক্লিডীয় দূরত্ব সূত্রটিও সাধারণীকরণ করতে পারেন। উদাহরণস্বরূপ, একটি ত্রিমাত্রিক স্থানে, পয়েন্টগুলির তিনটি স্থানাঙ্ক রয়েছে - আমাদের সূত্রটি নিম্নলিখিত উপায়ে প্রতিফলিত করে:
$$
ইউক্লিডিয়ান_{dist} = sqrt[2][(a2 – a1)^2 + (b2 – b1) ^2 + (c2 – c1) ^2)]
$$
আমরা যে স্থানটিতে কাজ করছি তার মাত্রার সংখ্যা নির্বিশেষে একই নীতি অনুসরণ করা হয়।
এখন পর্যন্ত, আমরা গোষ্ঠীর প্রতিনিধিত্ব করার জন্য পয়েন্টগুলি বেছে নিয়েছি, এবং আমরা জানি কিভাবে দূরত্ব গণনা করতে হয়। এখন, আমাদের সংগ্রহ করা প্রতিটি স্টোর পয়েন্ট একটি গ্রুপে বরাদ্দ করে দূরত্ব এবং গোষ্ঠীগুলিকে একত্রিত করা যাক।
এটি আরও ভালভাবে কল্পনা করার জন্য, আমরা তিনটি তালিকা ঘোষণা করব। প্রথম গ্রুপের পয়েন্ট স্টোর করার জন্য প্রথমটি - points_in_g1
. গ্রুপ 2 থেকে পয়েন্ট সঞ্চয় করার জন্য দ্বিতীয়টি - points_in_g2
, এবং সর্বশেষটি - group
, থেকে লেবেল হয় হিসাবে পয়েন্ট 1
(গ্রুপ 1 এর অন্তর্গত) বা 2
(গ্রুপ 2 এর অন্তর্গত):
points_in_g1 = []
points_in_g2 = []
group = []
আমরা এখন আমাদের পয়েন্টগুলির মাধ্যমে পুনরাবৃত্তি করতে পারি এবং তাদের এবং আমাদের প্রতিটি গ্রুপ রেফারেন্সের মধ্যে ইউক্লিডীয় দূরত্ব গণনা করতে পারি। প্রতিটি পয়েন্ট হবে কাছাকাছি দুটি গ্রুপের একটিতে - কোন গ্রুপ সবচেয়ে কাছের তার উপর ভিত্তি করে, আমরা প্রতিটি পয়েন্টকে সংশ্লিষ্ট তালিকায় বরাদ্দ করব, পাশাপাশি যোগ করার সময় 1
or 2
থেকে group
তালিকা:
for p in points:
x1, y1 = p[0], p[1]
euclidean_distance_g1 = np.sqrt((g1[0] - x1)**2 + (g1[1] - y1)**2)
euclidean_distance_g2 = np.sqrt((g2[0] - x1)**2 + (g2[1] - y1)**2)
if euclidean_distance_g1 < euclidean_distance_g2:
points_in_g1.append(p)
group.append('1')
else:
points_in_g2.append(p)
group.append('2')
কি ঘটেছে তা দেখতে এই পুনরাবৃত্তির ফলাফলগুলি দেখুন:
print(f'points_in_g1:{points_in_g1}n
npoints_in_g2:{points_in_g2}n
ngroup:{group}')
যার ফলে:
points_in_g1:[array([5, 3])]
points_in_g2:[array([10, 15]), array([15, 12]),
array([24, 10]), array([30, 45]),
array([85, 70]), array([71, 80]),
array([60, 78]), array([55, 52]),
array([80, 91])]
group:[1, 2, 2, 2, 2, 2, 2, 2, 2, 2]
আমরা সিবোর্ন ব্যবহার করে নির্ধারিত গ্রুপের উপর ভিত্তি করে বিভিন্ন রঙের সাথে ক্লাস্টারিং ফলাফল প্লট করতে পারি scatterplot()
সাথে group
হিসেবে hue
যুক্তি:
import seaborn as sns
sns.scatterplot(x=points[:, 0], y=points[:, 1], hue=group)
এটা স্পষ্টভাবে দৃশ্যমান যে শুধুমাত্র আমাদের প্রথম পয়েন্ট গ্রুপ 1-এ বরাদ্দ করা হয়েছে, এবং অন্য সমস্ত পয়েন্ট গ্রুপ 2-এ বরাদ্দ করা হয়েছে। এই ফলাফল আমরা শুরুতে যা কল্পনা করেছিলাম তার থেকে ভিন্ন। আমাদের ফলাফল এবং আমাদের প্রাথমিক প্রত্যাশার মধ্যে পার্থক্য বিবেচনা করে - এমন একটি উপায় আছে যা আমরা পরিবর্তন করতে পারি? মনে হয় আছে!
একটি পদ্ধতি হল প্রক্রিয়াটি পুনরাবৃত্তি করা এবং গ্রুপের রেফারেন্স হতে বিভিন্ন পয়েন্ট বেছে নেওয়া। এটি আমাদের ফলাফল পরিবর্তন করবে, আশা করি, আমরা শুরুতে যা কল্পনা করেছি তার সাথে আরও বেশি। এই দ্বিতীয়বার, আমরা সেগুলিকে এলোমেলোভাবে বেছে নিতে পারি না যেমনটি আমরা আগে করেছি, তবে একটি পেয়ে গড় আমাদের ইতিমধ্যে গোষ্ঠীবদ্ধ পয়েন্টগুলির মধ্যে। এইভাবে, সেই নতুন পয়েন্টগুলি সংশ্লিষ্ট গোষ্ঠীর মাঝখানে স্থাপন করা যেতে পারে।
উদাহরণস্বরূপ, যদি দ্বিতীয় গ্রুপের শুধুমাত্র পয়েন্ট থাকে (10, 15)
, (30, 45)
। নতুন মধ্য পয়েন্ট হবে (10 + 30)/2
এবং (15+45)/2
- যা সমান (20, 30)
.
যেহেতু আমরা আমাদের ফলাফলগুলিকে তালিকায় রেখেছি, আমরা সেগুলিকে প্রথমে রূপান্তর করতে পারি৷ numpy
অ্যারে, তাদের xs, ys নির্বাচন করুন এবং তারপর প্রাপ্ত করুন গড়:
g1_center = [np.array(points_in_g1)[:, 0].mean(), np.array(points_in_g1)[:, 1].mean()]
g2_center = [np.array(points_in_g2)[:, 0].mean(), np.array(points_in_g2)[:, 1].mean()]
g1_center, g2_center
উপদেশ: ব্যবহার করার চেষ্টা করুন numpy
এবং NumPy অ্যারে যতটা সম্ভব। এগুলি আরও ভাল পারফরম্যান্সের জন্য অপ্টিমাইজ করা হয়েছে এবং অনেক রৈখিক বীজগণিত ক্রিয়াকলাপকে সরল করে। যখনই আপনি কিছু রৈখিক বীজগণিত সমস্যা সমাধান করার চেষ্টা করছেন, আপনার অবশ্যই একটি কটাক্ষপাত করা উচিত numpy
কোন আছে কিনা তা পরীক্ষা করার জন্য ডকুমেন্টেশন numpy
আপনার সমস্যা সমাধানের জন্য ডিজাইন করা পদ্ধতি। সুযোগ আছে যে!
আমাদের নতুন কেন্দ্র পয়েন্টগুলির সাথে প্রক্রিয়াটি পুনরাবৃত্তি করতে সাহায্য করার জন্য, আসুন আমাদের পূর্ববর্তী কোডটিকে একটি ফাংশনে রূপান্তরিত করি, এটি কার্যকর করি এবং দেখুন যে পয়েন্টগুলিকে কীভাবে গোষ্ঠীভুক্ত করা হয়েছে তাতে কোনো পরিবর্তন হয়েছে কিনা:
def assigns_points_to_two_groups(g1_center, g2_center):
points_in_g1 = []
points_in_g2 = []
group = []
for p in points:
x1, y1 = p[0], p[1]
euclidean_distance_g1 = np.sqrt((g1_center[0] - x1)**2 + (g1_center[1] - y1)**2)
euclidean_distance_g2 = np.sqrt((g2_center[0] - x1)**2 + (g2_center[1] - y1)**2)
if euclidean_distance_g1 < euclidean_distance_g2:
points_in_g1.append(p)
group.append(1)
else:
points_in_g2.append(p)
group.append(2)
return points_in_g1, points_in_g2, group
বিঃদ্রঃ: আপনি যদি লক্ষ্য করেন যে আপনি একই কোড বারবার পুনরাবৃত্তি করতে থাকেন, তাহলে আপনাকে সেই কোডটি একটি পৃথক ফাংশনে মোড়ানো উচিত। কোডগুলিকে ফাংশনে সংগঠিত করা একটি সর্বোত্তম অনুশীলন হিসাবে বিবেচিত হয়, বিশেষত কারণ তারা পরীক্ষার সুবিধা দেয়। কোনো ফাংশন ছাড়াই সম্পূর্ণ কোডের চেয়ে কোডের বিচ্ছিন্ন অংশ পরীক্ষা করা সহজ।
ফাংশন কল করুন এবং এর ফলাফল সংরক্ষণ করুন points_in_g1
, points_in_g2
, এবং group
ভেরিয়েবল:
points_in_g1, points_in_g2, group = assigns_points_to_two_groups(g1_center, g2_center)
points_in_g1, points_in_g2, group
এবং গ্রুপ বিভাজন কল্পনা করার জন্য রঙিন বিন্দু সহ স্ক্যাটারপ্লট প্লট করুন:
sns.scatterplot(x=points[:, 0], y=points[:, 1], hue=group)
এটা আমাদের পয়েন্ট ক্লাস্টারিং হয় ভালো হচ্ছে. কিন্তু তারপরও, গ্রাফের মাঝখানে দুটি পয়েন্ট রয়েছে যা উভয় গ্রুপের সাথে তাদের নৈকট্য বিবেচনা করার সময় উভয় গ্রুপকে বরাদ্দ করা যেতে পারে। আমরা এখন পর্যন্ত যে অ্যালগরিদম তৈরি করেছি তা সেই দুটি পয়েন্টই দ্বিতীয় গ্রুপে বরাদ্দ করে।
এর মানে হল আমরা সম্ভবত Xs এবং Ys এর মাধ্যমে দুটি নতুন কেন্দ্রীয় বিন্দু তৈরি করে প্রক্রিয়াটি আরও একবার পুনরাবৃত্তি করতে পারি (সেন্ট্রয়েড) আমাদের গ্রুপে এবং দূরত্বের উপর ভিত্তি করে তাদের পুনরায় বরাদ্দ করা।
এর সেন্ট্রোয়েড আপডেট করার জন্য একটি ফাংশন তৈরি করা যাক। পুরো প্রক্রিয়াটি এখন সেই ফাংশনের একাধিক কলে হ্রাস করা যেতে পারে:
def updates_centroids(points_in_g1, points_in_g2):
g1_center = np.array(points_in_g1)[:, 0].mean(), np.array(points_in_g1)[:, 1].mean()
g2_center = np.array(points_in_g2)[:, 0].mean(), np.array(points_in_g2)[:, 1].mean()
return g1_center, g2_center
g1_center, g2_center = updates_centroids(points_in_g1, points_in_g2)
points_in_g1, points_in_g2, group = assigns_points_to_two_groups(g1_center, g2_center)
sns.scatterplot(x=points[:, 0], y=points[:, 1], hue=group)
লক্ষ্য করুন যে এই তৃতীয় পুনরাবৃত্তির পরে, প্রতিটি পয়েন্ট এখন বিভিন্ন ক্লাস্টারের অন্তর্গত। মনে হচ্ছে ফলাফল ভালো হচ্ছে – আসুন এটা আবার করি। এখন যাচ্ছে চতুর্থ পুনরাবৃত্তি আমাদের পদ্ধতির:
g1_center, g2_center = updates_centroids(points_in_g1, points_in_g2)
points_in_g1, points_in_g2, group = assigns_points_to_two_groups(g1_center, g2_center)
sns.scatterplot(x=points[:, 0], y=points[:, 1], hue=group)
এই চতুর্থবার আমরা পেয়েছি একই ফলাফল আগের মত। সুতরাং মনে হচ্ছে আমাদের পয়েন্টগুলি আর গোষ্ঠী পরিবর্তন করবে না, আমাদের ফলাফল এক ধরণের স্থিতিশীলতায় পৌঁছেছে - এটি একটি অপরিবর্তনীয় অবস্থায় পৌঁছেছে, বা কনভার্জড. তা ছাড়া, আমরা ঠিক একই ফলাফল পেয়েছি যা আমরা 2 টি গ্রুপের জন্য কল্পনা করেছিলাম। এই পৌঁছে যাওয়া বিভাজন অর্থপূর্ণ কিনা তাও আমরা দেখতে পারি।
আসুন আমরা এ পর্যন্ত যা করেছি তা দ্রুত সংক্ষেপে দেখা যাক। আমরা আমাদের 10টি স্টোরকে ভৌগলিকভাবে দুটি বিভাগে ভাগ করেছি - একটি নিম্ন দক্ষিণ-পশ্চিম অঞ্চলে এবং অন্যটি উত্তর-পূর্বে। আমাদের ইতিমধ্যে যা আছে তা ছাড়াও আরও ডেটা সংগ্রহ করা আকর্ষণীয় হতে পারে - রাজস্ব, দৈনিক গ্রাহকের সংখ্যা এবং আরও অনেক কিছু। এইভাবে আমরা একটি সমৃদ্ধ বিশ্লেষণ পরিচালনা করতে পারি এবং সম্ভবত আরও আকর্ষণীয় ফলাফল তৈরি করতে পারি।
এই ধরনের ক্লাস্টারিং অধ্যয়ন পরিচালনা করা যেতে পারে যখন একটি ইতিমধ্যে প্রতিষ্ঠিত ব্র্যান্ড একটি নতুন দোকান খোলার জন্য একটি এলাকা বেছে নিতে চায়। সেই ক্ষেত্রে, অবস্থান ছাড়াও আরও অনেক পরিবর্তনশীল বিবেচনা করা হয়।
কে-মিনস অ্যালগরিদমের সাথে এই সবের কী সম্পর্ক?
এই পদক্ষেপগুলি অনুসরণ করার সময় আপনি হয়তো ভাবছেন যে K-Means অ্যালগরিদমের সাথে তাদের কী করার আছে। আমরা এ পর্যন্ত পরিচালিত করেছি প্রক্রিয়া K- মানে অ্যালগরিদম. সংক্ষেপে, আমরা গ্রুপ/ক্লাস্টারের সংখ্যা নির্ধারণ করেছি, এলোমেলোভাবে প্রাথমিক পয়েন্টগুলি বেছে নিয়েছি, এবং ক্লাস্টারগুলি একত্রিত না হওয়া পর্যন্ত প্রতিটি পুনরাবৃত্তিতে সেন্ট্রোয়েড আপডেট করেছি। আমরা মূলত সম্পূর্ণ অ্যালগরিদম হাতে-কলমে সঞ্চালিত করেছি - প্রতিটি ধাপ সাবধানে পরিচালনা করছি।
সার্জারির K K-মানে থেকে আসে ক্লাস্টার সংখ্যা যেটি পুনরাবৃত্তি প্রক্রিয়া শুরু করার আগে সেট করা দরকার। আমাদের ক্ষেত্রে K = 2. এই বৈশিষ্ট্য কখনও কখনও হিসাবে দেখা যায় নেতিবাচক অন্যান্য ক্লাস্টারিং পদ্ধতি আছে বিবেচনা করে, যেমন হায়ারার্কিক্যাল ক্লাস্টারিং, যার জন্য আগে থেকে নির্দিষ্ট সংখ্যক ক্লাস্টার থাকার প্রয়োজন নেই।
এর মাধ্যম ব্যবহারের কারণে K-মানও হয়ে যায় বহিরাগত এবং চরম মূল্যবোধের প্রতি সংবেদনশীল - তারা পরিবর্তনশীলতা বাড়ায় এবং আমাদের সেন্ট্রোয়েডগুলির জন্য তাদের ভূমিকা পালন করা কঠিন করে তোলে। সুতরাং, সঞ্চালনের প্রয়োজনীয়তা সম্পর্কে সচেতন হন চরম মান এবং বহির্মুখী বিশ্লেষণ কে-মিনস অ্যালগরিদম ব্যবহার করে একটি ক্লাস্টারিং পরিচালনা করার আগে।
এছাড়াও, লক্ষ্য করুন যে আমাদের পয়েন্টগুলি সোজা অংশে বিভক্ত ছিল, ক্লাস্টারগুলি তৈরি করার সময় বক্ররেখা নেই। এটি কে-মিনস অ্যালগরিদমের একটি অসুবিধাও হতে পারে।
বিঃদ্রঃ: যখন আপনার এটিকে আরও নমনীয় এবং উপবৃত্ত এবং অন্যান্য আকারের সাথে মানিয়ে নেওয়ার প্রয়োজন হয়, তখন a ব্যবহার করার চেষ্টা করুন সাধারণীকৃত K- মানে গাউসিয়ান মিশ্রণ মডেল. এই মডেলটি উপবৃত্তাকার বিভাজন ক্লাস্টারগুলির সাথে খাপ খাইয়ে নিতে পারে।
কে-মানেও অনেক আছে সুবিধাদি! এটা ভালো পারফর্ম করে বড় ডেটাসেট আপনি যদি কিছু ধরণের শ্রেণীবদ্ধ ক্লাস্টারিং অ্যালগরিদম ব্যবহার করেন তবে এটি পরিচালনা করা কঠিন হয়ে উঠতে পারে। এটাও অভিন্নতার নিশ্চয়তা দেয়, এবং সহজেই করতে পারেন সাধারণীকরণ এবং খাপ খাওয়ানো. তা ছাড়া, এটি সম্ভবত সবচেয়ে বেশি ব্যবহৃত ক্লাস্টারিং অ্যালগরিদম।
এখন যেহেতু আমরা K-Means অ্যালগরিদমে সম্পাদিত সমস্ত ধাপ অতিক্রম করেছি এবং এর সমস্ত ভালো-মন্দ বুঝতে পেরেছি, আমরা অবশেষে Scikit-Learn লাইব্রেরি ব্যবহার করে K-Means বাস্তবায়ন করতে পারি।
কে-মিনস অ্যালগরিদম ব্যবহার করে কীভাবে প্রয়োগ করবেন সাইকিট-শিখুন
আমাদের ফলাফল দুবার চেক করতে, আসুন এই প্রক্রিয়াটি আবার করি, কিন্তু এখন কোডের 3 লাইন ব্যবহার করছি sklearn
:
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=2, random_state=42)
kmeans.fit(points)
kmeans.labels_
এখানে, লেবেলগুলি আমাদের আগের গ্রুপগুলির মতোই। চলুন দ্রুত ফলাফল প্লট করা যাক:
sns.scatterplot(x = points[:,0], y = points[:,1], hue=kmeans.labels_)
ফলস্বরূপ প্লটটি আগের বিভাগের মতোই।
সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!
বিঃদ্রঃ: স্কিকিট-লার্ন ব্যবহার করে আমরা কীভাবে কে-মিনস অ্যালগরিদম পারফর্ম করেছি তা দেখে আপনাকে ধারণা দিতে পারে যে এটি একটি নো-ব্রেইনার এবং এটি নিয়ে আপনার খুব বেশি চিন্তা করার দরকার নেই। কোডের মাত্র 3টি লাইন সমস্ত পদক্ষেপগুলি সম্পাদন করে যা আমরা পূর্ববর্তী বিভাগে আলোচনা করেছি যখন আমরা ধাপে ধাপে K-Means অ্যালগরিদম অতিক্রম করেছি। কিন্তু, শয়তান বিস্তারিত আছে এক্ষেত্রে! আপনি যদি অ্যালগরিদমের সমস্ত ধাপ এবং সীমাবদ্ধতাগুলি বুঝতে না পারেন, তাহলে আপনি সম্ভবত এমন পরিস্থিতির মুখোমুখি হবেন যেখানে K-Means অ্যালগরিদম আপনাকে এমন ফলাফল দেয় যা আপনি আশা করেননি৷
Scikit-Learn-এর সাহায্যে, আপনি সেট করে দ্রুত কনভারজেন্সের জন্য K-Means আরম্ভ করতে পারেন init='k-means++'
যুক্তি. বিস্তৃত অর্থে, K- মানে++ এখনও নির্বাচন করে k একটি অভিন্ন বন্টন অনুসরণ করে এলোমেলোভাবে প্রাথমিক ক্লাস্টার কেন্দ্র। তারপরে, প্রতিটি পরবর্তী ক্লাস্টার কেন্দ্র বাকী ডেটা পয়েন্ট থেকে বেছে নেওয়া হয় শুধুমাত্র দূরত্বের পরিমাপ গণনা করে নয় - কিন্তু সম্ভাব্যতা ব্যবহার করে। সম্ভাব্যতা ব্যবহার করে অ্যালগরিদমের গতি বাড়ে এবং খুব বড় ডেটাসেটের সাথে কাজ করার সময় এটি সহায়ক।
কনুই পদ্ধতি - গোষ্ঠীর সেরা সংখ্যা নির্বাচন করা
এ পর্যন্ত সব ঠিকই! আমরা পয়েন্ট এবং সেন্ট্রোয়েডের মধ্যে ইউক্লিডীয় দূরত্বের উপর ভিত্তি করে 10টি স্টোর ক্লাস্টার করেছি। কিন্তু গ্রাফের মাঝখানে সেই দুটি বিন্দুর বিষয়ে কি যা ক্লাস্টার করা একটু কঠিন? তারাও কি আলাদা দল গঠন করতে পারেনি? আমরা কি আসলে নির্বাচন করে ভুল করেছি? K = 2 দল? হয়তো আমরা আসলে ছিল K = 3 দল? এমনকি আমাদের তিনটি গোষ্ঠীরও বেশি থাকতে পারে এবং এটি সম্পর্কে সচেতন নই।
এখানে প্রশ্ন করা হচ্ছে কে-মিনসে গ্রুপের সংখ্যা (K) কীভাবে নির্ধারণ করবেন. এই প্রশ্নের উত্তর দেওয়ার জন্য, আমাদের বুঝতে হবে K এর একটি ভিন্ন মানের জন্য একটি "ভাল" ক্লাস্টার থাকবে কিনা।
যে আউট খুঁজে বের করার নিষ্পাপ উপায় বিভিন্ন মান সঙ্গে ক্লাস্টারিং পয়েন্ট দ্বারা হয় K, অনেক দূরে K=2, K=3, K=4, ইত্যাদি:
for number_of_clusters in range(1, 11):
kmeans = KMeans(n_clusters = number_of_clusters, random_state = 42)
kmeans.fit(points)
কিন্তু, বিভিন্ন জন্য ক্লাস্টারিং পয়েন্ট Ks একা যথেষ্ট হবে না আমরা এর জন্য আদর্শ মান বেছে নিয়েছি কিনা তা বুঝতে K. আমাদের প্রত্যেকের জন্য ক্লাস্টারিং গুণমান মূল্যায়ন করার একটি উপায় প্রয়োজন K আমরা বেছে নিয়েছি।
ম্যানুয়ালি গণনা করা স্কোয়ারের ক্লাস্টার সমষ্টির মধ্যে (WCSS)
আমাদের ক্লাস্টারড পয়েন্টগুলি একে অপরের কতটা কাছাকাছি তা পরিমাপ করার জন্য এখানে আদর্শ জায়গা। এটি মূলত কতটা বর্ণনা করে অনৈক্য আমরা একটি একক ক্লাস্টার ভিতরে আছে. এই পরিমাপ বলা হয় বর্গক্ষেত্রের ক্লাস্টার সমষ্টির মধ্যে, বা WCSS অল্পের জন্য. WCSS যত ছোট, আমাদের পয়েন্ট তত কাছাকাছি, তাই আমাদের একটি আরও সুগঠিত ক্লাস্টার রয়েছে। যেকোন সংখ্যক ক্লাস্টারের জন্য WCSS সূত্র ব্যবহার করা যেতে পারে:
$$
WCSS = যোগফল(Pi_1 – Centroid_1)^2 + cdots + যোগফল(Pi_n – Centroid_n)^2
$$
বিঃদ্রঃ: এই গাইডে, আমরা ব্যবহার করছি ইউক্লিডীয় দূরত্ব সেন্ট্রোয়েডগুলি পেতে, তবে অন্যান্য দূরত্বের ব্যবস্থা যেমন ম্যানহাটনও ব্যবহার করা যেতে পারে।
এখন আমরা অনুমান করতে পারি যে আমরা দুটি ক্লাস্টার বেছে নিয়েছি এবং WCSS কী এবং কীভাবে এটি ব্যবহার করতে হয় তা আরও ভালভাবে বোঝার জন্য WCSS প্রয়োগ করার চেষ্টা করি। সূত্রে বলা হয়েছে, আমাদের সমস্ত ক্লাস্টার পয়েন্ট এবং সেন্ট্রোয়েডের মধ্যে বর্গক্ষেত্রের পার্থক্যগুলি যোগ করতে হবে। সুতরাং, যদি প্রথম গ্রুপ থেকে আমাদের প্রথম পয়েন্ট হয় (5, 3)
এবং প্রথম গ্রুপের আমাদের শেষ সেন্ট্রোয়েড (একত্রিত হওয়ার পরে) (16.8, 17.0)
, WCSS হবে:
$$
WCSS = যোগফল((5,3) - (16.8, 17.0))^2
$$
$$
WCSS = যোগফল((5-16.8) + (3-17.0))^2
$$
$$
WCSS = যোগফল((-11.8) + (-14.0))^2
$$
$$
WCSS = যোগফল((-25.8))^2
$$
$$
WCSS = 335.24
$$
এই উদাহরণটি ব্যাখ্যা করে কিভাবে আমরা ক্লাস্টার থেকে এক বিন্দুর জন্য WCSS গণনা করি। কিন্তু ক্লাস্টারে সাধারণত একাধিক পয়েন্ট থাকে এবং WCSS গণনা করার সময় আমাদের সেগুলিকে বিবেচনায় নিতে হবে। আমরা একটি ফাংশন সংজ্ঞায়িত করে এটি করব যা পয়েন্ট এবং সেন্ট্রোয়েডের একটি ক্লাস্টার গ্রহণ করে এবং বর্গক্ষেত্রের সমষ্টি প্রদান করে:
def sum_of_squares(cluster, centroid):
squares = []
for p in cluster:
squares.append((p - centroid)**2)
ss = np.array(squares).sum()
return ss
এখন আমরা প্রতিটি ক্লাস্টারের জন্য বর্গক্ষেত্রের যোগফল পেতে পারি:
g1 = sum_of_squares(points_in_g1, g1_center)
g2 = sum_of_squares(points_in_g2, g2_center)
এবং মোট পেতে ফলাফল যোগ করুন WCSS:
g1 + g2
এর ফলে:
2964.3999999999996
সুতরাং, আমাদের ক্ষেত্রে, যখন K 2 এর সমান, মোট WCSS হল 2964.39. এখন, আমরা Ks পরিবর্তন করতে পারি এবং তাদের সকলের জন্য WCSS গণনা করতে পারি। এই ভাবে, আমরা কি সম্পর্কে একটি অন্তর্দৃষ্টি পেতে পারেন K আমাদের ক্লাস্টারিংকে সর্বোত্তম কার্য সম্পাদন করতে বেছে নেওয়া উচিত।
গণক WCSS ব্যবহার সাইকিট-শিখুন
সৌভাগ্যবশত, প্রতিটির জন্য আমাদের ম্যানুয়ালি WCSS গণনা করার দরকার নেই K. ক্লাস্টারের প্রদত্ত সংখ্যার জন্য K-Means ক্লাস্টারিং সম্পাদন করার পরে, আমরা ব্যবহার করে এর WCSS পেতে পারি inertia_
বৈশিষ্ট্য এখন, আমরা আমাদের কে-মিনসে ফিরে যেতে পারি for
লুপ, ক্লাস্টারের সংখ্যার সাথে এটি ব্যবহার করুন এবং সংশ্লিষ্ট WCSS মান তালিকা করুন:
wcss = []
for number_of_clusters in range(1, 11):
kmeans = KMeans(n_clusters = number_of_clusters, random_state = 42)
kmeans.fit(points)
wcss.append(kmeans.inertia_)
wcss
লক্ষ্য করুন যে তালিকার দ্বিতীয় মানটি ঠিক একই যা আমরা আগে গণনা করেছি K = 2:
[18272.9, # For k=1
2964.3999999999996, # For k=2
1198.75, # For k=3
861.75,
570.5,
337.5,
175.83333333333334,
79.5,
17.0,
0.0]
সেই ফলাফলগুলি কল্পনা করতে, আসুন আমাদের প্লট করি Ks WCSS মান সহ:
ks = [1, 2, 3, 4, 5 , 6 , 7 , 8, 9, 10]
plt.plot(ks, wcss)
একটি প্লট যখন একটি বাধা আছে x = 2
, লাইনে একটি নিম্ন বিন্দু, এবং একটি এমনকি কম যখন x = 3
. এটা আমাদের মনে করিয়ে দেয় যে লক্ষ্য করুন একটি কনুই এর আকৃতি. WCSS এর সাথে Ks প্লট করে, আমরা ব্যবহার করছি কনুই পদ্ধতি Ks সংখ্যা নির্বাচন করতে। এবং নির্বাচিত K হল সর্বনিম্ন কনুই বিন্দু, তাই, এটা হবে 3
পরিবর্তে 2
, আমাদের ক্ষেত্রে:
ks = [1, 2, 3, 4, 5 , 6 , 7 , 8, 9, 10]
plt.plot(ks, wcss);
plt.axvline(3, linestyle='--', color='r')
আমাদের ডেটা কেমন হবে তা দেখতে আমরা আবার K-Means ক্লাস্টার অ্যালগরিদম চালাতে পারি তিনটি গুচ্ছ:
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(points)
sns.scatterplot(x = points[:,0], y = points[:,1], hue=kmeans.labels_)
আমরা ইতিমধ্যে দুটি ক্লাস্টার নিয়ে খুশি ছিলাম, কিন্তু কনুই পদ্ধতি অনুসারে, তিনটি ক্লাস্টার আমাদের ডেটার জন্য আরও উপযুক্ত হবে। এই ক্ষেত্রে, আমাদের কাছে দুটির পরিবর্তে তিন ধরণের দোকান থাকবে। কনুই পদ্ধতি ব্যবহার করার আগে, আমরা দোকানের দক্ষিণ-পশ্চিম এবং উত্তর-পূর্ব ক্লাস্টার সম্পর্কে চিন্তা করেছি, এখন আমাদের কেন্দ্রে স্টোর রয়েছে। সম্ভবত এটি অন্য দোকান খোলার জন্য একটি ভাল অবস্থান হতে পারে কারণ এটির কাছাকাছি প্রতিযোগিতা কম হবে।
বিকল্প ক্লাস্টার গুণমান পরিমাপ
ক্লাস্টার মানের মূল্যায়ন করার সময় অন্যান্য ব্যবস্থাও ব্যবহার করা যেতে পারে:
- সিলুয়েট স্কোর - শুধুমাত্র ইন্ট্রা-ক্লাস্টার পয়েন্টগুলির মধ্যে দূরত্বই নয় বরং নিজেদের ক্লাস্টারগুলির মধ্যেও বিশ্লেষণ করে
- ক্লাস্টারের মধ্যে স্কোয়ারের সমষ্টি (BCSS) - মেট্রিক WCSS এর পরিপূরক
- স্কোয়ার ত্রুটির সমষ্টি (এসএসই)
- সর্বোচ্চ ব্যাসার্ধ - একটি বিন্দু থেকে তার সেন্ট্রোয়েডের বৃহত্তম দূরত্ব পরিমাপ করে
- গড় ব্যাসার্ধ - একটি বিন্দু থেকে তার কেন্দ্রবিন্দু পর্যন্ত বৃহত্তম দূরত্বের যোগফলকে ক্লাস্টারের সংখ্যা দিয়ে ভাগ করা হয়।
সমস্যাটির উপর নির্ভর করে তাদের প্রত্যেককে পরীক্ষা করা এবং জানার পরামর্শ দেওয়া হচ্ছে, কিছু বিকল্প সবচেয়ে বেশি ব্যবহৃত মেট্রিক্সের চেয়ে বেশি প্রযোজ্য হতে পারে (WCSS এবং সিলুয়েট স্কোর).
শেষ পর্যন্ত, অনেক ডেটা সায়েন্স অ্যালগরিদমের মতো, আমরা প্রতিটি ক্লাস্টারের মধ্যে বৈচিত্র্য কমাতে চাই এবং বিভিন্ন ক্লাস্টারের মধ্যে পার্থক্য সর্বাধিক করতে চাই। তাই আমরা আরো সংজ্ঞায়িত এবং বিভাজ্য ক্লাস্টার আছে.
অন্য ডেটাসেটে কে-মিনস প্রয়োগ করা হচ্ছে
আসুন আমরা অন্য ডেটাসেটে যা শিখেছি তা ব্যবহার করি। এই সময়, আমরা অনুরূপ ওয়াইন গ্রুপ খুঁজে বের করার চেষ্টা করবে.
বিঃদ্রঃ: আপনি ডেটাসেট ডাউনলোড করতে পারেন এখানে.
আমরা আমদানি করে শুরু করি pandas
পড়তে wine-clustering
CSV তে (কমা পৃথক করা মান) একটি মধ্যে ফাইল Dataframe
গঠন:
import pandas as pd
df = pd.read_csv('wine-clustering.csv')
এটি লোড করার পরে, এর সাথে ডেটার প্রথম পাঁচটি রেকর্ডে উঁকি দেওয়া যাক head()
পদ্ধতি:
df.head()
এর ফলে:
Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity Hue OD280 Proline
0 14.23 1.71 2.43 15.6 127 2.80 3.06 0.28 2.29 5.64 1.04 3.92 1065
1 13.20 1.78 2.14 11.2 100 2.65 2.76 0.26 1.28 4.38 1.05 3.40 1050
2 13.16 2.36 2.67 18.6 101 2.80 3.24 0.30 2.81 5.68 1.03 3.17 1185
3 14.37 1.95 2.50 16.8 113 3.85 3.49 0.24 2.18 7.80 0.86 3.45 1480
4 13.24 2.59 2.87 21.0 118 2.80 2.69 0.39 1.82 4.32 1.04 2.93 735
আমরা ওয়াইন উপস্থিত পদার্থ অনেক পরিমাপ আছে. এখানে, আমাদের শ্রেণীবদ্ধ কলামগুলিকে রূপান্তর করতে হবে না কারণ তাদের সবগুলি সংখ্যাসূচক। এখন, এর সাথে বর্ণনামূলক পরিসংখ্যান দেখুন describe()
পদ্ধতি:
df.describe().T
বর্ণনা টেবিল:
count mean std min 25% 50% 75% max
Alcohol 178.0 13.000618 0.811827 11.03 12.3625 13.050 13.6775 14.83
Malic_Acid 178.0 2.336348 1.117146 0.74 1.6025 1.865 3.0825 5.80
Ash 178.0 2.366517 0.274344 1.36 2.2100 2.360 2.5575 3.23
Ash_Alcanity 178.0 19.494944 3.339564 10.60 17.2000 19.500 21.5000 30.00
Magnesium 178.0 99.741573 14.282484 70.00 88.0000 98.000 107.0000 162.00
Total_Phenols 178.0 2.295112 0.625851 0.98 1.7425 2.355 2.8000 3.88
Flavanoids 178.0 2.029270 0.998859 0.34 1.2050 2.135 2.8750 5.08
Nonflavanoid_Phenols 178.0 0.361854 0.124453 0.13 0.2700 0.340 0.4375 0.66
Proanthocyanins 178.0 1.590899 0.572359 0.41 1.2500 1.555 1.9500 3.58
Color_Intensity 178.0 5.058090 2.318286 1.28 3.2200 4.690 6.2000 13.00
Hue 178.0 0.957449 0.228572 0.48 0.7825 0.965 1.1200 1.71
OD280 178.0 2.611685 0.709990 1.27 1.9375 2.780 3.1700 4.00
Proline 178.0 746.893258 314.907474 278.00 500.500 673.500 985.0000 1680.00
টেবিল দেখেই বোঝা যায় কিছু আছে তথ্যের পরিবর্তনশীলতা - কিছু কলামের জন্য যেমন Alchool
আরো আছে, এবং অন্যদের জন্য, যেমন Malic_Acid
, কম এখন আমরা কোন আছে কিনা তা পরীক্ষা করতে পারেন null
, বা NaN
আমাদের ডেটাসেটে মান:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 178 entries, 0 to 177
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Alcohol 178 non-null float64
1 Malic_Acid 178 non-null float64
2 Ash 178 non-null float64
3 Ash_Alcanity 178 non-null float64
4 Magnesium 178 non-null int64
5 Total_Phenols 178 non-null float64
6 Flavanoids 178 non-null float64
7 Nonflavanoid_Phenols 178 non-null float64
8 Proanthocyanins 178 non-null float64
9 Color_Intensity 178 non-null float64
10 Hue 178 non-null float64
11 OD280 178 non-null float64
12 Proline 178 non-null int64
dtypes: float64(11), int64(2)
memory usage: 18.2 KB
ডেটাসেটে খালি মান নেই বিবেচনা করে ডেটা ড্রপ বা ইনপুট করার দরকার নেই। আমরা একটি Seaborn ব্যবহার করতে পারেন pairplot()
ডাটা ডিস্ট্রিবিউশন দেখতে এবং ডেটাসেট কলামের জোড়া তৈরি করে কিনা তা পরীক্ষা করতে যা ক্লাস্টারিংয়ের জন্য আকর্ষণীয় হতে পারে:
sns.pairplot(df)
পেয়ারপ্লট দেখে, ক্লাস্টারিংয়ের উদ্দেশ্যে দুটি কলাম আশাব্যঞ্জক বলে মনে হচ্ছে - Alcohol
এবং OD280
(যা ওয়াইনগুলিতে প্রোটিনের ঘনত্ব নির্ধারণের জন্য একটি পদ্ধতি)। মনে হচ্ছে প্লটে 3টি স্বতন্ত্র ক্লাস্টার রয়েছে তাদের মধ্যে দুটিকে একত্রিত করে।
অন্যান্য কলাম রয়েছে যা পারস্পরিক সম্পর্ক বলে মনে হয়। এর মধ্যে উল্লেখযোগ্য হল Alcohol
এবং Total_Phenols
, এবং Alcohol
এবং Flavanoids
. তাদের দুর্দান্ত রৈখিক সম্পর্ক রয়েছে যা পেয়ারপ্লটে লক্ষ্য করা যায়।
যেহেতু আমাদের ফোকাস কে-মিনস এর সাথে ক্লাস্টার করা হচ্ছে, আসুন একজোড়া কলাম বেছে নিন, বলুন Alcohol
এবং OD280
, এবং এই ডেটাসেটের জন্য কনুই পদ্ধতি পরীক্ষা করুন।
বিঃদ্রঃ: ডেটাসেটের আরও কলাম ব্যবহার করার সময়, হয় 3 মাত্রায় প্লট করার বা ডেটা হ্রাস করার প্রয়োজন হবে প্রধান উপাদান (পিসিএ ব্যবহার). এটি একটি বৈধ, এবং আরও সাধারণ পদ্ধতি, তারা কতটা ব্যাখ্যা করে তার উপর ভিত্তি করে প্রধান উপাদানগুলি বেছে নেওয়া নিশ্চিত করুন এবং মনে রাখবেন যে ডেটা মাত্রা হ্রাস করার সময়, কিছু তথ্যের ক্ষতি হয় – তাই প্লটটি একটি আনুমানিক বাস্তব তথ্য, এটা আসলে কিভাবে হয় না.
আসুন আমরা যে পয়েন্টগুলিকে গ্রুপে ভাগ করতে চাই সেগুলিকে ঘনিষ্ঠভাবে দেখার জন্য এই দুটি কলামের অক্ষ হিসাবে সেট করা স্ক্যাটারপ্লটটি প্লট করি:
sns.scatterplot(data=df, x='OD280', y='Alcohol')
এখন আমরা আমাদের কলাম সংজ্ঞায়িত করতে পারি এবং ক্লাস্টারের সংখ্যা নির্ধারণ করতে কনুই পদ্ধতি ব্যবহার করতে পারি। আমরা এর সাথে অ্যালগরিদমও শুরু করব kmeans++
শুধু নিশ্চিত করার জন্য যে এটি আরও দ্রুত রূপান্তরিত হয়:
values = df[['OD280', 'Alcohol']]
wcss_wine = []
for i in range(1, 11):
kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
kmeans.fit(values)
wcss_wine.append(kmeans.inertia_)
আমরা WCSS গণনা করেছি, তাই আমরা ফলাফলগুলি প্লট করতে পারি:
clusters_wine = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
plt.plot(clusters_wine, wcss_wine)
plt.axvline(3, linestyle='--', color='r')
কনুই পদ্ধতি অনুসারে আমাদের এখানে 3 টি ক্লাস্টার থাকা উচিত। চূড়ান্ত ধাপের জন্য, আসুন আমাদের পয়েন্টগুলিকে 3 টি ক্লাস্টারে ক্লাস্টার করি এবং সেই ক্লাস্টারগুলিকে রঙ দ্বারা চিহ্নিত করি:
kmeans_wine = KMeans(n_clusters=3, random_state=42)
kmeans_wine.fit(values)
sns.scatterplot(x = values['OD280'], y = values['Alcohol'], hue=kmeans_wine.labels_)
আমরা ক্লাস্টার দেখতে পারি 0
, 1
, এবং 2
গ্রাফে আমাদের বিশ্লেষণের উপর ভিত্তি করে, গ্রুপ 0 উচ্চ প্রোটিন কন্টেন্ট এবং কম অ্যালকোহল সঙ্গে ওয়াইন আছে, গ্রুপ 1 উচ্চ অ্যালকোহল কন্টেন্ট এবং কম প্রোটিন সহ wines আছে, এবং গ্রুপ 2 এর ওয়াইনগুলিতে উচ্চ প্রোটিন এবং উচ্চ অ্যালকোহল উভয়ই রয়েছে।
এটি একটি অত্যন্ত আকর্ষণীয় ডেটাসেট এবং আমি আপনাকে স্বাভাবিককরণ এবং PCA-এর পরে ডেটা ক্লাস্টার করার মাধ্যমে বিশ্লেষণে আরও যেতে উৎসাহিত করি - এছাড়াও ফলাফলগুলি ব্যাখ্যা করে এবং নতুন সংযোগগুলি খুঁজে বের করে৷
উপসংহার
কে-মানে ক্লাস্টারিং ডেটা ক্লাস্টারিংয়ের জন্য একটি সহজ কিন্তু অত্যন্ত কার্যকর অ-সুপারভাইসড মেশিন লার্নিং অ্যালগরিদম। এটি ডেটা পয়েন্টগুলির মধ্যে ইউক্লিডীয় দূরত্বের উপর ভিত্তি করে ডেটা ক্লাস্টার করে। কে-মিনস ক্লাস্টারিং অ্যালগরিদম পাঠ্য নথি, ছবি, ভিডিও এবং আরও অনেক কিছু গ্রুপ করার জন্য অনেক ব্যবহার রয়েছে।