分享

Python机器学习-聚类

 cqukelly 2024-03-13 发布于北京

 1 、什么是聚类       


聚类类似于分类,不同的是聚类所要求划分的类是未知的,也就是说不知道应该属于哪类,而是通过一定的算法自动分类。在实际应用中,聚类是一个将数据集中在某些方面相似的数据中,并进行分类组织的过程(简单地说,就是将相似数据聚在一起),如图3 和图4 所示的示意图。

图片

3  聚类前

图片

4  聚类后


聚类的主要应用领域:
商业:聚类分析被用来发现不同的客户群,并且通过购买模式刻画不同客户群的特征。

生物:聚类分析被用来对动植物分类和对基因进行分类,获取对种群固有结构的认识。

保险行业:聚类分析通过一个高的平均消费来鉴定汽车保险单持有者的分组,同时根据住宅类型、价值和地理位置来判断一个城市的房产分组。

因特网:聚类分析被用来在网上进行文档归类。

电子商务:聚类分析在电子商务网站建设数据挖掘中也是很重要的一个方面,通过分组聚类出具有相似浏览行为的客户,并分析客户的共同特征,可以更好地帮助电商了解自己的客户,向客户提供更合适的服务。

    2、聚类算法       


k-means 算法是一种聚类算法,它是一种无监督学习算法,目的是将相似的对象归到同一个簇中。簇内的对象越相似,聚类的效果就越好。传统的聚类算法包括划分方法、层次方法、基于密度方法、基于网格方法和基于模型方法。本节主要介绍K-means 聚类算法,它是划分方法中较典型的一种,也可以称为k 均值聚类算法。下面介绍什么是k 均值聚类以及相关算法。

1、K-means 聚类

K-means 聚类也称为k 均值聚类,是著名的划分聚类的算法,由于简洁性和高效率,使得它成为所有聚类算法中应用最为广泛的一种。k 均值聚类是给定一个数据点集合和需要的聚类数目k,k 由用户指定,k 均值算法将根据某个距离函数反复把数据分入k 个聚类中。

2、算法

随机选取k 个点作为初始质心(质心即簇中所有点的中心),然后将数据集中的每个点分配到一个簇中。具体来说,为每个点找距其最近的质心,并将其分配给该质心所对应的簇。这一步完成之后,每个簇的质心更新为该簇所有点的平均值。这个过程将不断重复直到满足某个终止条件。终止条件可以是以下中的任何一个:
1)没有(或最小数目)对象被重新分配给不同的聚类。

2)没有(或最小数目)聚类中心再发生变化。

3)误差平方和局部最小。

伪代码如下:

创建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='a

uto',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 次方)时,则不预计算距离。

  True:总是预先计算距离。

  False:永远不预先计算距离。

  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):给每个样本估计最接近的簇。

  score(X[,y]) :计算聚类误差。

快速示例04  对一组数据聚类

实现对一组数据聚类,程序代码如下:
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_)

运行程序,输出结果为:

预测类别: [1 1 1 0 0 0 0]
分类簇的均值向量:
[[ 3. 22.25]
[ 1. 11. ]]
类别标记: [1 1 1 0 0 0 0]


    4、聚类数据生成器        


在上一节中举了一个简单的聚类示例,但是聚类效果并不明显。下面生成专门的聚类算法的测试数据,更好地诠释聚类算法,展示聚类效果。Scikit-Learn 中的make_blobs 方法用于生成聚类算法的测试数据,直观地说,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 所示。

图片

图5  聚类散点图

从分析结果得知:相似的数据聚在一起,分成了4 堆,也就是4 类,并以不同的颜色显示,看上去更加清晰直观。

图片

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多