AI с Python - обучение без учителя: кластеризация

Алгоритмы неконтролируемого машинного обучения не имеют руководителя, который мог бы дать какие-либо указания. Вот почему они тесно связаны с тем, что некоторые называют настоящим искусственным интеллектом.

При обучении без учителя не было бы правильного ответа и учителя для руководства. Алгоритмам необходимо обнаруживать интересную закономерность в данных для обучения.

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

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

Например, на следующей диаграмме показаны похожие данные в разных кластерах -

Алгоритмы кластеризации данных

Ниже приведены несколько общих алгоритмов кластеризации данных.

Алгоритм K-средних

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

Step 1 - Нам нужно указать желаемое количество K подгрупп.

Step 2- Зафиксируйте количество кластеров и случайным образом назначьте каждую точку данных кластеру. Или, другими словами, нам нужно классифицировать наши данные по количеству кластеров.

На этом этапе следует вычислить центроиды кластера.

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

Следующий код поможет реализовать алгоритм кластеризации K-средних в Python. Мы собираемся использовать модуль Scikit-learn.

Импортируем необходимые пакеты -

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans

Следующая строка кода поможет в создании двумерного набора данных, содержащего четыре капли, с помощью make_blob от sklearn.dataset пакет.

from sklearn.datasets.samples_generator import make_blobs

X, y_true = make_blobs(n_samples = 500, centers = 4,
            cluster_std = 0.40, random_state = 0)

Мы можем визуализировать набор данных, используя следующий код -

plt.scatter(X[:, 0], X[:, 1], s = 50);
plt.show()

Здесь мы инициализируем kmeans как алгоритм KMeans с обязательным параметром количества кластеров (n_clusters).

kmeans = KMeans(n_clusters = 4)

Нам нужно обучить модель K-средних с входными данными.

kmeans.fit(X)
y_kmeans = kmeans.predict(X)
plt.scatter(X[:, 0], X[:, 1], c = y_kmeans, s = 50, cmap = 'viridis')

centers = kmeans.cluster_centers_

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

plt.scatter(centers[:, 0], centers[:, 1], c = 'black', s = 200, alpha = 0.5);
plt.show()

Алгоритм среднего сдвига

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

  • Прежде всего, нам нужно начать с точек данных, назначенных собственному кластеру.

  • Теперь он вычисляет центроиды и обновляет местоположение новых центроидов.

  • Повторяя этот процесс, мы приближаемся к пику кластера, то есть к области более высокой плотности.

  • Этот алгоритм останавливается на этапе, когда центроиды больше не перемещаются.

С помощью следующего кода мы реализуем алгоритм кластеризации среднего сдвига в Python. Мы собираемся использовать модуль Scikit-learn.

Импортируем необходимые пакеты -

import numpy as np
from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")

Следующий код поможет создать двумерный набор данных, содержащий четыре больших двоичных объекта, с помощью make_blob от sklearn.dataset пакет.

from sklearn.datasets.samples_generator import make_blobs

Мы можем визуализировать набор данных с помощью следующего кода

centers = [[2,2],[4,5],[3,10]]
X, _ = make_blobs(n_samples = 500, centers = centers, cluster_std = 1)
plt.scatter(X[:,0],X[:,1])
plt.show()

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

ms = MeanShift()
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_

Следующий код напечатает центры кластеров и ожидаемое количество кластеров в соответствии с входными данными -

print(cluster_centers)
n_clusters_ = len(np.unique(labels))
print("Estimated clusters:", n_clusters_)
[[ 3.23005036 3.84771893]
[ 3.02057451 9.88928991]]
Estimated clusters: 2

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

colors = 10*['r.','g.','b.','c.','k.','y.','m.']
   for i in range(len(X)):
   plt.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 10)
plt.scatter(cluster_centers[:,0],cluster_centers[:,1],
   marker = "x",color = 'k', s = 150, linewidths = 5, zorder = 10)
