Материал: Кластеризация данных. методические указания к выполнению практических работ для студентов направления 09.04.03 «Прикладная информатика». Головинский П.А., Шаталова А.О

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Источник: https://studfile.net/preview/16569520/