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