多用户网站管理系统,天津百度推广代理商,单位网站开发,做调查挣钱的网站在这篇文章中#xff0c;我们将讨论如何选择最好的k#xff08;聚类数#xff09;的k-Means聚类算法。
肘部法则简介
任何无监督算法的基本步骤是确定数据可以被聚类到的聚类的最佳数量。因为我们在无监督学习中没有任何预定义数量的聚类。我们倾向于使用一些可以帮助我们…在这篇文章中我们将讨论如何选择最好的k聚类数的k-Means聚类算法。
肘部法则简介
任何无监督算法的基本步骤是确定数据可以被聚类到的聚类的最佳数量。因为我们在无监督学习中没有任何预定义数量的聚类。我们倾向于使用一些可以帮助我们决定最佳聚类数的方法。 在K-Means聚类的情况下我们使用肘部法则来定义最佳的聚类数。
什么是K-Means聚类中肘部法则
如我们所知在k-means聚类算法中我们随机初始化k个聚类并且我们迭代地调整这k个聚类直到这些k-质心处于平衡状态。然而在初始化这些集群之前我们要做的主要事情是确定我们必须使用多少个集群。
对于确定K簇的数目我们使用肘部法则。 肘部法则是一种用于确定在k均值聚类算法中使用的质心数k的技术。 在这种方法中为了确定k值我们连续迭代k1到kn这里n是我们根据要求选择的超参数。对于k的每个值我们计算簇内平方和WCSS值。 WCSS -每个样本到簇内中心点的距离偏差之和。 现在为了确定最佳的聚类数k我们绘制了k与它们的WCSS值的关系图。令人惊讶的是该图看起来像一个肘部我们将在后面看到。此外当k1时WCSS具有最高值但随着k值的增加WCSS值开始减小。我们从图开始看起来像直线的地方选择k值。
使用Sklearn实现
我们将看到如何在4个步骤中实现肘部法则。首先我们将创建随机数据集点然后我们将在此数据集上应用k均值并计算1到4之间的k的wcss值。
步骤1导入所需的库
from sklearn.cluster import KMeans
from sklearn import metrics
from scipy.spatial.distance import cdist
import numpy as np
import matplotlib.pyplot as plt步骤2创建和可视化数据
我们将创建一个随机数组并将其分布可视化
# Creating the data
x1 np.array([3, 1, 1, 2, 1, 6, 6, 6, 5, 6,\7, 8, 9, 8, 9, 9, 8, 4, 4, 5, 4])
x2 np.array([5, 4, 5, 6, 5, 8, 6, 7, 6, 7, \1, 2, 1, 2, 3, 2, 3, 9, 10, 9, 10])
X np.array(list(zip(x1, x2))).reshape(len(x1), 2)# Visualizing the data
plt.plot()
plt.xlim([0, 10])
plt.ylim([0, 10])
plt.title(Dataset)
plt.scatter(x1, x2)
plt.show()输出 从上面的可视化中我们可以看到集群的最佳数量应该在3左右。但是仅仅可视化数据并不能总是给予正确的答案。 Distortion 1/n * Σ(distance(point, centroid)^2)定义一个Distortion 通常使用欧几里得距离度量。
Inertia它是样本到其最近聚类中心的平方距离之和。 Inertia Σ(distance(point, centroid)^2)我们将k的值从1迭代到n并计算每个k值的Distortion给定范围内每个k值的Inertia。
步骤3构建聚类模型并计算Distortion和Inertia的值
distortions []
inertias []
mapping1 {}
mapping2 {}
K range(1, 10)for k in K:# Building and fitting the modelkmeanModel KMeans(n_clustersk).fit(X)kmeanModel.fit(X)distortions.append(sum(np.min(cdist(X, kmeanModel.cluster_centers_,euclidean), axis1)) / X.shape[0])inertias.append(kmeanModel.inertia_)mapping1[k] sum(np.min(cdist(X, kmeanModel.cluster_centers_,euclidean), axis1)) / X.shape[0]mapping2[k] kmeanModel.inertia_
步骤4列表和可视化结果
a使用不同的Distortion值
for key, val in mapping1.items():print(f{key} : {val})
输出
1 : 3.625551331197001
2 : 2.0318238533112596
3 : 1.2423303391744152
4 : 0.8367738708386461
5 : 0.736979754424859
6 : 0.6898254810112422
7 : 0.6020311621770951
8 : 0.5234596363982826
9 : 0.4587221418509788接下来我们将绘制k与WCSS的关系图
plt.plot(K, distortions, bx-)
plt.xlabel(Values of K)
plt.ylabel(Distortion)
plt.title(The Elbow Method using Distortion)
plt.show()b使用不同的Inertia
for key, val in mapping2.items():print(f{key} : {val})输出
1 : 312.95238095238096
2 : 108.07142857142856
3 : 39.51746031746031
4 : 17.978571428571428
5 : 14.445238095238096
6 : 11.416666666666668
7 : 9.266666666666667
8 : 7.25
9 : 6.5plt.plot(K, inertias, bx-)
plt.xlabel(Values of K)
plt.ylabel(Inertia)
plt.title(The Elbow Method using Inertia)
plt.show()为了确定聚类的最佳数量我们必须选择“弯头”处的k值即distortion/inertia开始以线性方式减小的点。因此对于给定的数据我们得出结论数据的最佳聚类数是4。
不同k值的聚类数据点
我们将绘制针对不同k值聚类的数据点的图像。为此我们将通过迭代k值的范围来对数据集应用k-means算法。
import matplotlib.pyplot as plt# Create a range of values for k
k_range range(1, 5)# Initialize an empty list to
# store the inertia values for each k
inertia_values []# Fit and plot the data for each k value
for k in k_range:kmeans KMeans(n_clustersk, \initk-means, random_state42)y_kmeans kmeans.fit_predict(X)inertia_values.append(kmeans.inertia_)plt.scatter(X[:, 0], X[:, 1], cy_kmeans)plt.scatter(kmeans.cluster_centers_[:, 0],\kmeans.cluster_centers_[:, 1], \s100, cred)plt.title(K-means clustering (k{}).format(k))plt.xlabel(Feature 1)plt.ylabel(Feature 2)plt.show()# Plot the inertia values for each k
plt.plot(k_range, inertia_values, bo-)
plt.title(Elbow Method)
plt.xlabel(Number of clusters (k))
plt.ylabel(Inertia)
plt.show()