Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебники 80197.pdf
Скачиваний:
3
Добавлен:
01.05.2022
Размер:
947.4 Кб
Скачать

до класса

можно выбрать расстояние до центра кластера

 

( )

 

 

в соот-

 

 

( )

 

ветствии с выбранной для классификации метрикой.

Центр

 

 

класса)

 

 

( ,

 

 

можно определить как среднее арифметическое по

точкам кластера

:

 

 

 

( ) = 1

.

 

 

 

 

 

 

 

 

(10)

Принадлежность к кластеру

 

определяется условием ближайшего цен-

тра кластера

 

) = min ( ,

 

)

 

 

 

 

 

 

 

 

 

( ,

( )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(11)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Другим простым способом определения расстояния от пробного элемента (образа) до класса является метод ближайшего соседа из кластера, т.е. находят

ближайший элемент из всех, и пробный элемент относят к его кластеру

 

( ,

) = min ( ,

)

 

 

 

 

.

(12)

 

 

 

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

5.АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ

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

Рассмотрим некоторые из основных алгоритмов классификации. A. Алгоритм k-групповых средних.

Этот алгоритм является итерационным( ) . В методе k-средних сначала слу-

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

7

Вариантом решения этой проблемы является многократный прогон про-

цедуры с тем, чтобы выбрать из полученных результатов наилучший, напри-

мер, с минимальной суммой дисперсий каждом из кластеров

 

= .

(13)

Рассмотренный нами алгоритм относится к семейству так называемых методов жесткой кластеризации, когда каждый образец из набора предназначен строго одному кластеру.

B.Алгоритмы мягкой (нечеткой) кластеризации.

В отличие от алгоритмов жесткой кластеризации, алгоритмы мягкой кластеризации (fuzzy clustering) назначают образец в той или иной степени нескольким кластерам. Степенью принадлежности можно управлять с помощью коэффициента нечеткости. Такой подход позволяет сформулировать алгоритм нечетких k-средних, или, иначе алгоритм c-средних.

C.Иерархическая кластеризация.

Среди алгоритмов иерархической кластеризации выделяют восходящие и нисходящие алгоритмы. В нисходящих алгоритмах вначале все объекты помещаются в один кластер. Затем он разбивается на все более мелкие кластеры. Восходящие алгоритмы в начале работы помещают каждый объект в отдельный кластер, а затем объединяют кластеры во все более крупные, пока все объекты выборки не будут содержаться в одном кластере. Таким образом, строится система вложенных разбиений. Результаты работы таких алгоритмов принято представлять в виде дерева – так называемой дендрограммы. Она показывает детализацию разбиения данных на все большее количество кластеров.

D.Самоорганизующиеся карты Кохонена.

Карты Кохонена дают простой и высокоэффективный метод кластеризации при заданном количестве кластеров. Сначала производится инициализация сети путем выбора случайных векторов в пространстве признаков, или выбора случайным образом k- векторов из набора данных. Далее случайным образом предъявляется один из векторов массива данных, и ближайший вектор сети (центр кластера) смещается в его сторону. Это смещение тем меньше, чем боле расстояние между вектором данных и центром кластера. Убывание смещения с расстоянием чаще всего выбирают в форме функции Гаусса. Далее процесс повторяется, а шаги постепенно уменьшаются. Полученную карту удобнее всего отображать на двумерной картине узлов.

E.Гравитационная кластеризация.

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

8

Ньютона. Движение под действием такой «силы» будет приводить к слипанию частиц и автоматической кластеризации данных.

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

6.ПРОГРАММА КЛАСТЕРИЗАЦИИ МЕТОДОМ

K-СРЕДНИХ [7,8]

Программа кластеризации методам k-средних состоит из трех шагов:

1.Инициализация.

2.Присвоение.

3.Обновление.

При работе потребуется использовать пакет pandas

https://benalexkeen.com/k-means-clustering-in-python/

П.1. Инициализация

____________________________________________________________________

import pandas as pd import numpy as np

import matplotlib.pyplot as plt #matplotlib in line

df = pd.DataFrame({

'x': [12, 20, 28, 18, 29, 33, 24, 45, 45, 52, 51, 52, 55, 53, 55, 61, 64, 69, 72], 'y': [39, 36, 30, 52, 54, 46, 55, 59, 63, 70, 66, 63, 58, 23, 14, 8, 19, 7, 24] })

np.random.seed(200) k = 3

# centroids[i] = [x, y] centroids = {

i+1: [np.random.randint(0, 80), np.random.randint(0, 80)] for i in range(k)

}

