Подсчитывать точки данных для каждого кластера K-средних

#python #machine-learning #data-science #k-means

#python #машинное обучение #наука о данных #k-means

Вопрос:

У меня есть набор данных для вейвлет-данных банкнот о подлинных и поддельных банкнотах с 2 функциями, которые:

  1. Ось X: дисперсия изображения, преобразованного в вейвлет.
  2. Ось Y: асимметрия изображения, преобразованного в вейвлет.

Я использую этот набор данных K-means для идентификации 2 кластеров данных, которые в основном являются подлинными и поддельными банкнотами.

Теперь у меня есть 3 вопроса:

  1. Как я могу подсчитать точки данных каждого кластера?
  2. Как я могу установить цвет каждой точки данных на основе ее кластера?
  3. Как я узнаю без другой функции в данных, является ли точка данных подлинной или поддельной? Я знаю, что в наборе данных есть «класс», который показывает 1 и 2 для подлинных и подделанных, но могу ли я определить это без функции «класс»?

Мой код:

 import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.patches as patches

data = pd.read_csv('Banknote-authentication-dataset-all.csv')

V1 = data['V1']
V2 = data['V2']
bn_class = data['Class']


V1_min = np.min(V1)
V1_max = np.max(V1)

V2_min = np.min(V2)
V2_max = np.max(V2)

normed_V1 = (V1 - V1_min)/(V1_max - V1_min)
normed_V2 = (V2 - V2_min)/(V2_max - V2_min)

V1_mean = normed_V1.mean()
V2_mean = normed_V2.mean()

V1_std_dev = np.std(normed_V1)
V2_std_dev = np.std(normed_V2)

ellipse = patches.Ellipse([V1_mean, V2_mean], V1_std_dev*2, V2_std_dev*2, alpha=0.4)

V1_V2 = np.column_stack((normed_V1, normed_V2))

km_res = KMeans(n_clusters=2).fit(V1_V2)
clusters = km_res.cluster_centers_

plt.xlabel('Variance of Wavelet Transformed image')
plt.ylabel('Skewness of Wavelet Transformed image')
scatter = plt.scatter(normed_V1,normed_V2, s=10, c=bn_class, cmap='coolwarm')
#plt.scatter(V1_std_dev, V2_std_dev,s=400, Alpha=0.5)
plt.scatter(V1_mean, V2_mean, s=400, Alpha=0.8, c='lightblue')
plt.scatter(clusters[:,0], clusters[:,1],s=3000,c='orange', Alpha=0.8)
unique = list(set(bn_class))

plt.text(1.1, 0, 'Kmeans cluster centers', bbox=dict(facecolor='orange'))
plt.text(1.1, 0.11, 'Arithmetic Mean', bbox=dict(facecolor='lightblue'))
plt.text(1.1, 0.33, 'Class 1 - Genuine Notes',color='white', bbox=dict(facecolor='blue'))
plt.text(1.1, 0.22, 'Class 2 - Forged Notes', bbox=dict(facecolor='red'))

plt.savefig('figure.png',bbox_inches='tight')

plt.show()
 

Изображение приложения для лучшей наглядности

Код

введите описание изображения здесь

Комментарии:

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

2. @MZ Да, сделано, спасибо.

Ответ №1:

  1. Как подсчитать точки данных каждого кластера

Вы можете сделать это легко, используя fit_predict вместо fit или вызывая predict свои обучающие данные после их подгонки.

Вот рабочий пример:

 kM = KMeans(...).fit_predict(V1_V2)
labels = kM.labels_

clusterCount = np.bincount(labels)
 

clusterCount теперь будет храниться ваша информация о том, сколько точек находится в каждом кластере. Вы можете так же легко сделать это с fit помощью then predict , но это должно быть более эффективным:

 kM = KMeans(...).fit(V1_V2)
labels = kM.predict(V1_V2)

clusterCount = np.bincount(labels)
 
  1. Чтобы задать его цвет, используйте kM.labels_ или вывод kM.predict() в качестве индекса раскраски.
 labels = kM.predict(V1_V2)

plt.scatter(normed_V1, normed_V2, s=10, c=labels, cmap='coolwarm') # instead of c=bn_class
 
  1. Для новой точки данных обратите внимание, как KMeans, которые у вас есть, довольно хорошо разделяет большинство из двух классов. Эта разделимость означает, что вы действительно можете использовать свои кластеры KMeans в качестве предикторов. Просто используйте predict .
 predictedClass = KMeans.predict(newDataPoint)
 

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

Комментарии:

1. Спасибо. Что функция predict добавляет к модели?

2. @MahmoudTarief выбирает ближайший кластер