聚类分析是按照个体的特征将他们分类,让同一个类别内的个体之间具有较高的相似度,不同类别之间具有较大的差异性
Q型聚类:样本/记录聚类 以距离为相似性指标 (欧氏距离、欧氏平方距离、马氏距离、明式距离等)
R型聚类:指标/变量聚类 以相似系数为相似性指标 (皮尔逊相关系数、夹角余弦、指数相关系数等)
K表示聚类算法中类的个数,Means表示均值算法,K-Means即是用均值算法把数据分成K个类的算法。
K-Means算法的目标,是把n个样本点划分到k个类中,使得每个点都属于离它最近的质心(一个类内部所有样本点的均值)对应的类,以之作为聚类的标准。
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方法构建模型。
- #绘制散点图查看数据点大致情况
- plt.scatter(data_pca_2[0],data_pca_2[1])
- #预计将数据点分类为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)#查看聚类的分布情况。
最后,可以通过直方图查看各聚类间的差异。
- #查看各类之间的差异
- dMean = pd.DataFrame(columns=cloumns_fix1+['分类']) #得到每个类别的均值
- data_gb = data[cloumns_fix1].groupby(ptarget) #按标注进行分组
- i = 0
- for g in data_gb.groups:
- rMean = data_gb.get_group(g).mean()
- rMean['分类'] = g;
- dMean = dMean.append(rMean, ignore_index=True)
- subData = data_gb.get_group(g)
- for column in cloumns_fix1:
- i = i+1;
- p = plt.subplot(3, 5, i)
- p.set_title(column)
- p.set_ylabel(str(g) + "分类")
- plt.hist(subData[column], bins=20)
层次聚类算法又称为树聚类算法,它根据数据之间的距离,透过一种层次架构方式,反复将数据进行聚合,创建一个层次以分解给定的数据集。层次聚类算法常用于一维数据的自动分组。
层次聚类算法是一种很直观的聚类算法,基本思想是通过数据间的相似性,按相似性由高到低排序后重新连接各个节点,整个过程就是建立一个树结构,如下图:
层次聚类算法的步骤:
基于sklearn包的实现
使用K-Means聚类案例中的数据。
- cloumns_fix1 = ['工作日上班时电话时长', '工作日下半时电话时长',
- '周末电话时长',
- '国际电话时长', '平均每次通话时长']
- linkage = hcluster.linkage(data[cloumns_fix1], method='centroid') #中心点距离计算,得到矩阵
- linkage = scipy.cluster.hierarchy.linkage(data, method='single')
method 类距离计算公式有三种参数:
- #层次聚类绘图
- hcluster.dendrogram(linkage) #不设置参数时会将所有点做为一个基础的类进行树结构的绘制
- #由于数据量大,限制类的个数,保留12个节点,有括号表示副节点,括号内的数字为该节点内部包含的子节点
- hcluster.dendrogram(linkage, truncate_mode='lastp', p=12, leaf_font_size=12.)
- #对聚类得到的类进行标注 层次聚类的结果,要聚类的个数,划分方法
- (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) #绘制图形
概念:
DBSCAN算法的步骤:
DBSCAN算法优点:
DBSCAN算法缺点:
python中的实现
1)数学原理实现
导入一份如下分布的数据点的集合。
- #计算得到各点间距离的矩阵
- from sklearn.metrics.pairwise import euclidean_distances
- dist = euclidean_distances(data)
将所有点进行分类,得到核心点、边界点和噪声点。
- #设置Eps和MinPts
- eps = 0.2
- MinPts = 5
- ptses = []
- 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)
- #得到每个点的分类
以防万一,将噪声点进行过滤,并计算新的距离矩阵。
- #把噪声点过滤掉,因为噪声点无法聚类,它们独自一类
- corePoints = data[pandas.Series(ptses)!=0]
- coreDist = euclidean_distances(corePoints)
以每个点为核心,得到该点的邻域。
- cluster = dict()
- i = 0
- for row in coreDist:
- cluster[i] = numpy.where(row<eps)[0]
- i = i + 1
然后,将有交集的邻域,都合并为新的领域。
- for i in range(len(cluster)):
- for j in range(len(cluster)):
- if len(set(cluster[j]) & set(cluster[i]))>0 and i!=j:
- cluster[i] = list(set(cluster[i]) | set(cluster[j]))
- cluster[j] = list()
最后,找出独立(也就是没有交集)的邻域,就是我们最后的聚类的结果了。
- result = dict()
- j = 0
- for 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包的实现
- eps = 0.2
- MinPts = 5
- model = DBSCAN(eps, MinPts)
- data['type'] = model.fit_predict(data)
- plt.scatter(data['x'], data['y'], c=data['type'])
本文转载自公众号读芯术(ID:AI_Discovery)。 这一刻你正在应对什么挑战?这位前...
背景 我们知道 如果在Kubernetes中支持GPU设备调度 需要做如下的工作 节点上安装...
本文转载自微信公众号「bugstack虫洞栈」,作者小傅哥 。转载本文请联系bugstack...
TIOBE 公布了 2021 年 3 月的编程语言排行榜。 本月 TIOBE 指数没有什么有趣的变...
前言 统计科学家使用交互式的统计工具(比如R)来回答数据中的问题,获得全景的认...
想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://...
溢价 域名 的续费价格如何?通常来说,因为溢价域名的价值高于普通域名,所以溢...
近几年,互联网行业蓬勃发展,在互联网浪潮的冲击下,互联网创业已成为一种比较...
在Python开发过程中,我们难免会遇到多重条件判断的情况的情况,此时除了用很多...
基本介绍 给定 n 个权值作为 n 个叶子节点,构造一颗二叉树,若该树的带权路径长...