Алгоритм K-средних обычно является наиболее известным и используемым методом кластеризации. Кластеризация — полезный инструмент в науке о данных. Это метод поиска структуры кластера в наборе данных, который характеризуется наибольшим сходством внутри одного кластера и наибольшим различием между разными кластерами. Иерархическая кластеризация была самым ранним методом кластеризации, используемым биологами и социологами, тогда как кластерный анализ стал ветвью статистического многомерного анализа. Это также неконтролируемый подход к машинному обучению. Со статистической точки зрения методы кластеризации обычно делятся на подходы, основанные на вероятностных моделях, и непараметрические подходы. Подходы, основанные на вероятностных моделях, следуют тому, что точки данных взяты из смешанной вероятностной модели, поэтому для кластеризации используется смешанный вероятностный подход.

В общем, секциональные методы предполагают, что набор данных может быть представлен конечными кластерными прототипами со своими целевыми функциями. Следовательно, определение несходства (или расстояния) между точкой и прототипом кластера имеет важное значение для методов разделения. Известно, что алгоритм k-средних является старейшим и наиболее популярным методом разбиения. Давайте посмотрим на один из наиболее часто используемых наборов данных «Ирис».

# Import KMeans
from sklearn.cluster import KMeans
# Create a KMeans instance with 3 clusters: model
model = KMeans(n_clusters=3)
# Fit model to points
model.fit(points)
# Determine the cluster labels of new_points: labels
labels = model.predict(new_points)
# Import pyplot
import matplotlib.pyplot as plt
# Assign the columns of new_points: xs and ys
xs = new_points[:,0]
ys = new_points[:,1]
# Make a scatter plot of xs and ys, using labels to define the colors
plt.scatter(xs,ys,c=labels,alpha=0.5)
# Assign the cluster centers: centroids
centroids = model.cluster_centers_
# Assign the columns of centroids: centroids_x, centroids_y
centroids_x = centroids[:,0]
centroids_y = centroids[:,1]
# Make a scatter plot of centroids_x and centroids_y
plt.scatter(centroids_x,centroids_y,marker='D',s=50)
plt.show()

Кластеризация выглядит великолепно, но мы не всегда знаем, является ли 3 кластера правильным выбором, и мы не знаем, как оценить качество кластеризации.

Кластеризация — это локализованный метод оптимизации, чувствительный к выбору начальной позиции из средней точки кластера. Таким образом, выбор начальной позиции из середины плохого кластера приведет к тому, что алгоритм кластеризации K-средних приведет к высоким ошибкам и плохим результатам кластера. Алгоритм K-средних имеет проблемы с определением наилучшего количества кластеров. Таким образом, метод Колено ищет наилучшее количество кластеров по методу К-средних. Основываясь на результатах, полученных в процессе определения наилучшего количества кластеров, метод локтя может дать одинаковое количество кластеров K на количестве различных данных. Результат определения наилучшего количества кластеров методом локтя будет значением по умолчанию для характеристического процесса. Давайте рассмотрим это подробнее, используя график инерции K-средних для образца зерен пшеницы.

ks = range(1, 6)
inertias = []
for k in ks:
    # Create a KMeans instance with k clusters: model
    model = KMeans(n_clusters=k)
    
    # Fit model to samples
    model.fit(samples)
    
    # Append the inertia to the list of inertias
    inertias.append(model.inertia_)
    
# Plot ks vs inertias
plt.plot(ks, inertias, '-o')
plt.xlabel('number of clusters, k')
plt.ylabel('inertia')
plt.xticks(ks)
plt.show()

Поскольку мы видели это на графике инерции, что 3 — это хорошее количество кластеров для зернистых данных. На самом деле образцы зерна происходят из смеси 3-х разных сортов зерна: «Кама», «Роза» и «Канадка». Мы можем сгруппировать образцы зерна в три кластера и сравнить кластеры с разновидностями зерна, используя метод перекрестных таблиц, который представляет собой двухмерную (или более) таблицу, в которой записано количество (частота) данных, которые имеют описанные конкретные характеристики. в ячейках таблицы. Таблицы перекрестных таблиц предоставляют обширную информацию о взаимосвязи между переменными.

# Create a KMeans model with 3 clusters: model
model = KMeans(n_clusters=3)
# Use fit_predict to fit model and obtain cluster labels: labels
labels = model.fit_predict(samples)
# Create a DataFrame with labels and varieties as columns: df
df = pd.DataFrame({'labels': labels, 'varieties': varieties})
# Create crosstab: ct
ct = pd.crosstab(df['labels'],df['varieties'])
# Display ct
print(ct)
varieties          
    labels         Canadian wheat  Kama wheat  Rosa wheat                                      
    0                       0           1          60
    1                      68           9           0
    2                       2          60          10

Перекрестная таблица показывает, что 3 сорта зерна действительно хорошо разделяются на 3 кластера. Но в зависимости от типа данных, с которыми вы работаете, кластеризация не всегда может быть такой хорошей. Нам необходимо изучить методы стандартизации, такие как стандартный масштабатор или нормализация, которые более подробно обсуждаются в этой статье.

В кластеризации K-средних метод выбирает начальные заранее определенные K центроидов кластера и вычисляет близости от каждой точки ко всем K центроидам. Когда каждый элемент данных назначается K членам кластера, данные перераспределяются в один из новых кластеров. Проблема заключается в том, что итерационный процесс остановится, если переназначение удовлетворяет критериям, заданным начальными точками. Различные начальные точки могут привести к различным разделам кластеризации. То есть алгоритм K-средних может найти только локальный оптимум, а не глобальный. Следовательно, этот метод страдает тем недостатком, что разные прогоны K-средних для одних и тех же входных данных могут давать разные решения. Иерархический метод K-средних направлен на использование метода K-средних для выбора K кластеров перед кластеризацией.

