24、python分层聚类案例(scipy方法)

目录

1、分层聚类算法

2、方法

3、分析步骤

4、案例


1、分层聚类算法

    层次聚类算法又称为树聚类算法,它根据数据之间的距离,透过一种层次架构方式,反复将数据
进行聚合,创建一个层次以分解给定的数据集。

2、方法

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,最大划分法

3、分析步骤

01 计算每两个点距离的平方
计算公式:也就是两个点距离的平方。

02 找出他们之间的最近距离进行合并

两点的均值作为新值,归为一类

03 重新计算新生成的这个类与各个旧类之间的相似度

04 重复胡2和3的步骤

4、案例


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)) #保存图片
      

 

 

 

你可能感兴趣的:(数据挖掘实战)