plt.show()

Измерение эффективности кластеризации

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

Анализ силуэта

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

Анализ силуэта

Оценка имеет диапазон [-1, 1]. Ниже приводится анализ этой оценки -

  • Score of +1 - Оценка около +1 указывает на то, что образец находится далеко от соседнего кластера.

  • Score of 0 - Оценка 0 указывает, что выборка находится на границе принятия решения между двумя соседними кластерами или очень близко к ней.

  • Score of -1 - Отрицательный результат указывает на то, что образцы были отнесены к неправильным кластерам.

Расчет показателя силуэта

В этом разделе мы узнаем, как рассчитать оценку силуэта.

Оценка силуэта может быть рассчитана с помощью следующей формулы -

$$ силуэт оценка = \ frac {\ left (pq \ right)} {max \ left (p, q \ right)} $$

Здесь - среднее расстояние до точек в ближайшем кластере, частью которого не является точка данных. И - среднее расстояние внутри кластера до всех точек в собственном кластере.

Чтобы найти оптимальное количество кластеров, нам нужно снова запустить алгоритм кластеризации, импортировав metrics модуль из sklearnпакет. В следующем примере мы запустим алгоритм кластеризации K-средних, чтобы найти оптимальное количество кластеров:

Импортируйте необходимые пакеты, как показано -

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans

С помощью следующего кода мы сгенерируем двумерный набор данных, содержащий четыре больших двоичных объекта, используя make_blob от sklearn.dataset пакет.

from sklearn.datasets.samples_generator import make_blobs

X, y_true = make_blobs(n_samples = 500, centers = 4, cluster_std = 0.40, random_state = 0)

Инициализируйте переменные, как показано -

scores = []
values = np.arange(2, 10)

Нам нужно перебрать модель K-средних по всем значениям, а также обучить ее входным данным.

for num_clusters in values:
kmeans = KMeans(init = 'k-means++', n_clusters = num_clusters, n_init = 10)
kmeans.fit(X)

Теперь оцените оценку силуэта для текущей модели кластеризации, используя метрику евклидова расстояния -

score = metrics.silhouette_score(X, kmeans.labels_,
metric = 'euclidean', sample_size = len(X))

Следующая строка кода поможет отобразить количество кластеров, а также оценку Silhouette.

print("\nNumber of clusters =", num_clusters)
print("Silhouette score =", score)
scores.append(score)

Вы получите следующий вывод -

Number of clusters = 9
Silhouette score = 0.340391138371

num_clusters = np.argmax(scores) + values[0]
print('\nOptimal number of clusters =', num_clusters)

Теперь результат для оптимального количества кластеров будет следующим:

Optimal number of clusters = 2

Поиск ближайших соседей

Если мы хотим создать рекомендательные системы, такие как рекомендательные системы для фильмов, нам необходимо понимать концепцию поиска ближайших соседей. Это потому, что рекомендательная система использует концепцию ближайших соседей.

В concept of finding nearest neighborsможно определить как процесс поиска ближайшей точки к входной точке из данного набора данных. Основное использование этого алгоритма KNN) K-ближайших соседей) заключается в создании систем классификации, которые классифицируют точку данных по близости точки входных данных к различным классам.

Приведенный ниже код Python помогает найти K-ближайших соседей данного набора данных -

Импортируйте необходимые пакеты, как показано ниже. Здесь мы используемNearestNeighbors модуль из sklearn пакет

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import NearestNeighbors

Давайте теперь определим входные данные -

A = np.array([[3.1, 2.3], [2.3, 4.2], [3.9, 3.5], [3.7, 6.4], [4.8, 1.9], 
             [8.3, 3.1], [5.2, 7.5], [4.8, 4.7], [3.5, 5.1], [4.4, 2.9],])

Теперь нам нужно определить ближайших соседей -

k = 3

Нам также нужно предоставить тестовые данные, по которым должны быть найдены ближайшие соседи -