Методы иерархической кластеризации рекурсивно находят вложенные кластеры либо агломеративным, либо разделительным образом. Агломеративная кластеризация — это кластеризация, при которой каждая точка данных начинается в своем собственном кластере, а затем последовательно объединяет аналогичную пару кластеров, что приводит к иерархии. В качестве альтернативы разделительная кластеризация начинается со всех точек данных в одном кластере и многократно делит каждый кластер на более мелкие. После разделения или слияния их нельзя отменить, и, таким образом, перенастройка невозможна при иерархической кластеризации. Алгоритм агломерационной иерархической кластеризации обычно реализуется следующим образом:

Шаг 1: Каждое наблюдение считается начальным кластером.

Шаг 2: Вычисляются расстояния между кластерами.

Шаг 3: Два кластера с минимальным расстоянием объединяются и заменяются одним кластером. Затем матрица расстояний пересчитывается, чтобы отразить этот процесс слияния.

Шаг 4: Повторяйте шаги 2 и 3, пока не останется только один кластер, содержащий все наблюдения.

Давайте исследуем это дальше, используя наш образец зерна. Мы используем библиотеку scipy со связью и дендрограммой.

# Perform the necessary imports
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
# Calculate the linkage: mergings
mergings = linkage(samples,method='complete')
# Plot the dendrogram, using varieties as labels
dendrogram(mergings,
           labels=varieties,
           leaf_rotation=90,
           leaf_font_size=6,
)
plt.show()

Точно так же мы можем использовать ту же методологию с нормализованной функцией для изменения цен для разных компаний.

# Import normalize
from sklearn.preprocessing import normalize
# Normalize the movements: normalized_movements
normalized_movements = normalize(movements)
# Calculate the linkage: mergings
mergings = linkage(normalized_movements,method='complete')
# Plot the dendrogram
dendrogram(mergings,labels=companies,leaf_rotation =90,leaf_font_size=6)
plt.show()

Точно так же мы можем использовать scipy.cluster.hierarchy.fcluster для выравнивания дендрограммы, получая в результате отнесение точек исходных данных к отдельным кластерам. Другими словами, теперь используйте функцию fcluster() для извлечения меток кластеров для этой промежуточной кластеризации и сравните метки с разновидностями зерна, используя перекрестную таблицу.

# Perform the necessary imports
import pandas as pd
from scipy.cluster.hierarchy import fcluster
# Use fcluster to extract labels: labels
labels = fcluster(mergings,6,criterion='distance')
# Create a DataFrame with labels and varieties as columns: df
df = pd.DataFrame({'labels': labels, 'varieties': varieties})
# Create crosstab: ct
ct = pd.crosstab(df['labels'],df['varieties'])
# Display ct
print(ct)
varieties  
labels           Canadian wheat  Kama wheat  Rosa wheat                          
1                      14           3           0
2                       0           0          14
3                       0          11           0

t-SNE — это метод нелинейного уменьшения размерности, называемый t-распределенным стохастическим соседним встраиванием (t-SNE). t-SNE широко используется для расчетов машинного обучения в материаловедении и других многомерных данных. Это нелинейное преобразование, уменьшающее количество измерений до двух или трех, ни одно из которых не имеет физического смысла. Это не только позволяет повысить эффективность вычислений, но и визуализировать многомерные данные в низкоразмерном пространстве. Еще одна полезная функция t-SNE заключается в том, что он позволяет легко выполнять обратную проверку вручную, которую мы широко использовали для исследования интересных точек данных, а также выбросов. Однако следует быть осторожным при использовании t-SNE. Из-за его стохастической природы его результаты могут быть трудно интерпретировать. Давайте исследуем это дальше, используя наш образец зерна.

# Create a TSNE instance: model
model = TSNE(learning_rate=200)
# Apply fit_transform to samples: tsne_features
tsne_features = model.fit_transform(samples)
# Select the 0th feature: xs
xs = tsne_features[:,0]
# Select the 1st feature: ys
ys = tsne_features[:,1]
# Scatter plot, coloring by variety_numbers
plt.scatter(xs,ys,c=variety_numbers)
plt.show()

t-SNE обеспечивает отличную визуализацию, когда отдельные образцы могут быть помечены. Мы можем применить t-SNE к данным о ценах на акции компании. Точечная диаграмма результирующих функций t-SNE, помеченных названиями компаний, дает нам карту фондового рынка. Давайте рассмотрим нормализованные биржевые данные.

# Import TSNE
from sklearn.manifold import TSNE
# Create a TSNE instance: model
model = TSNE(learning_rate=50)
# Apply fit_transform to normalized_movements: tsne_features
tsne_features = model.fit_transform(normalized_movements)
# Select the 0th feature: xs
xs = tsne_features[:,0]
# Select the 1th feature: ys
ys = tsne_features[:,1]
# Scatter plot
plt.scatter(xs,ys,alpha=0.5)
# Annotate the points
for x, y, company in zip(xs, ys, companies):
    plt.annotate(company, (x, y), fontsize=5, alpha=0.75)
plt.show()

Таким образом, из этих примеров мы можем видеть, как мы можем использовать различные методы визуализации в кластеризации KMeans, чтобы получить хорошее представление о данных.

Источник: Datacamp.com, https://ieeexplore.ieee.org/abstract/document/9072123