“Все, что может предложить цивилизация, является продуктом человеческого разума; мы не можем предсказать, чего мы можем достичь, когда этот интеллект будет усилен инструментами, которые может предоставить ИИ, но искоренение войн, болезней и бедности будет первым в списке любого. Успех в создании ИИ станет крупнейшим событием в истории человечества. К сожалению, он может оказаться и последним».

~Стивен Хокинг

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

Что такое кластеризация?

Допустим, вы наслаждаетесь походом в горы, вы наткнулись на растение, которое никогда раньше не видели. Вы оглядываетесь и замечаете еще несколько. Они не совсем идентичны, но достаточно похожи, чтобы вы знали, что они, скорее всего, принадлежат к одному и тому же виду. Вам может понадобиться ботаник, чтобы сказать вам, что это за вид, но вам, конечно, не нужен эксперт, чтобы идентифицировать группы похожих объектов. Это называется кластеризацией: это задача выявления похожих экземпляров и их распределения по кластерам, то есть группам похожих экземпляров. Как и в классификации, каждый экземпляр присваивается группе. Однако это неконтролируемая задача.

Где мы можем использовать кластеризацию?

Кластеризация используется в самых разных приложениях, в том числе:

  • Для сегментации клиентов: вы можете группировать своих клиентов на основе их покупок, действий на вашем веб-сайте и т. д. Это полезно, чтобы понять, кто ваши клиенты и что им нужно, чтобы вы могли адаптировать свои продукты и маркетинговые кампании для каждого сегмента. Например, это может быть полезно в рекомендательных системах, чтобы предлагать контент, который нравится другим пользователям в том же кластере.
  • Для анализа данных. При анализе нового набора данных часто бывает полезно сначала обнаружить кластеры похожих экземпляров, так как зачастую проще анализировать кластеры по отдельности.
  • В качестве метода уменьшения размерности: после кластеризации набора данных обычно можно измерить сходство каждого экземпляра с каждым кластером (сходство — это любая мера того, насколько хорошо экземпляр вписывается в кластер). Затем вектор признаков каждого экземпляра x можно заменить вектором сходства его кластера. Если есть k кластеров, то этот вектор k-мерный. Обычно он имеет гораздо меньшую размерность, чем исходный вектор признаков, но может сохранить достаточно информации для дальнейшей обработки.
  • Для обнаружения аномалий (также называемого обнаружением выбросов): любой экземпляр, который имеет низкое сходство со всеми кластерами, скорее всего, будет аномалией. Например, если вы группируете пользователей своего веб-сайта на основе их поведения, вы можете обнаружить пользователей с необычным поведением, например необычным количеством запросов в секунду и т. д. Обнаружение аномалий особенно полезно при обнаружении дефектов в производстве или для обнаружения мошенничества.
  • Для поисковых систем. Например, некоторые поисковые системы позволяют искать изображения, похожие на эталонное изображение. Чтобы построить такую ​​систему, вы должны сначала применить алгоритм кластеризации ко всем изображениям в вашей базе данных: похожие изображения окажутся в одном кластере. Затем, когда пользователь предоставляет эталонное изображение, все, что вам нужно сделать, это найти кластер этого изображения с помощью обученной модели кластеризации, а затем вы можете просто вернуть все изображения из этого кластера.
  • Сегментация изображения: объединяя пиксели в кластеры в соответствии с их цветом, а затем заменяя цвет каждого пикселя средним цветом его кластера, можно значительно уменьшить количество различных цветов в изображении. Этот метод используется во многих системах обнаружения и отслеживания объектов, поскольку он упрощает обнаружение контура каждого объекта. .

Кластеризация действительно зависит от контекста, и разные алгоритмы захватывают разные типы кластеров. Например, некоторые алгоритмы ищут экземпляры, сосредоточенные вокруг определенной точки, называемой центроидом. Другие ищут непрерывные области плотно упакованных экземпляров: эти кластеры могут принимать любую форму. Некоторые алгоритмы являются иерархическими и ищут кластеры кластеров. В этом блоге мы сосредоточимся на популярном алгоритме кластеризации под названием K-Means.

-Кластеризация с помощью kmeans.Алгоритм K-Means — это простой алгоритм, способный очень быстро и эффективно кластеризовать наборы данных, часто всего за несколько итераций.

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

Центроид конечного набора k точек, x1,x2,...,xk в Rn, выглядит следующим образом:

