bamboocqh 2018-09-02
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个变量:
k均值算法的作用是从识别最佳拟合类别的过程中去除复杂性,并选择最佳clusters数。
首先我们需要定义k:
然后我们选择2个随机点,我们称之为质心,并将每个数据点分配给最后的质心:
所以这是我们的散点图,我们可以看到我们无法清楚地看到我们的2个聚类,因此我们选择k个随机点,并将每个质心分配给最近的数据点并通过一条线连接它们:
从几何学我们知道蓝线的任何点都是等距的,因此我们可以开始聚类我们的数据点。
接下来,我们将2个新质心指定为新的重心:
因此,我们必须将每个数据点重新分配给新的质心,并创建一个新的聚类,我们调整质心,将质心放置到这些位置并绘制一条新线:
....我们迭代过程直到我们不需要重新分配新点,我们可以继续完成我们的算法。
这是我们的最终结果:
然而,在某些情况下,事情并非如此简单,我们可能会陷入所谓的随机初始化陷阱。为了解释inizialization trapp,让我们再次考虑我们的散点图:
在这种情况下,我们将选择3个集群。但是会发生什么呢?我们有一个糟糕的随机原因?在这种情况下,我们将选择我们的质心,并且我们的数据点仍然与每条线等距,因此基于此方法,我们应该有3个类别。现在我们移动质心,所以我们将质心调整到新位置:
正如我们从图表中看到的那样,没有任何变化,算法会收敛。现在这与我们在开始时看到的情况不同!
发生这种情况是因为质心的选择可以决定算法的结果,但是对算法的修改有额外的选择,允许我们选择最佳的cetroids,这确实是K均值算法。这是一种复杂的方法,所有这些都发生在后台,所以你不需要实现它。只是我们知道有一个最好的质心,并且K-means方法在这个初始化中实现,它找到了最佳的簇数。为了低估如果更多或更少的集群会更好,我们需要有一个参数来比较,那就是WCSS,它由这个公式给出:
在这里,我们取custer 2中的每一点,将每一点到质心到各自质心的距离求和,得到的结果是距离之和:
现在考虑:如果我们只选择了一个类别而不是3个custers,我们将得到更大的值!
如果我们将clusters数增加到2,那么距离的总和肯定会更少。现在我们再次增加到3个,距离将比前2个更接近质心,因此总和正在减少。它会减少多远?我们可以拥有与数据点数量一样多的cluester,因此在这种情况下,WCSS将如何表现?它肯定等于0,因为每个点都对应于质心。WCSS是一个很好的指标,但同时它不断下降,那么我们如何找到最佳呢?让我们看一下图表:
在这里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方法可视化我们的质心: