机器学习:Python实现K-MEANS聚集

bamboocqh 2018-09-02

机器学习:Python实现K-MEANS聚集

k-means聚类是一种矢量量化方法,最初来源于信号处理,在数据挖掘中被广泛应用于聚类分析。k-means聚类的目的是将n个观测值划分为k个观测值,每个观测值都属于最接近均值的聚类,作为聚类的原型。这导致将数据空间划分为Voronoi单元。

这个问题在计算上很难(NP-hard);然而,有有效的启发式算法,通常使用和收敛到局部最优。这通常类似于混合高斯分布的期望最大化算法,通过k-means和高斯混合建模的迭代细化方法。此外,它们都使用 cluster centers来建模数据;然而,k-means聚类倾向于找到空间范围相似的聚类,而期望最大化机制允许聚类具有不同的形状。

该算法与k最近邻分类器有松散的关系,这是一种流行的分类机器学习技术,由于名称中的k,常常与k -means混淆。可以在由k -means 获得的聚类中心上应用1最近邻分类器,以将新数据分类到现有聚类中。这被称为最近的质心分类器或Rocchio算法。

K-means聚类允许您聚类我们的数据,并且当我们需要发现您不了解的聚类时这是一个很好的工具,这就是为什么这个算法属于无监督学习类别的原因。

为了给出一个实际的例子,我们有一个散点图,让我们想象我们的数据集中有2个变量:

机器学习:Python实现K-MEANS聚集

k均值算法的作用是从识别最佳拟合类别的过程中去除复杂性,并选择最佳clusters数。

首先我们需要定义k:

机器学习:Python实现K-MEANS聚集

然后我们选择2个随机点,我们称之为质心,并将每个数据点分配给最后的质心:

机器学习:Python实现K-MEANS聚集

所以这是我们的散点图,我们可以看到我们无法清楚地看到我们的2个聚类,因此我们选择k个随机点,并将每个质心分配给最近的数据点并通过一条线连接它们:

机器学习:Python实现K-MEANS聚集

从几何学我们知道蓝线的任何点都是等距的,因此我们可以开始聚类我们的数据点。

接下来,我们将2个新质心指定为新的重心:

机器学习:Python实现K-MEANS聚集

因此,我们必须将每个数据点重新分配给新的质心,并创建一个新的聚类,我们调整质心,将质心放置到这些位置并绘制一条新线:

机器学习:Python实现K-MEANS聚集

....我们迭代过程直到我们不需要重新分配新点,我们可以继续完成我们的算法。

这是我们的最终结果:

机器学习:Python实现K-MEANS聚集

然而,在某些情况下,事情并非如此简单,我们可能会陷入所谓的随机初始化陷阱。为了解释inizialization trapp,让我们再次考虑我们的散点图:

机器学习:Python实现K-MEANS聚集

在这种情况下,我们将选择3个集群。但是会发生什么呢?我们有一个糟糕的随机原因?在这种情况下,我们将选择我们的质心,并且我们的数据点仍然与每条线等距,因此基于此方法,我们应该有3个类别。现在我们移动质心,所以我们将质心调整到新位置:

机器学习:Python实现K-MEANS聚集

正如我们从图表中看到的那样,没有任何变化,算法会收敛。现在这与我们在开始时看到的情况不同!

机器学习:Python实现K-MEANS聚集

发生这种情况是因为质心的选择可以决定算法的结果,但是对算法的修改有额外的选择,允许我们选择最佳的cetroids,这确实是K均值算法。这是一种复杂的方法,所有这些都发生在后台,所以你不需要实现它。只是我们知道有一个最好的质心,并且K-means方法在这个初始化中实现,它找到了最佳的簇数。为了低估如果更多或更少的集群会更好,我们需要有一个参数来比较,那就是WCSS,它由这个公式给出:

机器学习:Python实现K-MEANS聚集

在这里,我们取custer 2中的每一点,将每一点到质心到各自质心的距离求和,得到的结果是距离之和:

机器学习:Python实现K-MEANS聚集

现在考虑:如果我们只选择了一个类别而不是3个custers,我们将得到更大的值!

