Почему я получаю вложенные кластеры в kmeans, когда я использую нормализованные данные, тогда как я получаю непересекающиеся кластеры, когда я использую ненормализованные данные? - PullRequest
1 голос
/ 29 февраля 2020

В настоящее время я изучаю основы машинного обучения, предоставляемые IBM. После того, как учитель закончил построение модели, я заметил, что он не использует нормализованные данные, чтобы соответствовать модели, а скорее использует обычные данные, и в конце он получает хороший кластер и непересекающиеся кластеры. Но когда я попытался использовать нормализованные данные для обучения модели, я получил катастрофу и вложенные кластеры, как показывают код и изображение. Почему процесс нормализации привел к этому? Хотя всегда хорошо "как я знаю" использовать нормализацию в математических базовых алгоритмах.

код не использует нормализованные данные

import numpy as np
import matplotlib.pyplot as plt
%matplotlib  inline
from sklearn.cluster import KMeans
cust_df = pd.read_csv('D:\machine learning\Cust_Segmentation.csv')
cust_df.head()
df = cust_df.drop('Address', axis = 1)
X = df.values[:, 1:]
X = np.nan_to_num(X)
from sklearn.preprocessing import StandardScaler
norm_featur = StandardScaler().fit_transform(X)
clusterNum = 3
kmeans = KMeans(init = 'k-means++', n_clusters = clusterNum, n_init = 12)
kmeans.fit(X)
k_means_labels = kmeans.labels_
df['cluster'] = kmeans.labels_
k_means_cluster_centers = kmeans.cluster_centers_
area = np.pi * ( X[:, 1])**2  
plt.scatter(X[:, 0], X[:, 3], s=area, c=kmeans.labels_.astype(np.float), alpha=0.5)
plt.xlabel('Age', fontsize=18)
plt.ylabel('Income', fontsize=16)
plt.show()

КЛАСТЕРЫ С ИСПОЛЬЗОВАНИЕМ НОРМАЛИЗАЦИИ

код с использованием нормализованных данных

import numpy as np
import matplotlib.pyplot as plt
%matplotlib  inline
from sklearn.cluster import KMeans
cust_df = pd.read_csv('D:\machine learning\Cust_Segmentation.csv')
cust_df.head()
df = cust_df.drop('Address', axis = 1)
X = df.values[:, 1:]
X = np.nan_to_num(X)
from sklearn.preprocessing import StandardScaler
norm_feature = StandardScaler().fit_transform(X)
clusterNum = 3
kmeans = KMeans(init = 'k-means++', n_clusters = clusterNum, n_init = 12)
kmeans.fit(norm_feature)
k_means_labels = kmeans.labels_
df['cluster'] = kmeans.labels_
k_means_cluster_centers = kmeans.cluster_centers_
area = np.pi * ( norm_feature[:, 1])**2  
plt.scatter(norm_feature[:, 0], norm_feature[:, 3], s=area, c=kmeans.labels_.astype(np.float), 
alpha=0.5)
plt.xlabel('Age', fontsize=18)
plt.ylabel('Income', fontsize=16)
plt.show()

КЛАСТЕР ПОСЛЕ НОРМАЛИЗАЦИИ

1 Ответ

1 голос
/ 01 марта 2020

Доход и возраст находятся здесь в довольно разных масштабах. На вашем первом графике разница в доходах примерно в 100 примерно равна разнице в возрасте примерно в 10 лет. Но в k-означает, что разница в доходах считается в 10 раз больше. Вертикальная ось легко доминирует в кластеризации.

Это, вероятно, «неправильно», если только вы не уверены, что изменение 1 в доходе «такое же, как» изменение в 10 лет, для целей расчета из того, что похоже. Вот почему вы стандартизируете, что предполагает другое предположение: они одинаково важны.

Ваш второй сюжет не совсем имеет смысла; k-means не может создавать «перекрывающиеся» кластеры. Проблема в том, что вы нанесли только 2 из 4 (?) Измерений, на которых вы группировались. Вы не можете построить данные 4D, но я подозреваю, что если вы примените PCA к результату, чтобы сначала уменьшить его до двух измерений, и нанесите его на график, вы увидите отдельные кластеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...