python分层聚类集群合并_24、python分层聚类案例(scipy方法)
目錄
1、分層聚類算法
2、方法
3、分析步驟
4、案例
1、分層聚類算法
層次聚類算法又稱為樹聚類算法,它根據(jù)數(shù)據(jù)之間的距離,透過一種層次架構(gòu)方式,反復(fù)將數(shù)據(jù)
進(jìn)行聚合,創(chuàng)建一個(gè)層次以分解給定的數(shù)據(jù)集。
2、方法
01 聚類方法
linkage=scipy.cluster.hierarchy.linkage(data,method='single')
data ?訓(xùn)練樣本
method 類距離的計(jì)算公式:
1、single l兩個(gè)類之間最短距離的點(diǎn)的距離
2、complete 兩個(gè)類之間最長距離的點(diǎn)的距離
3、centroid 兩個(gè)所有點(diǎn)的中點(diǎn)的距離
02 層次聚類繪圖
scipy.cluster.hierarchy.dendrogram(linkage)
linkage ? ?層次聚類的結(jié)果
03 層次聚類分類方法
scipy.cluster.hierarchy.fcluster(linkage,n,criterion='maxclust')
linkage ? 層次聚類的結(jié)果
n ? ? ? ? 要聚類的個(gè)數(shù)
criterion 劃分方法,使用maxclust,最大劃分法
3、分析步驟
01 計(jì)算每?jī)蓚€(gè)點(diǎn)距離的平方
計(jì)算公式:也就是兩個(gè)點(diǎn)距離的平方。
02 找出他們之間的最近距離進(jìn)行合并
兩點(diǎn)的均值作為新值,歸為一類
03 重新計(jì)算新生成的這個(gè)類與各個(gè)舊類之間的相似度
04 重復(fù)胡2和3的步驟
4、案例
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('D:\\DATA\\pycase\\7.1\\data.csv')
# 提取關(guān)鍵特征 data.columns
fColumns=[ '工作日上班時(shí)電話時(shí)長', '工作日下半時(shí)電話時(shí)長', '周末電話時(shí)長', '國際電話時(shí)長', '總電話時(shí)長',
'平均每次通話時(shí)長']
# 導(dǎo)入距離計(jì)算公式,并且進(jìn)行訓(xùn)練數(shù)據(jù)
import scipy.cluster.hierarchy as hcluster
linkage=hcluster.linkage(
data[fColumns],
method='centroid')
# 查看層次聚類的結(jié)果
hcluster.dendrogram(linkage)
# 僅僅查看其中一部分的數(shù)據(jù),這里查看12個(gè)數(shù)據(jù)
hcluster.dendrogram(
linkage,
truncate_mode='lastp',
p=12,
leaf_font_size=12.
)
# 進(jìn)行層次聚類
pTarget=hcluster.fcluster(
linkage,3,
criterion='maxclust')
# 對(duì)樣本量進(jìn)行統(tǒng)計(jì)交叉
pd.crosstab(pTarget,pTarget)
# 通過PCA對(duì)數(shù)據(jù)進(jìn)行降維
from sklearn.decomposition import PCA
pca_2=PCA(n_components=2)
data_pca=pca_2.fit_transform(data[fColumns])
# 轉(zhuǎn)化為數(shù)據(jù)框
data_pca_2=pd.DataFrame(data_pca)
# 繪圖
plt.scatter(
data_pca_2[0],
data_pca_2[1],
c=pTarget)
# 繪制每個(gè)數(shù)據(jù)特征的影響和表現(xiàn)
# 3 定義空的數(shù)據(jù)框
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[['工作日上班時(shí)電話時(shí)長', '工作日下半時(shí)電話時(shí)長', '周末電話時(shí)長', '國際電話時(shí)長']]
r.index=data.客戶編號(hào)
r['聚類類別']=pTarget
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負(fù)號(hào)
#有中文出現(xiàn)的情況,需要u'內(nèi)容'
style=['ro-','go-','bo-']
fColumns2=[ '工作日上班時(shí)電話時(shí)長', '工作日下半時(shí)電話時(shí)長', '周末電話時(shí)長', '國際電話時(shí)長']
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) #坐標(biāo)標(biāo)簽
plt.subplots_adjust(bottom=0.15) # 調(diào)整底部
plt.savefig(u'%s%s,png'%('D:\\DATA\\pycase\\7.1\\scipy',i)) #保存圖片
總結(jié)
以上是生活随笔為你收集整理的python分层聚类集群合并_24、python分层聚类案例(scipy方法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11选5下期算法_本周六周日【高二直播】
- 下一篇: import 别名_Python基础找茬