(نقاط مرتب سازی برای شناسایی ساختار خوشه بندی) یک الگوریتم خوشه بندی مبتنی بر چگالی است که شبیه به DBSCAN (خوشه بندی فضایی مبتنی بر چگالی برنامه های کاربردی با نویز) است، اما می تواند خوشه هایی با چگالی ها و اشکال مختلف را استخراج کند. این برای شناسایی خوشه های چگالی مختلف در مجموعه داده های بزرگ و با ابعاد بالا مفید است.
ایده اصلی پشت OPTICS استخراج ساختار خوشه بندی یک مجموعه داده با شناسایی نقاط متصل به چگالی است. این الگوریتم یک نمایش مبتنی بر چگالی از داده ها را با ایجاد یک لیست مرتب از نقاط به نام طرح دسترسی ایجاد می کند. هر نقطه در لیست با فاصله دسترسی همراه است، که اندازه گیری میزان رسیدن به ان نقطه از نقاط دیگر در مجموعه داده است. نقاط با فاصله دسترسی مشابه احتمالا در همان خوشه قرار دارند.
📌 طرح دسترسی پذیری در OPTICS Clustering
هنگام استفاده از الگوریتم خوشه بندی OPTICS، یک ابزار مهم برای درک ساختار خوشه بندی داده های شما، طرح دسترسی است. طرح دسترسی یک لیست مرتب از نقاط است که در ان هر نقطه با فاصله دسترسی همراه است.
فاصله دسترسی اندازه گیری این است که چگونه به راحتی می توان یک نقطه را از نقاط دیگر در مجموعه داده ها به دست اورد.
نقاطی که نزدیک به هم هستند فاصله دسترسی کم خواهند داشت، در حالی که نقاطی که دور از هم هستند فاصله دسترسی بالایی خواهند داشت.
طرح دسترسی یک طرح دو مرحله ای است، با ترتیب نقاط پردازش شده توسط OPTICS در محور x و فاصله دسترسی در محور y.
نقاط متعلق به یک خوشه فاصله دسترسی کمی نسبت به نزدیکترین همسایه خود خواهند داشت و این خوشه ها به عنوان دره در طرح دسترسی نشان داده می شوند. هر چه دره عمیق تر باشد، خوشه متراکم تر است.
با بررسی طرح دسترسی، می توانید ساختار کلی داده های خود و خوشه های مختلف موجود در ان را درک کنید.
شما همچنین می توانید از طرح قابلیت دسترسی برای شناسایی حداکثر فاصله بین دو نقطه که هنوز متعلق به همان خوشه هستند استفاده کنید. این حداکثر فاصله را می توان برای تعیین حداقل تعداد نقاط مورد نیاز برای تشکیل یک خوشه، که یک پارامتر کلیدی در الگوریتم OPTICS است، استفاده کرد.
نمودار دسترسی همچنین می تواند برای تعیین ترتیب نقاط در مجموعه داده ها استفاده شود. نقاطی که نزدیک به هم هستند، فاصله دسترسی مشابهی خواهند داشت و بنابراین در طرح دسترسی با هم مرتب خواهند شد.
- خوشه بندی OPTICS یک الگوریتم خوشه بندی مبتنی بر چگالی است که می تواند خوشه هایی با چگالی و اشکال مختلف را در مجموعه داده های بزرگ و با ابعاد بالا استخراج کند.
- بر خلاف سایر تکنیک های خوشه بندی، خوشه بندی OPTICS نیاز به حداقل ورودی از کاربر دارد و از دو پارامتر استفاده می کند: اپسیلون (ε) و MinPts.
- خوشه بندی OPTICS دو اصطلاح را معرفی می کند: فاصله هسته و فاصله دسترسی، که ان را قادر می سازد خوشه هایی از چگالی ها و اشکال مختلف را اداره کند.
- این یک طرح دسترسی ایجاد می کند که تراکم و اتصال نقاط داده را نشان می دهد و تفسیر نتایج خوشه بندی را اسان تر می کند.
- فاصله هسته: این حداقل مقدار شعاع مورد نیاز برای طبقه بندی یک نقطه داده شده به عنوان یک نقطه هسته است. اگر نقطه داده شده یک نقطه اصلی نباشد، فاصله هسته ان تعریف نشده است.
- فاصله دسترسی: این با توجه به یک نقطه داده دیگر q (Let) تعریف شده است. فاصله دسترسی بین یک نقطه p و q حداکثر فاصله هسته p و فاصله اقلیدسی (یا برخی دیگر از متریک فاصله) بین p و q است. توجه داشته باشید که فاصله دسترسی تعریف نشده است اگر q یک نقطه اصلی نباشد.
📌 پارامتر های الگوریتم Optics
الگوریتم OPTICS دارای چندین پارامتر است که می تواند برای بهبود عملکرد ان تنظیم شود. این پارامترها شامل EPS، xi و minpts است. پارامتر eps شعاع همسایگی است که برای تعریف یک نقطه هسته استفاده می شود.
پارامتر xi برای تعیین شیب نمودار دسترسی استفاده می شود. پارامتر minpts حداقل تعداد نقاط مورد نیاز برای تشکیل یک خوشه است.
الگوریتم OPTICS پیچیدگی زمان اجرا O(n log n) را دارد و به حافظه O(n) نیاز دارد. این الگوریتم همچنین از یک ساختار داده پیشین برای سرعت بخشیدن به محاسبه فاصله دسترسی استفاده می کند.
ساختار داده های پیشین برای ذخیره سلف هر نقطه در مجموعه داده ها استفاده می شود. ساختار داده قبلی برای اصلاح فاصله دسترسی هر نقطه در مجموعه داده استفاده می شود.
📌درک نقاط اصلی و فاصله Reachability
در خوشه بندی OPTICS، یک نقطه داده به عنوان یک نقطه اصلی طبقه بندی می شود اگر حداقل تعداد نقاط داده دیگر در شعاع شعاع ان باشد. MinPtsepsilon
فاصله هسته یک نقطه داده حداقل شعاع مورد نیاز برای طبقه بندی ان به عنوان یک نقطه هسته است. اگر یک نقطه داده یک نقطه اصلی نباشد، فاصله هسته ان تعریف نشده است.
فاصله دسترسی یک نقطه داده با توجه به یک نقطه داده دیگر تعریف می شود. این کوچکترین فاصله از یک نقطه مرکزی است. اگر یک نقطه اصلی نباشد، فاصله دسترسی با توجه به تعریف نشده است.qqqqpq
فاصله دسترسی یک نقطه داده با توجه به نقطه داده دیگر به شرح زیر محاسبه می شود:pq
reachability_distance(p, q) = max(core_distance(q), distance(p, q))
در اینجا، فاصله اقلیدسی بین و است.distance(p, q)pq
به عبارت دیگر، فاصله دسترسی با توجه به حداکثر فاصله هسته و فاصله بین و است.pqqpq
فاصله دسترسی برای تعیین اتصال چگالی بین دو نقطه داده استفاده می شود. اگر فاصله دسترسی بین دو نقطه داده کمتر از ، باشد، انها متعلق به یک خوشه هستند.epsilon
📌نقش حداکثر اپسیلون در خوشه بندی اپتیکی
هنگام استفاده از الگوریتم خوشه بندی OPTICS، یکی از پارامترهایی که باید تنظیم کنید حداکثر مقدار اپسیلون است. این مقدار حداکثر فاصله بین دو نقطه را تعیین می کند تا بخشی از یک خوشه در نظر گرفته شوند.
به عبارت دیگر، اگر دو نقطه دورتر از حداکثر مقدار اپسیلون باشند، با هم خوشه بندی نخواهند شد.
- اگر حداکثر مقدار اپسیلون خیلی کوچک باشد، الگوریتم ممکن است قادر به خوشه بندی تمام نقاطی که به هم تعلق دارند نباشد، در نتیجه چندین خوشه کوچکتر به جای یک خوشه بزرگتر ایجاد می شود.
- از سوی دیگر، اگر حداکثر مقدار اپسیلون بیش از حد بزرگ باشد، الگوریتم ممکن است نقاطی را که در واقع مشابه نیستند، خوشه بندی کند و در نتیجه یک خوشه بزرگ که شامل حاشیه ها است.
📌نحوه تنظیم حداکثر مقدار اپسیلون مناسب
رای تعیین حداکثر مقدار اپسیلون بهینه برای مجموعه داده های خود، می توانید از طرح دسترسی تولید شده توسط الگوریتم OPTICS استفاده کنید.
نمودار قابلیت دسترسی فاصله بین هر نقطه و نزدیکترین همسایه ان را نشان می دهد که تراکم بالاتری دارد. با تجزیه و تحلیل طرح دسترسی، می توانید مناطقی را که چگالی تغییر می کند شناسایی کنید و حداکثر مقدار اپسیلون را انتخاب کنید که خوشه های مورد نظر را جذب می کند.
مهم است که توجه داشته باشید که حداکثر مقدار اپسیلون یک مقدار ثابت نیست و می تواند بسته به مجموعه داده ها متفاوت باشد. شما ممکن است نیاز به ازمایش با مقادیر مختلف برای پیدا کردن یکی از مطلوب برای مجموعه داده های خاص خود را.
علاوه بر این، حداکثر مقدار اپسیلون می تواند به عنوان یک پارامتر برای سرعت بخشیدن به زمان محاسبات استفاده شود. اگر حداکثر مقدار اپسیلون بزرگتری را تعیین کنید، الگوریتم پس از رسیدن به ان فاصله، گسترش خوشه ها را متوقف می کند، که می تواند تعداد محاسبات مورد نیاز را کاهش دهد.
📌الگوریتم OPTICS چگونه کار می کند
الگوریتم OPTICS با ایجاد یک طرح دسترسی کار می کند که یک طرح از فاصله دسترسی هر نقطه در مجموعه داده است. فاصله قابلیت دسترسی اندازه گیری فاصله بین یک نقطه و نزدیکترین همسایه ان است که چگالی بالاتری دارد.
طرح دسترسی برای شناسایی خوشه ها در مجموعه داده ها استفاده می شود.
برای ایجاد طرح دسترسی، الگوریتم OPTICS ابتدا نقاط موجود در مجموعه داده را بر اساس فاصله دسترسی انها سفارش می دهد. فرایند سفارش با شروع با یک نقطه تصادفی و پیدا کردن نزدیکترین همسایه انجام می شود.
سپس الگوریتم فاصله دسترسی بین دو نقطه را پیدا می کند و نقطه ای را با بالاترین فاصله دسترسی به لیست مرتب اضافه می کند. سپس این فرایند برای نقطه بعدی در لیست تکرار می شود تا زمانی که تمام نقاط سفارش داده شوند.
هنگامی که نقاط مرتب شده اند، الگوریتم یک طرح فاصله دسترسی ایجاد می کند. نمودار فاصله دسترسی یک طرح از فاصله دسترسی هر نقطه در مجموعه داده است. نمودار فاصله reachability برای شناسایی خوشه ها در مجموعه داده ها استفاده می شود.
📌مراحل پیاده سازی الگوریتم Optics :
تعریف یک پارامتر استانه چگالی، Eps، که حداقل چگالی خوشه ها را کنترل می کند.
برای هر نقطه در مجموعه داده، فاصله تا نزدیکترین همسایگان خود را محاسبه کنید.
با شروع از یک نقطه دلخواه، فاصله دسترسی هر نقطه در مجموعه داده را بر اساس چگالی همسایگان ان محاسبه کنید. نقاط را بر اساس فاصله دسترسی انها
سفارش دهید و طرح دسترسی را ایجاد کنید.
خوشه ها را از طرح دسترسی با گروه بندی نقاطی که نزدیک به یکدیگر هستند و فاصله دسترسی مشابهی دارند، استخراج کنید.
یکی از مزیت های اصلی OPTICS نسبت به DBSCAN این است که نیازی به تنظیم تعداد خوشه ها از قبل نیست، در عوض، ساختار خوشه بندی داده ها را استخراج می کند و طرح دسترسی را تولید می کند. این به کاربر اجازه می دهد تا انعطاف پذیری بیشتری در انتخاب تعداد خوشه ها داشته باشد، با برش طرح دسترسی در یک نقطه خاص.
همچنین، بر خلاف سایر الگوریتم های خوشه بندی مبتنی بر چگالی مانند DBSCAN، می تواند خوشه های چگالی و اشکال مختلف را اداره کند و می تواند ساختار سلسله مراتبی را شناسایی کند.
OPTICS در پایتون با استفاده از کلاس sklearn.cluster.OPTICS در کتابخانه scikit-learn اجرا می شود. چندین پارامتر از جمله استانه حداقل چگالی (Eps)، تعداد نزدیکترین همسایگان برای در نظر گرفتن (min_samples) و قطع فاصله دسترسی (xi) طول می کشد.
📌مزایا و محدودیت ها با OPTICS Clustering
یکی از مزایای اصلی خوشه بندی OPTICS این است که یک الگوریتم بدون پارامتر است، به این معنی که شما نیازی به مشخص کردن تعداد خوشه ها از قبل ندارید. این باعث می شود ان را یک تکنیک خوشه بندی بدون نظارت بزرگ برای مجموعه داده ها که در ان تعداد خوشه ها از قبل شناخته نشده است.
یکی دیگر از مزایای خوشه بندی OPTICS این است که می تواند مجموعه داده ها را با نویز و خروجی ها به طور موثر اداره کند. این می تواند نقاط اصلی و نقاط غیر هسته ای را شناسایی کند و انها را بر این اساس گروه بندی کند، که ان را یک الگوریتم خوشه بندی قوی می کند.
با این حال، یکی از محدودیت های خوشه بندی OPTICS این است که می تواند از نظر محاسباتی گران و کند برای مجموعه داده های بزرگ باشد. همچنین نیاز به حافظه بیشتری نسبت به DBSCAN دارد که می تواند برای مجموعه داده هایی با حافظه محدود مشکل باشد.
📌OPTICS v / s DBSCAN
- هزینه حافظه :
تکنیک خوشه بندی OPTICS نیاز به حافظه بیشتری دارد زیرا یک صف اولویت (Min Heap) را برای تعیین نقطه داده بعدی که نزدیک به نقطه ای است که در حال حاضر از نظر فاصله دسترسی پردازش می شود، حفظ می کند. همچنین به قدرت محاسباتی بیشتری نیاز دارد زیرا نزدیکترین نمایش داده های همسایه پیچیده تر از نمایش داده های شعاع در DBSCAN هستند.
- پارامترهای کمتر:
تکنیک خوشه بندی OPTICS نیازی به حفظ پارامتر اپسیلون ندارد و فقط در شبه کد بالا داده می شود تا زمان گرفته شده را کاهش دهد. این امر منجر به کاهش فرایند تحلیلی تنظیم پارامتر می شود.
این تکنیک داده های داده شده را به خوشه ها تفکیک نمی کند. این صرفا یک طرح فاصله Reachability را تولید می کند و بر اساس تفسیر برنامه نویس است که نقاط را بر این اساس خوشه بندی کند.
- دست زدن به تراکم های مختلف:
خوشه بندی DBSCAN می تواند برای رسیدگی به مجموعه داده ها با چگالی های مختلف تلاش کند، زیرا نیاز به یک مقدار واحد اپسیلون برای تعریف اندازه محله برای تمام نقاط دارد. در مقابل، OPTICS می تواند چگالی های مختلف را با استفاده از مفهوم فاصله دسترسی، که با چگالی محلی داده ها سازگار است، اداره کند. این بدان معنی است که OPTICS می تواند خوشه هایی با اندازه ها و اشکال مختلف را به طور موثرتری نسبت به DBSCAN در مجموعه داده هایی با چگالی های مختلف شناسایی کند.
- استخراج خوشه:
در حالی که هر دو OPTICS و DBSCAN می توانند خوشه ها را شناسایی کنند، OPTICS یک طرح فاصله دسترسی ایجاد می کند که می تواند برای استخراج خوشه ها در سطوح مختلف دانه بندی استفاده شود. این امکان را برای خوشه بندی انعطاف پذیر تر می دهد و می تواند خوشه هایی را که ممکن است با مقدار اپسیلون ثابت در DBSCAN اشکار نباشد، نشان دهد. با این حال، این نیز نیاز به تفسیر دستی و تصمیم گیری بیشتر در بخشی از برنامه نویس دارد.
- دست زدن به سر و صدا:
DBSCAN به صراحت بین نقاط اصلی، نقاط مرزی و نقاط نویز تمایز قائل می شود، در حالی که OPTICS به صراحت نقاط نویز را شناسایی نمی کند. در عوض، نقاط با فاصله دسترسی بالا را می توان به عنوان نقاط سر و صدا بالقوه در نظر گرفت. با این حال، این بدان معنی است که OPTICS ممکن است در شناسایی خوشه های کوچک که توسط نقاط نویز احاطه شده اند، کمتر موثر باشد، زیرا این خوشه ها ممکن است با نقاط نویز در طرح فاصله دسترسی ادغام شوند.
- پیچیدگی زمان اجرا:
پیچیدگی زمان اجرا OPTICS به طور کلی بالاتر از DBSCAN است، به دلیل استفاده از صف اولویت برای حفظ فاصله دسترسی. با این حال، تحقیقات اخیر بهینه سازی هایی را برای کاهش پیچیدگی محاسباتی OPTICS پیشنهاد کرده است و ان را برای مجموعه داده های بزرگ مقیاس پذیر تر می کند.
PythonExample
from sklearn.cluster import OPTICS
import numpy as np
# Generate sample data
np.random.seed(0)
X = np.random.randn(100, 2)
# Initialize the OPTICS clustering model
optics = OPTICS(min_samples=5, xi=0.05, min_cluster_size=0.05)
# Fit the model to the data
optics.fit(X)
# Get the cluster labels
labels = optics.labels_
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import gridspec
from sklearn.cluster import OPTICS, cluster_optics_dbscan
from sklearn.preprocessing import normalize, StandardScaler
# Changing the working location to the location of the data
cd fileLocation
X = pd.read_csv('Mall_Customers.csv')
# Dropping irrelevant columns
drop_features = ['CustomerID', 'Gender']
X = X.drop(drop_features, axis = 1)
# Handling the missing values if any
X.fillna(method ='ffill', inplace = True)
X.head()
# Scaling the data to bring all the attributes to a comparable level
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Normalizing the data so that the data
# approximately follows a Gaussian distribution
X_normalized = normalize(X_scaled)
# Converting the numpy array into a pandas DataFrame
X_normalized = pd.DataFrame(X_normalized)
# Renaming the columns
X_normalized.columns = X.columns
X_normalized.head()
# Building the OPTICS Clustering model
optics_model = OPTICS(min_samples = 10, xi = 0.05, min_cluster_size = 0.05)
# Training the model
optics_model.fit(X_normalized)
# Producing the labels according to the DBSCAN technique with eps = 0.5
labels1 = cluster_optics_dbscan(reachability = optics_model.reachability_,
core_distances = optics_model.core_distances_,
ordering = optics_model.ordering_, eps = 0.5)
# Producing the labels according to the DBSCAN technique with eps = 2.0
labels2 = cluster_optics_dbscan(reachability = optics_model.reachability_,
core_distances = optics_model.core_distances_,
ordering = optics_model.ordering_, eps = 2)
# Creating a numpy array with numbers at equal spaces till
# the specified range
space = np.arange(len(X_normalized))
# Storing the reachability distance of each point
reachability = optics_model.reachability_[optics_model.ordering_]
# Storing the cluster labels of each point
labels = optics_model.labels_[optics_model.ordering_]
print(labels)
# Defining the framework of the visualization
plt.figure(figsize =(10, 7))
G = gridspec.GridSpec(2, 3)
ax1 = plt.subplot(G[0, :])
ax2 = plt.subplot(G[1, 0])
ax3 = plt.subplot(G[1, 1])
ax4 = plt.subplot(G[1, 2])
# Plotting the Reachability-Distance Plot
colors = ['c.', 'b.', 'r.', 'y.', 'g.']
for Class, colour in zip(range(0, 5), colors):
Xk = space[labels == Class]
Rk = reachability[labels == Class]
ax1.plot(Xk, Rk, colour, alpha = 0.3)
ax1.plot(space[labels == -1], reachability[labels == -1], 'k.', alpha = 0.3)
ax1.plot(space, np.full_like(space, 2., dtype = float), 'k-', alpha = 0.5)
ax1.plot(space, np.full_like(space, 0.5, dtype = float), 'k-.', alpha = 0.5)
ax1.set_ylabel('Reachability Distance')
ax1.set_title('Reachability Plot')
# Plotting the OPTICS Clustering
colors = ['c.', 'b.', 'r.', 'y.', 'g.']
for Class, colour in zip(range(0, 5), colors):
Xk = X_normalized[optics_model.labels_ == Class]
ax2.plot(Xk.iloc[:, 0], Xk.iloc[:, 1], colour, alpha = 0.3)
ax2.plot(X_normalized.iloc[optics_model.labels_ == -1, 0],
X_normalized.iloc[optics_model.labels_ == -1, 1],
'k+', alpha = 0.1)
ax2.set_title('OPTICS Clustering')
# Plotting the DBSCAN Clustering with eps = 0.5
colors = ['c', 'b', 'r', 'y', 'g', 'greenyellow']
for Class, colour in zip(range(0, 6), colors):
Xk = X_normalized[labels1 == Class]
ax3.plot(Xk.iloc[:, 0], Xk.iloc[:, 1], colour, alpha = 0.3, marker ='.')
ax3.plot(X_normalized.iloc[labels1 == -1, 0],
X_normalized.iloc[labels1 == -1, 1],
'k+', alpha = 0.1)
ax3.set_title('DBSCAN clustering with eps = 0.5')
# Plotting the DBSCAN Clustering with eps = 2.0
colors = ['c.', 'y.', 'm.', 'g.']
for Class, colour in zip(range(0, 4), colors):
Xk = X_normalized.iloc[labels2 == Class]
ax4.plot(Xk.iloc[:, 0], Xk.iloc[:, 1], colour, alpha = 0.3)
ax4.plot(X_normalized.iloc[labels2 == -1, 0],
X_normalized.iloc[labels2 == -1, 1],
'k+', alpha = 0.1)
ax4.set_title('DBSCAN Clustering with eps = 2.0')
plt.tight_layout()
plt.show()
PythonExample 2
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import OPTICS, cluster_optics_dbscan
# Generate sample data
np.random.seed(0)
n_points_per_cluster = 250
C1 = [-5, -2] + 0.8 * np.random.randn(n_points_per_cluster, 2)
C2 = [4, -1] + 0.1 * np.random.randn(n_points_per_cluster, 2)
C3 = [1, -2] + 0.2 * np.random.randn(n_points_per_cluster, 2)
C4 = [-2, 3] + 0.3 * np.random.randn(n_points_per_cluster, 2)
C5 = [3, -2] + 1.6 * np.random.randn(n_points_per_cluster, 2)
C6 = [5, 6] + 2 * np.random.randn(n_points_per_cluster, 2)
X = np.vstack((C1, C2, C3, C4, C5, C6))
clust = OPTICS(min_samples=50, xi=0.05, min_cluster_size=0.05)
# Run the fit
clust.fit(X)
labels_050 = cluster_optics_dbscan(
reachability=clust.reachability_,
core_distances=clust.core_distances_,
ordering=clust.ordering_,
eps=0.5,
)
labels_200 = cluster_optics_dbscan(
reachability=clust.reachability_,
core_distances=clust.core_distances_,
ordering=clust.ordering_,
eps=2,
)
space = np.arange(len(X))
reachability = clust.reachability_[clust.ordering_]
labels = clust.labels_[clust.ordering_]
plt.figure(figsize=(10, 7))
G = gridspec.GridSpec(2, 3)
ax1 = plt.subplot(G[0, :])
ax2 = plt.subplot(G[1, 0])
ax3 = plt.subplot(G[1, 1])
ax4 = plt.subplot(G[1, 2])
# Reachability plot
colors = ["g.", "r.", "b.", "y.", "c."]
for klass, color in zip(range(0, 5), colors):
Xk = space[labels == klass]
Rk = reachability[labels == klass]
ax1.plot(Xk, Rk, color, alpha=0.3)
ax1.plot(space[labels == -1], reachability[labels == -1], "k.", alpha=0.3)
ax1.plot(space, np.full_like(space, 2.0, dtype=float), "k-", alpha=0.5)
ax1.plot(space, np.full_like(space, 0.5, dtype=float), "k-.", alpha=0.5)
ax1.set_ylabel("Reachability (epsilon distance)")
ax1.set_title("Reachability Plot")
# OPTICS
colors = ["g.", "r.", "b.", "y.", "c."]
for klass, color in zip(range(0, 5), colors):
Xk = X[clust.labels_ == klass]
ax2.plot(Xk[:, 0], Xk[:, 1], color, alpha=0.3)
ax2.plot(X[clust.labels_ == -1, 0], X[clust.labels_ == -1, 1], "k+", alpha=0.1)
ax2.set_title("Automatic Clustering\nOPTICS")
# DBSCAN at 0.5
colors = ["g.", "r.", "b.", "c."]
for klass, color in zip(range(0, 4), colors):
Xk = X[labels_050 == klass]
ax3.plot(Xk[:, 0], Xk[:, 1], color, alpha=0.3)
ax3.plot(X[labels_050 == -1, 0], X[labels_050 == -1, 1], "k+", alpha=0.1)
ax3.set_title("Clustering at 0.5 epsilon cut\nDBSCAN")
# DBSCAN at 2.
colors = ["g.", "m.", "y.", "c."]
for klass, color in zip(range(0, 4), colors):
Xk = X[labels_200 == klass]
ax4.plot(Xk[:, 0], Xk[:, 1], color, alpha=0.3)
ax4.plot(X[labels_200 == -1, 0], X[labels_200 == -1, 1], "k+", alpha=0.1)
ax4.set_title("Clustering at 2.0 epsilon cut\nDBSCAN")
plt.tight_layout()
plt.show()