Упорядочивание точек для определения структуры кластера (OPTICS)) — это метод кластеризации на основе плотности, который позволяет разбивать данные на группы со схожими характеристиками (кластеры).

Он устраняет один из основных недостатков DBSCAN. Проблема обнаружения значимых кластеров в данных различной плотности.

При кластеризации на основе плотности кластеры определяются как плотные области точек данных, разделенные областями с низкой плотностью.

Он добавляет еще два термина к концепции кластеризации DBSCAN. Они есть:

  1. Расстояние до ядра: это минимальное значение радиуса, необходимое для классификации данной точки как точки ядра. если данная точка не является центральной точкой, то ее базовое расстояние не определено.

2. Расстояние досягаемости: оно определяется по отношению к другой точке данных «q». Расстояние досягаемости между точками p и q. Обратите внимание, что расстояние достижимости не определено, если 'q' не является основной точкой.

Несколько преимуществ:

· Кластеризация OPTICS не требует заранее определенного количества кластеров.

· Грозди могут быть любой формы, в том числе и несферической.

· Возможность идентифицировать выбросы (данные о шуме)

Недостатки:

· Это не удается, если между кластерами нет перепадов плотности.

· Он также чувствителен к параметрам, определяющим плотность (радиус и минимальное количество точек), и для правильной настройки параметров требуется знание предметной области.

Теперь давайте разберемся с частью кодирования.

Сначала мы загрузим наш набор данных и выполним несколько шагов предварительной обработки данных, таких как масштабирование.

#OPTICS Clustering
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
X = pd.read_csv('Mall_Customers.csv')
#Dropping irrelevant columns
drop_features = ['CustomerID', 'Genre']
X = X.drop(drop_features, axis = 1)
#Handling the missing values if any
X.fillna(method ='ffill', inplace = True)
X.head()
#Pre-processing of data
#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()

Теперь мы построим модель, используя min_samples = 10, xi = 0,05, min_cluster_size = 0,05

#Building the OPTICS Clustering model
optics_model = OPTICS(min_samples = 10, xi = 0.05, min_cluster_size = 0.05)
'''xi:float, between 0 and 1, optional (default=0.05)
Determines the minimum steepness on the reachability plot that constitutes a cluster boundary.
For example, an upwards point in the reachability plot is defined by the ratio from one point
to its successor being at most 1-xi. Used only when cluster_method='xi'.
'''
#Training the model
optics_model.fit(X_normalized)

Вот и все... наша модель OPTICS готова... Мы можем распечатать метки кластера, используя optics_model.labels_.

Теперь мы сделаем еще один шаг, сравнив производительность OPTICS и DBSCAN, чтобы убедиться, что DBSCAN не имеет кластеризации при различной плотности.

#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_]
#Visualizing the results
#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()

Далее у нас есть еще один интересный и продвинутый метод кластеризации, специально используемый для исследования данных и визуализации многомерных данных, который называется T-SNE.

Если вы хотите узнать больше о продвинутых типах кластеризации, следуйте моей другой статье Кластеризация от А до Я.

Некоторые из моих альтернативных сайтов в Интернете: Facebook, Instagram, Udemy, Blogger, Issuu и другие.

Также доступно на Quora @ https://www.quora.com/profile/Rupak-Bob-Roy

Хорошего дня.