Алгоритм 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