机器学习:Python实现K-MEANS聚集

如果我们将clusters数增加到2,那么距离的总和肯定会更少。现在我们再次增加到3个,距离将比前2个更接近质心,因此总和正在减少。它会减少多远?我们可以拥有与数据点数量一样多的cluester,因此在这种情况下,WCSS将如何表现?它肯定等于0,因为每个点都对应于质心。WCSS是一个很好的指标,但同时它不断下降,那么我们如何找到最佳呢?让我们看一下图表:

机器学习:Python实现K-MEANS聚集

在这里WCSS从一个非常大的数字开始,你可以看到从8跳到1K,然后它稳定下来。前两个改进在WCSS中产生了一些巨大的下降,这是我们的暗示,这一点将是最佳的!

为了在Python上实现k-means算法,我们需要使用我们想要执行聚类的变量进行分段。我们将通过elbow模型找出最佳簇数,因此我们首先需要导入sklearn.cluster库和Kmeans类来为我们完成工作,并创建一个名为wcss的for循环。接下来,我们创建ak表示对象,其中我们输入簇的数量并选择k-means ++参数以避免inizialization陷阱,最大迭代次数300和不同初始化的次数。接下来,我们将对象与我们的数据相匹配,并通过惯性方法将其附加到我们的wcss列表中。然后我们使用10个聚类和wcss指标绘制我们的值,以选择最佳聚类数:

# Data Preprocessing

# Importing the Library

import numpy as np

import matplotlib.pyplot as plt

import pandas as pd

# Importing the dataset

dataset= pd.read_csv('Data.csv')

X = dataset.iloc[: , [3, 4]].values

#Using the elbow method to find the optimal number of clusters

from sklear.cluster import KMeans

wcss = []

for i in range[1, 11]:

kmeans = KMeans(n_clusters = i, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)

kmeans.fit(x)

wcss.append (kmeans.inertia_)

plt.plot(range(1, 11), wcss)

plt.title('The Elbow Method')

plt.xlabel('Number of clusters')

plt.ylabel('WCSS')

plt.show()

接下来,我们应用k均值算法并输入我们找到的最佳clusters数,并通过fit.predict方法预测我们的类别。Python代码如下:

# Data Preprocessing

# Importing the Library

import numpy as np

import matplotlib.pyplot as plt

import pandas as pd

# Importing the dataset

dataset= pd.read_csv('Data.csv')

X = dataset.iloc[: , [3, 4]].values

#Using the elbow method to find the optimal number of clusters

from sklear.cluster import KMeans

wcss = []

for i in range[1, 11]:

kmeans = KMeans(n_clusters = i, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)

kmeans.fit(x)

wcss.append (kmeans.inertia_)

plt.plot(range(1, 11), wcss)

plt.title('The Elbow Method')

plt.xlabel('Number of clusters')

plt.ylabel('WCSS')

plt.show()

# Applying k-means to the dataset

kmeans = KMeans(n_clusters = 5, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)

# Visualising the clusters

plt.scatter(X[y_kmeans == 0, 0], X[y_means == 0, 1], s= 100, c = 'red', label = 'Careful')

plt.scatter(X[y_kmeans == 1, 0], X[y_means == 1, 1], s= 100, c = 'bkue', label = 'Standard')

plt.scatter(X[y_kmeans == 2, 0], X[y_means == 2, 1], s= 100, c = 'green', label = 'Cluster 3')

plt.scatter(X[y_kmeans == 3, 0], X[y_means == 3, 1], s= 100, c = 'cyan', label = 'Cluster 4')

plt.scatter(X[y_kmeans == 4, 0], X[y_means == 4, 1], s= 100, c = 'magenta', label = 'Cluster 5')

plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroids')

plt.title('Clusters of clients')

plt.xlabel('Annual Income')

plt.ylabel('Spending Score(1-100)')

plt.legend()

plt.show()

最后,我们将可视化我们的结果并绘制每个cluster的数量,我们的独立变量和预测的因变量y,并使用cluster_center方法可视化我们的质心:

机器学习:Python实现K-MEANS聚集

相关推荐