Теперь, когда мы определили центральную метрику, возникает вопрос: Какое отношение она имеет к кластеризации? Чтобы ответить на этот вопрос, мы должны сначала понять концепцию расстояния до центроида. Расстояние имеет множество определений:

  • Евклидово расстояние. Этот показатель расстояния рассчитывает расстояние в виде прямой линии между двумя точками или имеет следующую формулу:

  • Расстояние Чебышева: это расстояние эквивалентно максимальному расстоянию по любой из осей. Его также называют шахматным расстоянием, потому что оно дает минимальное количество ходов, которое необходимо королю, чтобы добраться из начальной точки в конечную. Его определяют по следующей формуле:

  • Манхэттенское расстояние. Это расстояние эквивалентно переходу из одной точки города в другую с единичными квадратами. Это расстояние типа L1 суммирует количество продвинутых единиц по горизонтали и количество единиц по вертикали. Его формула выглядит следующим образом:

– Какое расстояние лучше всего подходит для K-средних? В качестве показателя расстояния выбрано евклидово расстояние, которое легко вычислить и которое хорошо масштабируется для многих измерений.

У нас есть это правило обучения со следующим утверждением: «Выборка будет назначена группе, представленной ближайшим центроидом». Цель этого метода — минимизировать сумму квадратов расстояний от элементов кластера до фактического центра тяжести всех кластеров, содержащих образцы. Это также известно как минимизация инерции.

-Почему K-средние в основном используются для кластеризации?

  • Очень хорошо масштабируется (большинство вычислений можно выполнять параллельно)
  • Он был использован в очень большом диапазоне приложений

Несмотря на это, у этого алгоритма есть и недостатки:

  • Требует априорных знаний (количество возможных кластеров должно быть известно заранее)
  • Значения выбросов могут искажать значения центроидов, поскольку они имеют тот же вес, что и любая другая выборка.
  • Поскольку мы предполагаем, что фигура выпуклая и изотропная, она не очень хорошо работает с кластерами, не похожими на капли.

-Как же работает алгоритм?

Алгоритм Kmeans — это итерационный алгоритм, который делит группу из n наборов данных на k подгрупп /кластеров на основе сходства и их среднего расстояния от центра тяжести этой конкретной подгруппы/.

K, здесь заранее заданное количество кластеров, которые должны быть сформированы алгоритмом. Если K = 3, это означает, что количество кластеров, которые должны быть сформированы из набора данных, равно 3.

-Шаги алгоритма K означает:

Шаг 1: Выберите значение K, чтобы определить количество формируемых кластеров.

Шаг 2. Выберите случайные K точек, которые будут действовать как центроиды.(subfigure1)

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

Шаг 4: поместите новый центроид каждого кластера.(subfigure2)

Шаг 5. Повторите шаг 3, чтобы переназначить каждую точку данных новому ближайшему центроиду каждого кластера.(subfigure3)

Шаг 6: Если происходит какое-либо переназначение, перейдите к шагу 4, в противном случае перейдите к шагу 7.

Шаг 7: ЗАВЕРШЕНИЕ

-K-означает теоретическую реализацию кластеризации:2 шага:

  • Сгенерировать центры кластера: выполняется с помощью метода kmean() из библиотеки scipy: у этого метода есть 5 аргументов.

obs: список масштабированных наблюдений

k_or_guess: количество кластеров.

iter: количество итераций (по умолчанию = 20)

thres: threshold (по умолчанию = 1e-05): алгоритм прекращает работу, если изменение искажения с момента взаимодействия k-mean меньше или равно порогу.

check_finite: логическое значение, указывающее, нужно ли выполнять проверку данных на наличие бесконечных значений NaN (по умолчанию = True).

K-means() возвращает 2 аргумента:

cluster_center: известная как кодовая книга

искажение: сумма квадратов расстояний между точками данных и центрами кластеров.

  • Сгенерируйте метки кластера с помощью метода vq() из библиотеки scipy: он принимает 3 аргумента:

obs: стандартный список наблюдений.

code_book: первый вывод метода kmean().

check_finit: (необязательно).

Он возвращает 2 объекта:

cluster_labels: указатель кодовой книги.

искажение.

Обратите внимание, что kmean() возвращает одно значение искажения на основе общих данных, а vq() возвращает список искажений; по одному кадру на каждую точку данных.

Если в оба метода передается один и тот же список наблюдений: среднее значение списка искажений из vq() должно быть приблизительно равно значению искажения kmean().

-Как выбрать правильное количество кластеров? На самом деле не существует абсолютного метода нахождения правильного количества кластеров (k) в кластеризации k-средних, но мы можем построить график локтя, чтобы решить, какое значение k больше всего подходит для нашей кластеризации. График локтя представляет собой линейный график между центрами кластеров и искажением:

  1. Выполните кластеризацию K-средних для заданного набора данных для разных значений K (в диапазоне от 1 до 10).
  2. Для каждого значения K рассчитайте значение искажения.
  3. Строит график/кривую между значениями искажения и соответствующим количеством кластеров K.
  4. Острая точка изгиба или точка (выглядящая как локтевой сустав) участка, похожего на руку, будет считаться лучшим/оптимальным значением К.

