Sklearn.KMeans(): Получить метки центроида класса и ссылку на набор данных

115
14

Sci-Kit изучает уменьшение размерности Kmeans и PCA

У меня есть набор данных, 2M строк по 7 столбцов, с различными измерениями потребления энергии на дому с датой для каждого измерения.


    Дата
    Global_active_power,
    Global_reactive_power,
    Напряжение,
    Global_intensity,
    Sub_metering_1,
    Sub_metering_2,
    Sub_metering_3

Я поместил свой набор данных в фреймворк pandas, выбрав все столбцы, но столбец даты, а затем выполнил разделение перекрестной проверки.


import pandas as pd
from sklearn.cross_validation import train_test_split

data = pd.read_csv('household_power_consumption.txt', delimiter=';')
power_consumption = data.iloc[0:, 2:9].dropna()
pc_toarray = power_consumption.values
hpc_fit, hpc_fit1 = train_test_split(pc_toarray, train_size=.01)
power_consumption.head()


power table


Я использую классификацию K-сред, за которой следует уменьшение размерности PCA для отображения.


from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA

hpc = PCA(n_components=2).fit_transform(hpc_fit)
k_means = KMeans()
k_means.fit(hpc)

x_min, x_max = hpc[:, 0].min() - 5, hpc[:, 0].max() - 1
y_min, y_max = hpc[:, 1].min(), hpc[:, 1].max() + 5
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02))
Z = k_means.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.figure(1)
plt.clf()
plt.imshow(Z, interpolation='nearest',
extent=(xx.min(), xx.max(), yy.min(), yy.max()),
cmap=plt.cm.Paired,
aspect='auto', origin='lower')

plt.plot(hpc[:, 0], hpc[:, 1], 'k.', markersize=4)
centroids = k_means.cluster_centers_
inert = k_means.inertia_
plt.scatter(centroids[:, 0], centroids[:, 1],
marker='x', s=169, linewidths=3,
color='w', zorder=8)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()


PCA output


Теперь я хотел бы узнать, какие строки попали под данный класс, затем какие даты попадали под данный класс.


    Есть ли способ связать точки на графике с индексом в моем
    набор данных после PCA?
    Какой-то метод, о котором я не знаю?
    Или мой подход принципиально испорчен?
    Любые рекомендации?

Я новичок в этом поле и пытаюсь прочитать много кода, это компиляция нескольких примеров, которые я видел документально.


Моя цель - классифицировать данные, а затем получать даты, которые относятся к классу.


Спасибо

спросил(а) 2021-01-28T01:47:39+03:00 2 месяца, 2 недели назад
1
Решение
122

KMeans(). предсказать (X) .. docs here

Предскажите ближайший кластер, каждый образец которого принадлежит X.


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


Parameters: (New data to predict)

X : {array-like, sparse matrix}, shape = [n_samples, n_features]

Returns: (Index of the cluster each sample belongs to)

labels : array, shape [n_samples,]


Проблема я с представленным вами кодом заключается в использовании


train_test_split()

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

Вот пример:


import pandas as pd
import numpy as np
from sklearn.cluster import KMeans

#read data into pandas dataframe
df = pd.read_csv('household_power_consumption.txt', delimiter=';')


Raw Dataset head


#convert merge date and time colums and convert to datetime objects
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
df.set_index(pd.DatetimeIndex(df['Datetime'],inplace=True))
df.drop(['Date','Time'], axis=1, inplace=True)

#put last column first
cols = df.columns.tolist()
cols = cols[-1:] + cols[:-1]
df = df[cols]
df = df.dropna()


preprocessed dates


#convert dataframe to data array and removes date column not to be processed, 
sliced = df.iloc[0:, 1:8].dropna()
hpc = sliced.values

k_means = KMeans()
k_means.fit(hpc)

# array of indexes corresponding to classes around centroids, in the order of your dataset
classified_data = k_means.labels_

#copy dataframe (may be memory intensive but just for illustration)
df_processed = df.copy()
df_processed['Cluster Class'] = pd.Series(classified_data, index=df_processed.index)


Finished

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

ответил(а) 2021-01-28T01:47:39+03:00 2 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема