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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章