25、python分层聚类案例(sklearn方法)

1 sklearn层次聚类

01 ward

       最小化所有聚类内的平方差总和,这是一种方差最小化的优化方向,这是与k-means的目标韩式相似的优化方法,但是用聚类分层的方法处理。

02    Maximum 或者complete linkage 最小化聚类对样本之间的最大距离

03    Average linkage 最小化聚类两个聚类中样本之间的最大距离
 

2 案例

import pandas as pd


data=pd.read_csv('D:\\DATA\\pycase\\7.1\\data.csv',
                 index_col='客户编号')

# 提取关键特征 data.columns

fColumns=[ '工作日上班时电话时长', '工作日下半时电话时长', '周末电话时长', '国际电话时长']

# 数据标准化0-1标准化

data=data[fColumns]

data[fColumns]=round(
        (data[fColumns]-data[fColumns].min())/(data[fColumns].max()-data[fColumns].min()),
        3)

# 导入层次聚类函数
from scipy.cluster.hierarchy import linkage,dendrogram

Z=linkage(data[fColumns],method='ward',metric='euclidean') #p谱系聚类图

P=dendrogram(Z,0) # 画谱系聚类图

''' 只展示12个数据
P1=dendrogram(Z,
        truncate_mode='lastp',
        p=12,
        leaf_font_size=12.
        )

'''

# 导入sklearn的层次聚类函数

from sklearn.cluster import AgglomerativeClustering 

k=3

model=AgglomerativeClustering(n_clusters=k,linkage='ward')

model.fit(data[fColumns]) # 训练模型

# 详细输出原始数据极其类别

r=pd.concat([data,pd.Series(model.labels_,index=data.index)],axis=1)


r.columns=list(data.columns)+['聚类类别']

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#有中文出现的情况,需要u'内容'

style=['ro-','go-','bo-']

xlabels=fColumns

# # %matplotlib qt 弹窗

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\\data',i)) #保存图片

 

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