Обратите внимание, что искажение имеет обратную зависимость от количества кластеров: искажение уменьшается с увеличением числа кластеров.

-Реализация кластеризации K-средних с помощью Python: Что, если теперь мы рассмотрим реальный случай, когда нам нужно найти доминирующие цвета в некоторых случайных изображениях, используя кластеризацию k-средних?

Все изображения реального мира состоят из пикселей, каждый пиксель представляет собой точку на изображении. Пиксель состоит из 3 значений: каждое значение представляет собой число от 0 до 255, представляющее количество красных, зеленых и синих компонентов. Чтобы найти доминирующие цвета, мы выполним кластеризацию k-средних с его компонентами RGB.

Мы выполним кластеризацию k-средних на следующем изображении:

Мы видим, что есть 3 доминирующих цвета: оранжевый, коричневый и черный.

Начнем с импорта необходимых нам библиотек:

# Import the kmeans and vq functions
from scipy.cluster.vq import kmeans, vq, whiten
import matplotlib.image as img
import matplotlib.pyplot as plt 
import seaborn as sns
import pandas as pd

Мы продолжаем преобразовывать изображение в матрицу, содержащую значения RGB для каждого пикселя:

image = img.imread('/content/drive/MyDrive/Data science project/red.png')
print(image.shape)
(1365, 2400, 4)

На выходе получается матрица M*N*3, где M и N — размеры изображения.

Затем мы извлекаем все значения RGB и сохраняем их в соответствующих списках:

r = []
g = []
b = []
for row in image:
    for temp_r, temp_g, temp_b, temp in row:
        r.append(temp_r)
        g.append(temp_g)
        b.append(temp_b)

После создания списка они сохраняются в кадре данных pandas и масштабируются для получения стандартизированных значений:

pixels = pd.DataFrame({'red':r,
                       'blue': b,
                       'green':g})
pixels.head()

# Scale wage and value
pixels['scaled_red'] = whiten(pixels['red'])
pixels['scaled_blue'] = whiten(pixels['blue'])
pixels['scaled_green'] = whiten(pixels['green'])
pixels.head()

Теперь нам нужно найти количество кластеров в k-средних, используя метод локтевого графика:

# Create a list of distortions from the kmeans function
for i in num_clusters:
    cluster_centers, distortion = kmeans(pixels[['scaled_red','scaled_blue','scaled_green']],i)
    distortions.append(distortion)
    
# Create a DataFrame with two lists - num_clusters, distortions
elbow_plot = pd.DataFrame({'num_clusters': num_clusters, 'distortions': distortions})
 
# Creat a line plot of num_clusters and distortions
sns.lineplot(x='num_clusters', y='distortions', data = elbow_plot)
plt.xticks(num_clusters)
plt.show()

Согласно графику локтя мы видим, что правильное количество кластеров равно 3.

Полученные центры кластеров представляют собой стандартизированные значения RGB:

Стандартизированное значение = фактическое значение / стандартное отклонение

Метод imshow() будет отображать цвета центров кластеров после выполнения кластеризации k-средних значений RGB. Чтобы отобразить доминирующие цвета, преобразуйте цвета центров кластеров в их необработанные значения, а затем преобразуйте их в диапазон от 0 до 1, используя следующую формулу: преобразованный_пиксель = стандартизированный_пиксель * стандартный_пиксель / 255

colors = []
 
# Get standard deviations of each color
r_std,g_std,b_std = pixels[['red', 'green', 'blue']].std()
 
for cluster_center in cluster_centers:
    red_scaled, green_scaled, blue_scaled = cluster_center
 
    # Convert each standardized value to scaled value
    colors.append((
    red_scaled * r_std, 
    green_scaled * g_std, 
    blue_scaled * b_std 
    ))
 
# Display colors of cluster centers
plt.imshow([colors])
plt.show()

Обратите внимание, что три цвета напоминают три, которые мы указали при визуальном осмотре.

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

Получайте удовольствие от обучения

Вы можете найти код Здесь.

Ссылки:

Практическое машинное обучение с помощью Scikit-Learn и TensorFlow.

Машинное обучение для разработчиков.

Кластеризация K-средних упрощена в Python.

Эта статья относится к разделу Data Insights: The Data Scientist Program, вы можете ознакомиться с ней прямо здесь.