聚类类似于分类,不同的是聚类所要求划分的类是未知的,也就是说不知道应该属于哪类,而是通过一定的算法自动分类。在实际应用中,聚类是一个将数据集中在某些方面相似的数据中,并进行分类组织的过程(简单地说,就是将相似数据聚在一起),如图3 和图4 所示的示意图。
图3 聚类前
图4 聚类后 商业:聚类分析被用来发现不同的客户群,并且通过购买模式刻画不同客户群的特征。生物:聚类分析被用来对动植物分类和对基因进行分类,获取对种群固有结构的认识。保险行业:聚类分析通过一个高的平均消费来鉴定汽车保险单持有者的分组,同时根据住宅类型、价值和地理位置来判断一个城市的房产分组。电子商务:聚类分析在电子商务网站建设数据挖掘中也是很重要的一个方面,通过分组聚类出具有相似浏览行为的客户,并分析客户的共同特征,可以更好地帮助电商了解自己的客户,向客户提供更合适的服务。k-means 算法是一种聚类算法,它是一种无监督学习算法,目的是将相似的对象归到同一个簇中。簇内的对象越相似,聚类的效果就越好。传统的聚类算法包括划分方法、层次方法、基于密度方法、基于网格方法和基于模型方法。本节主要介绍K-means 聚类算法,它是划分方法中较典型的一种,也可以称为k 均值聚类算法。下面介绍什么是k 均值聚类以及相关算法。1、K-means 聚类 K-means 聚类也称为k 均值聚类,是著名的划分聚类的算法,由于简洁性和高效率,使得它成为所有聚类算法中应用最为广泛的一种。k 均值聚类是给定一个数据点集合和需要的聚类数目k,k 由用户指定,k 均值算法将根据某个距离函数反复把数据分入k 个聚类中。2、算法 随机选取k 个点作为初始质心(质心即簇中所有点的中心),然后将数据集中的每个点分配到一个簇中。具体来说,为每个点找距其最近的质心,并将其分配给该质心所对应的簇。这一步完成之后,每个簇的质心更新为该簇所有点的平均值。这个过程将不断重复直到满足某个终止条件。终止条件可以是以下中的任何一个:1)没有(或最小数目)对象被重新分配给不同的聚类。伪代码如下: 创建k个点作为起始质心,可以随机选择(位于数据边界内) 当任意一个点的簇分配结果发生改变时(初始化为True) 对数据集中每个数据点,重新分配质心 对每个质心 计算质心与数据点之间的距离 将数据点分配到距其最近的簇 对每一个簇,计算簇中所有点的均值并将均值作为新的质心 通过以上介绍,相信您对K-means 聚类算法已经有了初步的认识,而在Python 中应用该算法无需手动编写代码,因为Python 的第三方模块Scikit-Learn 已经帮我们写好了,在性能和稳定性上会好得多,只需在程序中调用即可,没必要自己造轮子。3、聚类模块 Scikit-Learn 中的cluster 模块用于聚类分析,该模块提供了很多聚类算法,下面主要介绍KMeans方法,该方法通过K-means 聚类算法实现聚类分析。首先导入sklearn.cluster 模块中的KMeans 方法,程序代码如下:from sklearn.cluster import KMeans 接下来,在程序中就可以使用KMeans 方法了。KMeans 方法的语法如下:KMeans(n_clusters=8,init='k-means++',n_init=10,max_iter=300,tol=1e-4,precompute_distances='auto',verbose=0,random_state=None,copy_x=True,n_jobs=None,algorithm='auto')● n_clusters:整型,默认值=8,是生成的聚类数,即产生的质心(centroids)数。● init:参数值为k-means++、random或者传递一个数组向量。默认值为k-means++。● k-means++:用一种特殊的方法选定初始质心从而加速迭代过程的收敛。● random:随机从训练数据中选取初始质心。如果传递数组类型,则应该是shape(n_clusters,n_features) 的形式,并给出初始质心。● n_init:整型,默认值为10,用不同的质心初始化值运行算法的次数。● max_iter:整型,默认值为300,每执行一次K-means算法的最大迭代次数。● tol:浮点型,默认值为1e-4(即1 乘以10 的-4 次方),控制求解的精度。● precompute_distances:参数值为auto、True 或者False。用于预计算距离,计算速度更快,但占用更多内存。● auto:如果样本数乘以聚类数大于12e6(即12 乘以10 的6 次方)时,则不预计算距离。● verbose:整型,默认值为0,冗长的模式。● random_state:整型或随机数组类型。用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个种子(seed)。默认值为NumPy 的随机数生成器。● copy_x:布尔型,默认值为True。如果值为True,则原始数据不会被改变;如果值为False,则会直接在原始数据上做修改,并在函数返回值时将其还原。但是在计算过程中,由于有对数据均值的加减运算,所以数据返回后,原始数据同计算前的数据可能会有细小差别。● n_jobs:整型,指定计算所用的进程数。如果值为-1,则用所有的CPU进行运算;如果值为1,则不进行并行运算,这样方便调试;如果值小于-1,则用到的CPU 数为(n_cpus+1+n_jobs),例如n_jobs 值为-2,则用到的CPU 数为总CPU 数减1。● algorithm:表示K-means算法法则,参数值为auto、full或elkan,默认值为auto。● cluster_centers_:返回数组,表示分类簇的均值向量。● labels_:返回数组,表示每个样本数据所属的类别标记。● inertia_:返回数组,表示每个样本数据距离它们各自最近簇的中心之和。● fit(X[,y]):计算K-means聚类。● fit_predictt(X[,y]):计算簇质心并给每个样本数据预测类别。● predict(X):给每个样本估计最接近的簇。import numpy as np
from sklearn.cluster import KMeans
X=np.array([[1,10],[1,11],[1,12],[3,20],[3,23],[3,21],[3,25]])
kmodel = KMeans(n_clusters = 2) #调用KMeans方法实现聚类(两类)
y_pred=kmodel.fit_predict(X) #预测类别
print('预测类别:',y_pred)
print('聚类中心坐标值:','\n',kmodel.cluster_centers_)
print('类别标记:',kmodel.labels_)
运行程序,输出结果为: 在上一节中举了一个简单的聚类示例,但是聚类效果并不明显。下面生成专门的聚类算法的测试数据,更好地诠释聚类算法,展示聚类效果。Scikit-Learn 中的make_blobs 方法用于生成聚类算法的测试数据,直观地说,make_blobs 方法可以根据用户指定的特征数量、中心点数量、范围等来生成几类不同的数据,这些数据可用于测试聚类算法的效果。sklearn.datasets.make_blobs(n_samples=100,n_features=2,centers=3,cluster_std=1.0,center_box=(-10.0,10.0),shuffle=True,random_state=None) ● n_samples:待生成的样本的总数。 ● n_features:每个样本的特征数。 ● centers:类别数。 ● cluster_std:每个类别的方差。例如,生成两类数据,其中一类比另一类具有更大的方差,可以将cluster_std 参数设置为[1.0,3.0]。 快速示例05 生成用于聚类的测试数据 生成用于聚类的数据(500 个样本,每个样本中含有2 个特征),程序代码如下:from sklearn.datasets import make_blobs
from matplotlib import pyplot
x,y = make_blobs(n_samples=500, n_features=2, centers=3) 接下来,通过KMeans 方法对测试数据进行聚类,形成散点图,程序代码如下:from sklearn.cluster import KMeans
y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()
图5 聚类散点图 从分析结果得知:相似的数据聚在一起,分成了4 堆,也就是4 类,并以不同的颜色显示,看上去更加清晰直观。
|