fig = plt.figure(figsize=(5, 5)) plt.scatter(df['x'], df['y'], color='k') colmap = {1: 'r', 2: 'g', 3: 'b'}

for i in centroids.keys():

9

plt.scatter(*centroids[i], color=colmap[i]) plt.xlim(0, 80)

plt.ylim(0, 80) plt.show()

Рис. 1. Исходные данные

П.2. Стадия присвоения центров кластеров и нахождения их элементов

______________________________________________________________

df = pd.DataFrame({

'x': [12, 20, 28, 18, 29, 33, 24, 45, 45, 52, 51, 52, 55, 53, 55, 61, 64, 69, 72], 'y': [39, 36, 30, 52, 54, 46, 55, 59, 63, 70, 66, 63, 58, 23, 14, 8, 19, 7, 24]

})

np.random.seed(200) k = 3

# centroids[i] = [x, y] centroids = {

i+1: [np.random.randint(0, 80), np.random.randint(0, 80)] for i in range(k)

}

fig = plt.figure(figsize=(5, 5)) plt.scatter(df['x'], df['y'], color='k') colmap = {1: 'r', 2: 'g', 3: 'b'}

for i in centroids.keys():

10

plt.scatter(*centroids[i], color=colmap[i]) plt.xlim(0, 80)

plt.ylim(0, 80) plt.show()

def assignment(df, centroids): for i in centroids.keys():

df['distance_from_{}'.format(i)] = ( np.sqrt(

(df['x'] - centroids[i][0]) ** 2 + (df['y'] - centroids[i][1]) ** 2

)

)

centroid_distance_cols = ['distance_from_{}'.format(i) for i in centroids.keys()]

df['closest'] = df.loc[:, centroid_distance_cols].idxmin(axis=1) df['closest'] = df['closest'].map(lambda x: int(x.lstrip('distance_from_'))) df['color'] = df['closest'].map(lambda x: colmap[x])

return df

df = assignment(df, centroids) print(df.head())

fig = plt.figure(figsize=(5, 5))

plt.scatter(df['x'], df['y'], color=df['color'], alpha=0.5, edgecolor='k') for i in centroids.keys():

plt.scatter(*centroids[i], color=colmap[i]) plt.xlim(0, 80)

plt.ylim(0, 80) plt.show()

__________________________________________________________

11

Рис. 2. Первичные центры кластеров

П.3. Стадия обновления кластеров

__________________________________________________________________

import copy

old_centroids = copy.deepcopy(centroids)

def update(k):

for i in centroids.keys():

centroids[i][0] = np.mean(df[df['closest'] == i]['x']) centroids[i][1] = np.mean(df[df['closest'] == i]['y'])

return k

centroids = update(centroids)

fig = plt.figure(figsize=(5, 5)) ax = plt.axes()

plt.scatter(df['x'], df['y'], color=df['color'], alpha=0.5, edgecolor='k') for i in centroids.keys():

plt.scatter(*centroids[i], color=colmap[i]) plt.xlim(0, 80)

plt.ylim(0, 80)

for i in old_centroids.keys(): old_x = old_centroids[i][0]

12

old_y = old_centroids[i][1]

dx = (centroids[i][0] - old_centroids[i][0]) * 0.75 dy = (centroids[i][1] - old_centroids[i][1]) * 0.75

ax.arrow(old_x, old_y, dx, dy, head_width=2, head_length=3, fc=colmap[i], ec=colmap[i])

plt.show()

import copy

old_centroids = copy.deepcopy(centroids)

def update(k):

for i in centroids.keys():

centroids[i][0] = np.mean(df[df['closest'] == i]['x']) centroids[i][1] = np.mean(df[df['closest'] == i]['y'])

return k

centroids = update(centroids)

fig = plt.figure(figsize=(5, 5)) ax = plt.axes()

plt.scatter(df['x'], df['y'], color=df['color'], alpha=0.5, edgecolor='k') for i in centroids.keys():

plt.scatter(*centroids[i], color=colmap[i]) plt.xlim(0, 80)

plt.ylim(0, 80)

for i in old_centroids.keys(): old_x = old_centroids[i][0] old_y = old_centroids[i][1]

dx = (centroids[i][0] - old_centroids[i][0]) * 0.75 dy = (centroids[i][1] - old_centroids[i][1]) * 0.75

ax.arrow(old_x, old_y, dx, dy, head_width=2, head_length=3, fc=colmap[i], ec=colmap[i])

plt.show()

____________________________________________________________________

13

Рис. 3. Обновленные центры кластеров

П.4. Повторение присвоения

________________________________________________________________

df = assignment(df, centroids)

# Печать результатов

fig = plt.figure(figsize=(5, 5))

plt.scatter(df['x'], df['y'], color=df['color'], alpha=0.5, edgecolor='k') for i in centroids.keys():

plt.scatter(*centroids[i], color=colmap[i]) plt.xlim(0, 80)

plt.ylim(0, 80) plt.show() while True:

closest_centroids = df['closest'].copy(deep=True) centroids = update(centroids)

df = assignment(df, centroids)

if closest_centroids.equals(df['closest']): break

fig = plt.figure(figsize=(5, 5))

plt.scatter(df['x'], df['y'], color=df['color'], alpha=0.5, edgecolor='k')

14

for i in centroids.keys(): plt.scatter(*centroids[i], color=colmap[i])

plt.xlim(0, 80) plt.ylim(0, 80) plt.show()

df = pd.DataFrame({

'x': [12, 20, 28, 18, 29, 33, 24, 45, 45, 52, 51, 52, 55, 53, 55, 61, 64, 69, 72], 'y': [39, 36, 30, 52, 54, 46, 55, 59, 63, 70, 66, 63, 58, 23, 14, 8, 19, 7, 24]

})

_______________________________________________________________

Рис. 4. Результаты кластеризации

Отчетливо видны три выделенных кластера и их центры.

Более компактный код можно получить, используя библиотеку scikitlearn. Далее приведен пример такого кода из [8].

___________________________________________________________________

#Author: Phil Roth <mr.phil.roth@gmail.com>

#License: BSD 3 clause

import numpy as np

import matplotlib.pyplot as plt

15

from sklearn.cluster import KMeans from sklearn.datasets import make_blobs

plt.figure(figsize=(12, 12))

n_samples = 1500 random_state = 170

X, y = make_blobs(n_samples=n_samples, random_state=random_state)

# Incorrect number of clusters

y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)

plt.subplot(221)

plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.title("Incorrect Number of Blobs")

# Anisotropically distributed data

transformation = [[0.60834549, -0.63667341], [-0.40887718, 0.85253229]] X_aniso = np.dot(X, transformation)

y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_aniso)

plt.subplot(222)

plt.scatter(X_aniso[:, 0], X_aniso[:, 1], c=y_pred) plt.title("Anisotropicly Distributed Blobs")

# Different variance

X_varied, y_varied = make_blobs(n_samples=n_samples, cluster_std=[1.0, 2.5, 0.5], random_state=random_state)

y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_varied)

plt.subplot(223)

plt.scatter(X_varied[:, 0], X_varied[:, 1], c=y_pred) plt.title("Unequal Variance")

# Unevenly sized blobs

X_filtered = np.vstack((X[y == 0][:500], X[y == 1][:100], X[y == 2][:10])) y_pred = KMeans(n_clusters=3,

random_state=random_state).fit_predict(X_filtered)

plt.subplot(224)

16

plt.scatter(X_filtered[:, 0], X_filtered[:, 1], c=y_pred) plt.title("Unevenly Sized Blobs")

plt.show()

____________________________________________________________________

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

Рис. 5. Результаты кластеризации для разных типов данных

17

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]