聚类分析 一、概念 聚类分析是按照个体的特征将他们分类,让同一个类别内的个体之间具有较高的相似度,不同类别之间具有较大的差异性 聚类分析属于无监督学习 聚类对象可以分为Q型聚类和R型聚类 Q型聚类:样本/记录聚类 以距离为相似性指标 (欧氏距离、欧氏平方距离、马氏距离、明式距离等) R型聚类:指标/变量聚类以相似系数为相似性指标 (皮尔逊相关系数、夹角余弦、指数相关系数等) 二、常用的聚类算法
1、K-Means划分法 K表示聚类算法中类的个数,Means表示均值算法,K-Means即是用均值算法把数据分成K个类的算法。 K-Means算法的目标,是把n个样本点划分到k个类中,使得每个点都属于离它最近的质心(一个类内部所有样本点的均值)对应的类,以之作为聚类的标准。 算法原理见 http://www./thread-18178-1-1.html【转】 K-Means算法的计算步骤
基于sklearn包的实现 导入一份如下数据,经过各变量间的散点图和相关系数,发现工作日上班电话时长与总电话时长存在强正相关关系 选择可建模的变量并降维 cloumns_fix1 = ['工作日上班时电话时长', '工作日下半时电话时长', '周末电话时长', '国际电话时长', '平均每次通话时长']#数据降维pca_2 = PCA(n_components=2)data_pca_2 = pd.DataFrame(pca_2.fit_transform(data[cloumns_fix1])) 通过sklearn包中的K-Means方法构建模型
#预计将数据点分类为3类kmmodel = KMeans(n_clusters=3) #创建模型kmmodel = kmmodel.fit(data[cloumns_fix1]) #训练模型ptarget = kmmodel.predict(data[cloumns_fix1]) #对原始数据进行标注pd.crosstab(ptarget,ptarget) #交叉表查看各个类别数据的数量 plt.scatter(data_pca_2[0],data_pca_2[1],c=ptarget)#查看聚类的分布情况 最后,可以通过直方图查看各聚类间的差异
2、 层次聚类法 层次聚类算法又称为树聚类算法,它根据数据之间的距离,透过一种层次架构方式,反复将数据进行聚合,创建一个层次以分解给定的数据集。层次聚类算法常用于一维数据的自动分组。 层次聚类算法是一种很直观的聚类算法,基本思想是通过数据间的相似性,按相似性由高到低排序后重新连接各个节点,整个过程就是建立一个树结构,如下图: 层次聚类算法的步骤:
基于sklearn包的实现 使用K-Means聚类案例中的数据 cloumns_fix1 = ['工作日上班时电话时长', '工作日下半时电话时长', '周末电话时长', '国际电话时长', '平均每次通话时长']linkage = hcluster.linkage(data[cloumns_fix1], method='centroid') #中心点距离计算,得到矩阵 linkage = scipy.cluster.hierarchy.linkage(data, method='single') method 类距离计算公式有三种参数:
#对聚类得到的类进行标注 层次聚类的结果,要聚类的个数,划分方法(maxclust,最大划分法)ptarget = hcluster.fcluster(linkage, 3, criterion='maxclust')#查看各类别中样本含量pd.crosstab(ptarget,ptarget) 绘制图形 #使用主成分分析进行数据降维pca_2 = PCA(n_components=2)data_pca_2 = pd.DataFrame(pca_2.fit_transform(data[cloumns_fix1]))plt.scatter(data_pca_2[0], data_pca_2[1], c=ptarget) #绘制图形 3、 DBSCAN密度法 概念: 中文全称:基于密度的带噪声的空间聚类应用算法,它是将簇定义为密度相联的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据集中发现任意形状的聚类。 密度:空间中任意一点的密度是以该点为圆心,以Eps为半径的园区域内包含的点数目。 邻域:空间中任意一点的邻域是以该店为圆心,以Eps为半径的园区域内包含的点集合。 核心点:空间中某一点的密度,如果大于某一给定阈值MinPts,则称该点为核心点。(小于MinPts则称边界点) 噪声点:既不是核心点,也不是边界点的任意点 DBSCAN算法的步骤:
DBSCAN算法优点:
DBSCAN算法缺点:
python中的实现 1)数学原理实现 导入一份如下分布的数据点的集合
将所有点进行分类,得到核心点、边界点和噪声点 #设置Eps和MinPtseps = 0.2MinPts = 5ptses = []for row in dist: #密度 density = np.sum(row<eps) pts = 0 if density>MinPts: #核心点,密度大于5 pts = 1 elif density>1 : #边界点,密度大于1小于5 pts = 2 else: #噪声点,密度为1 pts = 0 ptses.append(pts)#得到每个点的分类 以防万一,将噪声点进行过滤,并计算新的距离矩阵
以每个点为核心,得到该点的邻域 cluster = dict()i = 0for row in coreDist: cluster[i] = numpy.where(row<eps)[0] i = i + 1 然后,将有交集的邻域,都合并为新的领域
最后,找出独立(也就是没有交集)的邻域,就是我们最后的聚类的结果了 result = dict()j = 0for i in range(len(cluster)): if len(cluster[i])>0: result[j] = cluster[i] j = j + 1#找出每个点所在领域的序号,作为他们最后聚类的结果标记for i in range(len(result)): for j in result[i]: data.at[j, 'type'] = i plt.scatter(data['x'], data['y'], c=data['type']) 2)基于sklearn包的实现
end. 来源:博客园 |
|