K-среднее значение Python, центроиды расположены вне кластеров - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь выполнить кластеризацию смешанных данных с помощью алгоритма k-средних: chemical_1, chemical_2 - числовое, season - категориальное. Столбец season был преобразован в пустышки, чтобы использовать его в алгоритме K-средних.

Я добавил центры кластеров с plt.scatter(centers[:,0], centers[:,1], marker="x", color='r'), но он поместил их в неправильную позицию вне кластеров.
Как мне обращаться с kmeans.cluster_centers_, чтобы иметь возможность правильно их построить?

enter image description here

#Make a copy of DF
df_transformed = df

#Transform the 'season' to dummies
df_transformed = pd.get_dummies(df_transformed, columns=['season'])

#Standardize
columns = ['chemical_1', 'chemical_2', 'season_winter', 'season_spring', 'season_autumn', 'season_summer']
df_tr_std = stats.zscore(df_transformed[columns])

#Cluster the data
kmeans = KMeans(n_clusters=4).fit(df_tr_std)
labels = kmeans.labels_
centers = np.array(kmeans.cluster_centers_)

#Glue back to original data
df_transformed['clusters'] = labels

#Add the column into our list
columns.extend(['clusters'])

#Analyzing the clusters
print(df_transformed[columns].groupby(['clusters']).mean())

          chemical_1  chemical_2  season_winter  season_spring  season_autumn  \
clusters                                                                        
0           7.951500   10.600500              0              0              1   
1           8.119180    8.818852              1              0              0   
2           8.024423    8.009615              0              1              0   
3           7.939432    9.414773              0              0              0   

          season_summer  
clusters                 
0                     0  
1                     0  
2                     0  
3                     1

#Scatter plot of chemical_1 and chemical_2
sns.lmplot('chemical_1', 'chemical_2', 
           data=df_transformed,
           size = 10,
           fit_reg=False, 
           hue="clusters",  
           scatter_kws={"marker": "D", 
                        "s": 100}
          )
plt.scatter(centers[:,0], centers[:,1], marker="x", color='r')

plt.title('Clusters chemical_1 vs chemical_2')
plt.xlabel('chemical_1')
plt.ylabel('chemical_2')
plt.show

UPD: Я пытался использовать PCA для преобразования. Это правильный путь? Кроме того, я мог построить данные только с помощью matplotlib. Как правильно использовать морского рожка здесь?

pca = PCA(n_components=2, whiten=True).fit(df_tr_std)

#Cluster the data
kmeans = KMeans(n_clusters=4)
kmeans.fit(df_tr_std)
labels = kmeans.labels_
centers = pca.transform(kmeans.cluster_centers_)

plt.scatter(df_tr_std[:,0], df_tr_std[:,1])
plt.scatter(centers[:,0], centers[:,1], marker="x", color='r')

Теперь график рассеяния выглядит так:

1 Ответ

0 голосов
/ 02 мая 2018

Если вы кластеризуете z-показатели, результирующими центрами также будут zscores.

Очевидно, что Kmeans не может отобразить их обратно в вашу старую систему координат - вы должны сделать это сами.

Поскольку преобразование z-счета представляет собой простое линейное преобразование, воссоздать эту функцию и обратное преобразование просто.

...