test_data = [3.3, 2.9]

Следующий код может визуализировать и отображать определенные нами входные данные:

plt.figure()
plt.title('Input data')
plt.scatter(A[:,0], A[:,1], marker = 'o', s = 100, color = 'black')

Теперь нам нужно построить K ближайшего соседа. Объект тоже нужно обучить

knn_model = NearestNeighbors(n_neighbors = k, algorithm = 'auto').fit(X)
distances, indices = knn_model.kneighbors([test_data])

Теперь мы можем вывести K ближайших соседей следующим образом

print("\nK Nearest Neighbors:")
for rank, index in enumerate(indices[0][:k], start = 1):
   print(str(rank) + " is", A[index])

Мы можем визуализировать ближайших соседей вместе с точкой тестовых данных

plt.figure()
plt.title('Nearest neighbors')
plt.scatter(A[:, 0], X[:, 1], marker = 'o', s = 100, color = 'k')
plt.scatter(A[indices][0][:][:, 0], A[indices][0][:][:, 1],
   marker = 'o', s = 250, color = 'k', facecolors = 'none')
plt.scatter(test_data[0], test_data[1],
   marker = 'x', s = 100, color = 'k')
plt.show()

Выход

K Nearest Neighbors

1 is [ 3.1 2.3]
2 is [ 3.9 3.5]
3 is [ 4.4 2.9]

Классификатор K-ближайших соседей

Классификатор K-ближайших соседей (KNN) - это модель классификации, которая использует алгоритм ближайших соседей для классификации заданной точки данных. Мы реализовали алгоритм KNN в предыдущем разделе, теперь мы собираемся построить классификатор KNN, используя этот алгоритм.

Понятие классификатора KNN

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

Example

Мы создаем классификатор KNN для распознавания цифр. Для этого мы будем использовать набор данных MNIST. Мы напишем этот код в Jupyter Notebook.

Импортируйте необходимые пакеты, как показано ниже.

Здесь мы используем KNeighborsClassifier модуль из sklearn.neighbors пакет -

from sklearn.datasets import *
import pandas as pd
%matplotlib inline
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
import numpy as np

Следующий код отобразит изображение цифры, чтобы проверить, какое изображение мы должны протестировать.

def Image_display(i):
   plt.imshow(digit['images'][i],cmap = 'Greys_r')
   plt.show()

Теперь нам нужно загрузить набор данных MNIST. На самом деле всего 1797 изображений, но мы используем первые 1600 изображений в качестве обучающей выборки, а оставшиеся 197 оставим для тестирования.

digit = load_digits()
digit_d = pd.DataFrame(digit['data'][0:1600])

Теперь при отображении изображений мы можем увидеть результат следующим образом:

Image_display(0)

Image_display (0)

Изображение 0 отображается следующим образом -

Image_display (9)

Изображение 9 отображается следующим образом -

digit.keys ()

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

train_x = digit['data'][:1600]
train_y = digit['target'][:1600]
KNN = KNeighborsClassifier(20)
KNN.fit(train_x,train_y)

Следующий вывод создаст конструктор классификатора ближайшего соседа K -

KNeighborsClassifier(algorithm = 'auto', leaf_size = 30, metric = 'minkowski',
   metric_params = None, n_jobs = 1, n_neighbors = 20, p = 2,
   weights = 'uniform')

Нам нужно создать тестовую выборку, указав любое произвольное число больше 1600, которые были обучающими выборками.

test = np.array(digit['data'][1725])
test1 = test.reshape(1,-1)
Image_display(1725)

Image_display (6)

Изображение 6 отображается следующим образом -

Теперь мы будем прогнозировать тестовые данные следующим образом -

KNN.predict(test1)

Приведенный выше код сгенерирует следующий вывод -

array([6])

Теперь рассмотрим следующее -

digit['target_names']

Приведенный выше код сгенерирует следующий вывод -

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])