Добавил:
darkwarius13@gmail.com Рад если помог :). Можешь на почту спасибо сказать Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб 2 / Лб2

.doc
Скачиваний:
4
Добавлен:
27.06.2021
Размер:
253.95 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ

ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ РАДІОЕЛЕКТРОНІКИ

Кафедра СТ

Звіт

про виконання лабораторної роботи № 2

з дисципліни Інтелектуальна обробка даних в розподілених інформаційних середовищах

на тему “ Аналіз методів на основі самонавчання. Кластеризація даних”

Виконав:

ст. гр. СПРм-19-1

Мизніков Р.І.

Перевірила:

Перова І. Г.

Харків 2020

АНАЛИЗ МЕТОДОВ НА ОСНОВЕ САМООБУЧЕНИЯ. КЛАСТЕРИЗАЦИЯ ДАННЫХ

Цель работы: получение навыков работы с методами кластеризации данных.

Ход работы:

1. Загрузить в DataFrame результаты 1-й лабораторной работы.

import numpy as np

import math

import copy as copy

import pandas as pd

import matplotlib.pyplot as plt

from sklearn.preprocessing import StandardScaler

from sklearn.cluster import KMeans

from sklearn import metrics

from sklearn.decomposition import PCA

from seaborn import scatterplot as scatter

from sklearn.manifold import TSNE

# Check if value is nan

def isNa(value):

if isinstance(value, int) or isinstance(value, float):

if math.isnan(value) and value != 0:

return True

return False

# Drop maxNaPercents percents of nan values in DataFrame

def dropNaRowByPercent (df, maxNaPercents):

for y, colObject in df.iteritems():

countOfNa = 0;

countOfRows = len(colObject);

for key in colObject:

if isNa(key):

countOfNa += 1

percentNaInRow = (countOfNa / countOfRows) * 100;

if percentNaInRow > maxNaPercents:

#print('deleting', colObject.name)

df = df.drop(colObject.name, axis=1)

return df

# Generate value instead nan

def generateValue(naPosX, naPosY, rowCount):

distances = []

for x, naFreeRow in df_dropNa.iterrows():

res = 0.0000000000001 #divide zero

for y, value in df_res.iloc[naPosX].iteritems():

if (isNa(value) != True) and (isinstance(value, int) or isinstance(value, float)):

res += abs(naFreeRow[y] - value)

distances.append(res/rowCount)

print(distances)

inverseDistancesSum = 0

for distance in distances:

inverseDistancesSum += 1/distance

affiliationLevels = []

for distance in distances:

affiliationLevels.append((1/distance)/inverseDistancesSum)

naValue = 0

iterator = 0

for x, value in df_dropNa[naPosY].iteritems():

naValue += value * affiliationLevels[iterator]

iterator += 1

return naValue

2. Разделить данные и диагноз с использованием метода .loc () и .values (). Провести нормирование или стандартизации данных с использованием метода StandardScaler () или MinMaxScaler () из библиотеки sklearn.

features = resultData.columns[1:].values.tolist()

x = resultData.loc[:, features].values

y = resultData.loc[:,['Діагноз']].values

from sklearn.preprocessing import StandardScaler

x = StandardScaler().fit_transform(x)

3. Провести кластеризацию даных с помощью метода Kmeans. Оценить качество кластеризации с использованием методов библиотеки klearn metrics.classification_report() и metrics.confusion_matrix() для трёх диагнозов одновременно.

mainData = resultData.loc[:].drop(columns=['№иб']).drop(columns=['Діагноз']).values

diagnoses = resultData.loc[:,['Діагноз']].replace('ХОЗЛ', 2).replace('БА', 1).replace('Пневмонія', 0).values

x_stan = StandardScaler().fit_transform(mainData)

kmeans = KMeans(n_clusters = 3, init = 'k-means++', random_state = 42)

y_kmeans = kmeans.fit_predict(x_stan)

print(y_kmeans)

expected = diagnoses

predicted = y_kmeans

print(metrics.classification_report(expected, predicted))

print(metrics.confusion_matrix(expected, predicted))

Рисунок 1 — метрики результатов кластеризации методом Kmeans

4. Провести визуализацию даных при помощи метода PCA() на двух радом расположенных рисунках: левый — даные, размеченные согласно значения диагноза; правый — данные, размеченные согласно работе метода Kmeans.

pca = PCA(n_components=2)

pca_diagnosis = pca.fit_transform(x_stan)

principalDf = pd.DataFrame(data = pca_diagnosis [:, 0:2], columns = ['principal component 1', 'principal component 2'])

pcaDF = pd.concat([principalDf, pd.DataFrame(data = diagnoses)], axis=1)

centers = kmeans.cluster_centers_

f, axes = plt.subplots(1, 2, figsize=(15,7))

scatter(pcaDF.loc[:, 'principal component 1'], pcaDF.loc[:, 'principal component 2'], ax=axes[0], hue=diagnoses[:,0])

scatter(pcaDF.loc[:, 'principal component 1'], pcaDF.loc[:, 'principal component 2'], ax=axes[1], hue=y_kmeans)

