K-均值不导致肘部形状

我正在尝试仅使用有关客户端的变量在this link中可用的数据集中使用k均值。问题是8个变量中有7个是分类变量,因此我在它们上使用了一个热编码器。

要使用弯头法选择理想的群集数,我已经对2至22个群集运行了KMeans并绘制了惯性值。但是形状并不像肘部,更像是一条直线。

我做错什么了吗?

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

bank = pd.read_csv('bank-additional-full.csv',sep=';') #available at https://archive.ics.uci.edu/ml/datasets/Bank+Marketing# 

# 1. selecting only informations about the client
cli_vars = ['age','job','marital','education','default','housing','loan']
bank_cli = bank[cli_vars].copy()

#2. applying one hot encoder to categorical variables
X = bank_cli[['job','loan']]
le = preprocessing.LabelEncoder()
X_2 = X.apply(le.fit_transform)
X_2.values
enc = preprocessing.OneHotEncoder()
enc.fit(X_2)

one_hot_labels = enc.transform(X_2).toarray()
one_hot_labels.shape #(41188,33)

#3. concatenating numeric and categorical variables
X = np.concatenate((bank_cli.values[:,0].reshape((41188,1)),one_hot_labels),axis = 1)
X.shape

X = X.astype(float)
X_fit = StandardScaler().fit_transform(X)

X_fit

#4. function to calculate k-means for 2 to 22 clusters
def calcular_cotovelo(data):
    wcss = []
    for i in range(2,23):
        kmeans = KMeans(init = 'k-means++',n_init= 12,n_clusters = i)
        kmeans.fit(data)
        wcss.append(kmeans.inertia_)
    return wcss

cotovelo = calcular_cotovelo(X_fit)

#5. plot to see the elbow to select the ideal number of clusters
plt.plot(cotovelo)
plt.show()

这是选择簇的惯性图。它不是肘形,而且值很高。

K-均值不导致肘部形状

sy_exorcist 回答:K-均值不导致肘部形状

K均值不适用于分类数据。您应该寻找结合了k模式和k均值并能够混合数字和分类数据的k原型。

k-prototypes is available in Python的实现。

但是,如果仅考虑数字变量,则可以看到具有k均值准则的弯头:

k-means on numerical data only

要了解为什么看不到任何弯头(数值和分类数据上均具有k均值),可以查看每个聚类的点数。您可以观察到,每次增加聚类的数量,就会形成一个新的聚类,而在上一步中只有几个点位于一个大聚类中,因此该标准仅比上一步少了一些。>

本文链接:https://www.f2er.com/3170007.html

大家都在问