层次聚类python实现_Python机器学习——Agglomerative层次聚类
層次聚類(hierarchical clustering)可在不同層次上對(duì)數(shù)據(jù)集進(jìn)行劃分,形成樹(shù)狀的聚類結(jié)構(gòu)。AggregativeClustering是一種常用的層次聚類算法。
其原理是:最初將每個(gè)對(duì)象看成一個(gè)簇,然后將這些簇根據(jù)某種規(guī)則被一步步合并,就這樣不斷合并直到達(dá)到預(yù)設(shè)的簇類個(gè)數(shù)。這里的關(guān)鍵在于:如何計(jì)算聚類簇之間的距離?
由于每個(gè)簇就是一個(gè)集合,因此需要給出集合之間的距離。給定聚類簇Ci,CjCi,Cj,有如下三種距離:
最小距離:
dmin(Ci,Cj)=minx??i∈Ci,x??j∈Cjdistance(x??i,x??j)dmin(Ci,Cj)=minx→i∈Ci,x→j∈Cjdistance(x→i,x→j)
它是兩個(gè)簇的樣本對(duì)之間距離的最小值。
最大距離:
dmax(Ci,Cj)=maxx??i∈Ci,x??j∈Cjdistance(x??i,x??j)dmax(Ci,Cj)=maxx→i∈Ci,x→j∈Cjdistance(x→i,x→j)
它是兩個(gè)簇的樣本對(duì)之間距離的最大值。
平均距離:
davg(Ci,Cj)=1|Ci||Cj|∑x??i∈Ci∑x??j∈Cjdistance(x??i,x??j)davg(Ci,Cj)=1|Ci||Cj|∑x→i∈Ci∑x→j∈Cjdistance(x→i,x→j)
它是兩個(gè)簇的樣本對(duì)之間距離的平均值。
當(dāng)該算法的聚類簇采用dmindmin時(shí),稱為單鏈接single-linkage算法,當(dāng)該算法的聚類簇采用dmaxdmax時(shí),稱為單鏈接complete-linkage算法,當(dāng)該算法的聚類簇采用davgdavg時(shí),稱為單鏈接average-linkage算法。
下面給出算法:
輸入:
數(shù)據(jù)集D=D={x??1,x??2,...,x??Nx→1,x→2,...,x→N}
聚類簇距離度量函數(shù)
聚類簇?cái)?shù)量KK
輸出:簇劃分C=C={C1,C2,...,CKC1,C2,...,CK}
算法步驟如下:
初始化:將每個(gè)樣本都作為一個(gè)簇
Ci=[x??i],i=1,2,...,NCi=[x→i],i=1,2,...,N
迭代:終止條件為聚類簇的數(shù)量為K。迭代過(guò)程如下:
計(jì)算聚類簇之間的距離,找出距離最近的兩個(gè)簇,將這兩個(gè)簇合并。
Python實(shí)戰(zhàn)
AgglomerativeClustering是scikit-learn提供的層級(jí)聚類算法模型,其原型為:
class sklearn.cluster.AgglomerativeClustering(n_clusters=2, affinity=’euclidean’, memory=None, connectivity=None, compute_full_tree=’auto’, linkage=’ward’, pooling_func=)
1
參數(shù)
n_clusters:一個(gè)整數(shù),指定分類簇的數(shù)量
connectivity:一個(gè)數(shù)組或者可調(diào)用對(duì)象或者None,用于指定連接矩陣
affinity:一個(gè)字符串或者可調(diào)用對(duì)象,用于計(jì)算距離。可以為:’euclidean’,’l1’,’l2’,’mantattan’,’cosine’,’precomputed’,如果linkage=’ward’,則affinity必須為’euclidean’
memory:用于緩存輸出的結(jié)果,默認(rèn)為不緩存
n_components:在 v-0.18中移除
compute_full_tree:通常當(dāng)訓(xùn)練了n_clusters后,訓(xùn)練過(guò)程就會(huì)停止,但是如果compute_full_tree=True,則會(huì)繼續(xù)訓(xùn)練從而生成一顆完整的樹(shù)
linkage:一個(gè)字符串,用于指定鏈接算法
‘ward’:單鏈接single-linkage,采用dmindmin
‘complete’:全鏈接complete-linkage算法,采用dmaxdmax
‘a(chǎn)verage’:均連接average-linkage算法,采用davgdavg
pooling_func:一個(gè)可調(diào)用對(duì)象,它的輸入是一組特征的值,輸出是一個(gè)數(shù)
屬性
labels:每個(gè)樣本的簇標(biāo)記
n_leaves_:分層樹(shù)的葉節(jié)點(diǎn)數(shù)量
n_components:連接圖中連通分量的估計(jì)值
children:一個(gè)數(shù)組,給出了每個(gè)非節(jié)點(diǎn)數(shù)量
方法
fit(X[,y]):訓(xùn)練樣本
fit_predict(X[,y]):訓(xùn)練模型并預(yù)測(cè)每個(gè)樣本的簇標(biāo)記
from sklearn import cluster
from sklearn.metrics import adjusted_rand_score
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
"""
產(chǎn)生數(shù)據(jù)
"""
def create_data(centers,num=100,std=0.7):
X,labels_true = make_blobs(n_samples=num,centers=centers, cluster_std=std)
return X,labels_true
"""
數(shù)據(jù)作圖
"""
def plot_data(*data):
X,labels_true=data
labels=np.unique(labels_true)
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
colors='rgbycm'
for i,label in enumerate(labels):
position=labels_true==label
ax.scatter(X[position,0],X[position,1],label="cluster %d"%label),
color=colors[i%len(colors)]
ax.legend(loc="best",framealpha=0.5)
ax.set_xlabel("X[0]")
ax.set_ylabel("Y[1]")
ax.set_title("data")
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
這里寫(xiě)代碼片
"""
測(cè)試函數(shù)
"""
def test_AgglomerativeClustering(*data):
X,labels_true=data
clst=cluster.AgglomerativeClustering()
predicted_labels=clst.fit_predict(X)
print("ARI:%s"% adjusted_rand_score(labels_true, predicted_labels))
"""
考察簇的數(shù)量對(duì)于聚類效果的影響
"""
def test_AgglomerativeClustering_nclusters(*data):
X,labels_true=data
nums=range(1,50)
ARIS=[]
for num in nums:
clst=cluster.AgglomerativeClustering(n_clusters=num)
predicted_lables=clst.fit_predict(X)
ARIS.append(adjusted_rand_score(labels_true, predicted_lables))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(nums,ARIS,marker="+")
ax.set_xlabel("n_clusters")
ax.set_ylabel("ARI")
fig.suptitle("AgglomerativeClustering")
plt.show()
"""
考察鏈接方式對(duì)聚類結(jié)果的影響
"""
def test_agglomerativeClustering_linkage(*data):
X,labels_true=data
nums=range(1,50)
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
linkages=['ward','complete','average']
markers="+o*"
for i,linkage in enumerate(linkages):
ARIs=[]
for num in nums:
clst=cluster.AgglomerativeClustering(n_clusters=num,linkage=linkage)
predicted_labels=clst.fit_predict(X)
ARIs.append(adjusted_rand_score(labels_true, predicted_labels))
ax.plot(nums,ARIs,marker=markers[i],label="linkage:%s"%linkage)
ax.set_xlabel("n_clusters")
ax.set_ylabel("ARI")
ax.legend(loc="best")
fig.suptitle("AgglomerativeClustering")
plt.show()
centers=[[1,1],[2,2],[1,2],[10,20]]
X,labels_true=create_data(centers, 1000, 0.5)
test_AgglomerativeClustering(X,labels_true)
plot_data(X,labels_true)
test_AgglomerativeClustering_nclusters(X,labels_true)
test_agglomerativeClustering_linkage(X,labels_true)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
可以看到當(dāng)n_clusters=4時(shí),ARI指數(shù)最大,因?yàn)榇_實(shí)是從四個(gè)中心點(diǎn)產(chǎn)生的四個(gè)簇。
1
2
可以看到,三種鏈接方式隨分類簇的數(shù)量的總體趨勢(shì)相差無(wú)幾。但是單鏈接方式ward的峰值最大
python實(shí)現(xiàn)一個(gè)層次聚類方法
層次聚類(Hierarchical Clustering) 一.概念 層次聚類不需要指定聚類的數(shù)目,首先它是將數(shù)據(jù)中的每個(gè)實(shí)例看作一個(gè)類,然后將最相似的兩個(gè)類合并,該過(guò)程迭代計(jì)算只到剩下一個(gè)類為止,類 ...
機(jī)器學(xué)習(xí)(6): 層次聚類 hierarchical clustering
假設(shè)有N個(gè)待聚類的樣本,對(duì)于層次聚類來(lái)說(shuō),步驟: ? ? ? ?1.(初始化)把每個(gè)樣本歸為一類,計(jì)算每?jī)蓚€(gè)類之間的距離,也就是樣本與樣本之間的相似度: ? ? ? ?2.尋找各個(gè)類之間最近的兩個(gè)類, ...
吳裕雄 python 機(jī)器學(xué)習(xí)——K均值聚類KMeans模型
import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics ...
吳裕雄 python 機(jī)器學(xué)習(xí)——混合高斯聚類GMM模型
import numpy as np import matplotlib.pyplot as plt from sklearn import mixture from sklearn.metrics ...
Python機(jī)器學(xué)習(xí)算法 — K-Means聚類
K-Means簡(jiǎn)介 步,直到每個(gè)簇的中心基本不再變化: 6)將結(jié)果輸出. K-Means的說(shuō)明 如圖所示,數(shù)據(jù)樣本用圓點(diǎn)表示,每個(gè)簇的中心點(diǎn)用叉叉表示: ? ? ? (a)剛開(kāi)始時(shí)是原始數(shù)據(jù),雜亂無(wú)章 ...
吳裕雄 python 機(jī)器學(xué)習(xí)——層次聚類AgglomerativeClustering模型
import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics ...
機(jī)器學(xué)習(xí)算法總結(jié)(五)——聚類算法(K-means,密度聚類,層次聚類)
本文介紹無(wú)監(jiān)督學(xué)習(xí)算法,無(wú)監(jiān)督學(xué)習(xí)是在樣本的標(biāo)簽未知的情況下,根據(jù)樣本的內(nèi)在規(guī)律對(duì)樣本進(jìn)行分類,常見(jiàn)的無(wú)監(jiān)督學(xué)習(xí)就是聚類算法. 在監(jiān)督學(xué)習(xí)中我們常根據(jù)模型的誤差來(lái)衡量模型的好壞,通過(guò)優(yōu)化損失函數(shù)來(lái)改善 ...
Python機(jī)器學(xué)習(xí)--聚類
K-means聚類算法 測(cè)試: # -*- coding: utf-8 -*- """ Created on Thu Aug 31 10:59:20 2017 @auth ...
100天搞定機(jī)器學(xué)習(xí)|day54 聚類系列:層次聚類原理及案例
幾張GIF理解K-均值聚類原理 k均值聚類數(shù)學(xué)推導(dǎo)與python實(shí)現(xiàn) 前文說(shuō)了k均值聚類,他是基于中心的聚類方法,通過(guò)迭代將樣本分到k個(gè)類中,使每個(gè)樣本與其所屬類的中心或均值最近. 今天我們看一下無(wú)監(jiān) ...
隨機(jī)推薦
Cocos2d-x不要隨便在onEnter里面addChild
使用任何版本的Cocos2d-x(1.x,2.x,3.0),在onEnter中調(diào)用addChild,都要小心謹(jǐn)慎,因?yàn)樗锌赡軐?dǎo)致兩種莫名其妙的BUG,莫名其妙的BUG當(dāng)然難以定位了!更何況這個(gè)BUG ...
安裝centos6.5如何選擇安裝包
(1)系統(tǒng)安裝類型選擇及自定義額外包組 進(jìn)入如圖2-28所示界面.上半部分是系統(tǒng)定制的不同的系統(tǒng)安裝類型選擇項(xiàng),默認(rèn)是"Desktop",這里我們選擇"Minimal&q ...
javascript數(shù)據(jù)結(jié)構(gòu)與算法---列表
javascript數(shù)據(jù)結(jié)構(gòu)與算法---列表 前言:在日常生活中,人們經(jīng)常要使用列表,比如我們有時(shí)候要去購(gòu)物時(shí),為了購(gòu)物時(shí)東西要買全,我們可以在去之前,列下要買的東西,這就要用的列表了,或者我們小時(shí)候 ...
Python多版本共存之pyenv
經(jīng)常遇到這樣的情況: 系統(tǒng)自帶的Python是2.6,自己需要Python?2.7中的某些特性: 系統(tǒng)自帶的Python是2.x,自己需要Python?3.x: 此時(shí)需要在系統(tǒng)中安裝多個(gè)Python, ...
來(lái)講講C#中的類
1.什么是類? 面向?qū)ο蟮恼Z(yǔ)言,最基本的就是類.在C#中,類是這樣來(lái)定義的:類代表一組具有公共屬性和行為的對(duì)象. 舉個(gè)例子,現(xiàn)實(shí)生活中,人就是一個(gè)“類”,但這只是一個(gè)統(tǒng)稱,指所有的人.我們要找個(gè)人一起 ...
【HDU3530】 [Sdoi2014]數(shù)數(shù) (AC自動(dòng)機(jī)+數(shù)位DP)
3530: [Sdoi2014]數(shù)數(shù) Time Limit:?10 Sec??Memory Limit:?512 MBSubmit:?682??Solved:?364 Description 我們稱一 ...
python image show()方法的預(yù)覽問(wèn)題
在windows下面使用PIL中Image的show()函數(shù)時(shí),執(zhí)行下列代碼: from PIL import Image img = Image.open("1.png") ...
python3操作數(shù)據(jù)庫(kù) 借助pycharm快速連接并操作mysql數(shù)據(jù)庫(kù)
1.https://blog.csdn.net/qiushi_1990/article/details/78041299
Android開(kāi)發(fā)小技巧之根據(jù)position判斷ListView是否在顯示
使用ListView的時(shí)候,會(huì)有判斷指定項(xiàng)是否正在顯示的需求,其實(shí)很簡(jiǎn)單,代碼如下: private boolean isShowing(int position) { int showViewCou ...
總結(jié)
以上是生活随笔為你收集整理的层次聚类python实现_Python机器学习——Agglomerative层次聚类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python中oxf2是什么_0x02-
- 下一篇: python 整数输出 d f_pyth