目录
1、分层聚类算法
2、方法
3、分析步骤
4、案例
层次聚类算法又称为树聚类算法,它根据数据之间的距离,透过一种层次架构方式,反复将数据
进行聚合,创建一个层次以分解给定的数据集。
01 聚类方法
linkage=scipy.cluster.hierarchy.linkage(data,method='single')
data 训练样本
method 类距离的计算公式:
1、single l两个类之间最短距离的点的距离
2、complete 两个类之间最长距离的点的距离
3、centroid 两个所有点的中点的距离
02 层次聚类绘图
scipy.cluster.hierarchy.dendrogram(linkage)
linkage 层次聚类的结果
03 层次聚类分类方法
scipy.cluster.hierarchy.fcluster(linkage,n,criterion='maxclust')
linkage 层次聚类的结果
n 要聚类的个数
criterion 划分方法,使用maxclust,最大划分法
01 计算每两个点距离的平方
计算公式:也就是两个点距离的平方。
02 找出他们之间的最近距离进行合并
两点的均值作为新值,归为一类
03 重新计算新生成的这个类与各个旧类之间的相似度
04 重复胡2和3的步骤
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('D:\\DATA\\pycase\\7.1\\data.csv')
# 提取关键特征 data.columns
fColumns=[ '工作日上班时电话时长', '工作日下半时电话时长', '周末电话时长', '国际电话时长', '总电话时长',
'平均每次通话时长']
# 导入距离计算公式,并且进行训练数据
import scipy.cluster.hierarchy as hcluster
linkage=hcluster.linkage(
data[fColumns],
method='centroid')
# 查看层次聚类的结果
hcluster.dendrogram(linkage)
# 仅仅查看其中一部分的数据,这里查看12个数据
hcluster.dendrogram(
linkage,
truncate_mode='lastp',
p=12,
leaf_font_size=12.
)
# 进行层次聚类
pTarget=hcluster.fcluster(
linkage,3,
criterion='maxclust')
# 对样本量进行统计交叉
pd.crosstab(pTarget,pTarget)
# 通过PCA对数据进行降维
from sklearn.decomposition import PCA
pca_2=PCA(n_components=2)
data_pca=pca_2.fit_transform(data[fColumns])
# 转化为数据框
data_pca_2=pd.DataFrame(data_pca)
# 绘图
plt.scatter(
data_pca_2[0],
data_pca_2[1],
c=pTarget)
# 绘制每个数据特征的影响和表现
# 3 定义空的数据框
dMean=pd.DataFrame(columns=fColumns+['分类'])
data_gb=data[fColumns].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 fColumns:
i=i+1
p=plt.subplot(3,5,i)
p.set_title(column)
p.set_ylabel(str(g)+"分类")
plt.hist(subData[column],bins=20)
# 绘制折线图data.columns
pTarget=pTarget-1 # 下面绘图从0开始绘制
r=data[['工作日上班时电话时长', '工作日下半时电话时长', '周末电话时长', '国际电话时长']]
r.index=data.客户编号
r['聚类类别']=pTarget
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#有中文出现的情况,需要u'内容'
style=['ro-','go-','bo-']
fColumns2=[ '工作日上班时电话时长', '工作日下半时电话时长', '周末电话时长', '国际电话时长']
xlabels=fColumns2
# # %matplotlib qt 弹窗
k=3
for i in range(k): #注意作图、做出不同样式
plt.figure()
tmp=r[r[u'聚类类别']==i].iloc[:,:4] # 提取每一类
for j in range(len(tmp)):
plt.plot(range(1,5),tmp.iloc[j],style[i])
plt.xticks(range(1,5),xlabels,rotation=20) #坐标标签
plt.subplots_adjust(bottom=0.15) # 调整底部
plt.savefig(u'%s%s,png'%('D:\\DATA\\pycase\\7.1\\scipy',i)) #保存图片