scatter(centers[:,0], centers[:,1], ax=axes[1], marker='s',s=200)

plt.show()

Рисунок 2 — Результат визуализации PCA по диагнозу(слева) и по результатам KMeans(справа)

5. Провести визуализацию даных при помози метода TSNE() на двух расположенных рядом рисунках: левый — даные, размеченные согласно значения диагноза; правый — данные, размеченные согласно работе метода Kmeans. Подобрать значения параметров метода TSNE() для лучшей визуализации. Сделать выводы.

#TSNE diagnose + kmeans

#%%

tsne = TSNE (n_components = 2, perplexity = 18, n_iter=1000, random_state = 43, learning_rate = 100)

x_2D = tsne.fit_transform(x_stan)

tsneDf = pd.DataFrame(data = x_2D, columns = ['dim 1', 'dim 2'])

final_tsneDf = pd.concat([tsneDf, pd.DataFrame(data = diagnoses)], axis = 1)

f, axes = plt.subplots(1, 2, figsize=(15,7))

scatter(final_tsneDf.loc[:, 'dim 1'], final_tsneDf.loc[:, 'dim 2'], ax=axes[0], hue=diagnoses[:,0])

scatter(final_tsneDf.loc[:,'dim 1'], final_tsneDf.loc[:, 'dim 2'], ax=axes[1], hue=y_kmeans)

scatter(centers[:,0], centers[:,1], ax=axes[1], marker="s",s=200)

plt.show()

Рисунок 3 — Результат визуализации TSNE по диагнозу(слева) и по результатам KMeans(справа)

6. Провести кластеризацию даных при помощи метода DBSCAN(). Повторить шаги 4-5 для результатов работы DBSCAN().

#PCA diagnose + DBSCAN

#%%

from sklearn.cluster import DBSCAN

dbscan = DBSCAN(eps=9, min_samples=3)

dbscan.fit(x_stan)

f, axes = plt.subplots(1, 2, figsize=(15,7))

scatter(pcaDF.loc[:, 'principal component 1'], pcaDF.loc[:, 'principal component 2'], ax=axes[0], hue=diagnoses[:,0])

scatter(pcaDF.loc[:, 'principal component 1'], pcaDF.loc[:, 'principal component 2'], ax=axes[1], hue=dbscan.labels_)

plt.title("PCA DBSCAN")

plt.show()

Рисунок 4 — Результат визуализации PCA по диагнозу(слева) и по результатам DBSCAN(справа)

#TSNE diagnose + DBSCAN

#%%

tsne = TSNE (n_components = 2, perplexity = 18, n_iter=1000, random_state = 43, learning_rate = 100)

x_2D = tsne.fit_transform(x_stan)

tsneDf = pd.DataFrame(data = x_2D, columns = ['dim 1', 'dim 2'])

final_tsneDf = pd.concat([tsneDf, pd.DataFrame(data = diagnoses)], axis = 1)

f, axes = plt.subplots(1, 2, figsize=(15,7))

scatter(final_tsneDf.loc[:, 'dim 1'], final_tsneDf.loc[:, 'dim 2'], ax=axes[0], hue=diagnoses[:,0])

scatter(final_tsneDf.loc[:,'dim 1'], final_tsneDf.loc[:, 'dim 2'], ax=axes[1], hue=dbscan.labels_)

plt.show()

plt.show()

Рисунок 5Результат визуализации TSNE по диагнозу(слева) и по результатам DBSCAN(справа)

7. Провести оценку работы методов кластеризации с использованием adjusted_rand_score() , adjusted_mutual_info_score() , homogeneity_score() , completeness_score(), v_measure_score(), silhouette_score().

predicted = dbscan.labels_

print(metrics.adjusted_rand_score(expected[:,0], predicted))

print(metrics.adjusted_mutual_info_score(expected[:,0], predicted))

print(metrics.homogeneity_score(expected[:,0], predicted))

print(metrics.completeness_score(expected[:,0], predicted))

print(metrics.v_measure_score(expected[:,0], predicted))

print(metrics.silhouette_score(x,expected[:,0]))

Рисунок 6 – Результаты работы методов кластеризации

Выводы: сравнивая методы визуализации многомерных данных (РСА, TSNE), можно отметить, что РСА был более показательным, так с помощью него можно было увидеть группы данных, объединённых в кластер. Метод кластеризации KMeans показал лучше себя, чем DBSCAN при работе с данными, если сравнивать алгоритмы кластеризации на данном наборе данных. И хоть KMeans был более показательным, нельзя говорить что он лучше во всех случаях, нужно учитывать что DBSCAN не предназначен для работы с данными которые имеют пропуски. Можно отметить что оба алгоритма можно использовать для первичного анализа данных.

Если внимательно изучить результаты подсчёта метрик(рис.6), то можно утверждать, что данная выборка плохо потдаётся кластеризации в принципе: калстеры накладываются друг на друга, изначально данные не полные и самих данных мало.

Соседние файлы в папке Лаб 2