层次聚类python实现_Python机器学习——Agglomerative层次聚类
層次聚類(hierarchical clustering)可在不同層次上對數(shù)據(jù)集進行劃分,形成樹狀的聚類結(jié)構(gòu)。AggregativeClustering是一種常用的層次聚類算法。
其原理是:最初將每個對象看成一個簇,然后將這些簇根據(jù)某種規(guī)則被一步步合并,就這樣不斷合并直到達到預(yù)設(shè)的簇類個數(shù)。這里的關(guān)鍵在于:如何計算聚類簇之間的距離?
由于每個簇就是一個集合,因此需要給出集合之間的距離。給定聚類簇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)
它是兩個簇的樣本對之間距離的最小值。
最大距離:
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)
它是兩個簇的樣本對之間距離的最大值。
平均距離:
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)
它是兩個簇的樣本對之間距離的平均值。
當該算法的聚類簇采用dmindmin時,稱為單鏈接single-linkage算法,當該算法的聚類簇采用dmaxdmax時,稱為單鏈接complete-linkage算法,當該算法的聚類簇采用davgdavg時,稱為單鏈接average-linkage算法。
下面給出算法:
輸入:
數(shù)據(jù)集D=D={x??1,x??2,...,x??Nx→1,x→2,...,x→N}
聚類簇距離度量函數(shù)
聚類簇數(shù)量KK
輸出:簇劃分C=C={C1,C2,...,CKC1,C2,...,CK}
算法步驟如下:
初始化:將每個樣本都作為一個簇
Ci=[x??i],i=1,2,...,NCi=[x→i],i=1,2,...,N
迭代:終止條件為聚類簇的數(shù)量為K。迭代過程如下:
計算聚類簇之間的距離,找出距離最近的兩個簇,將這兩個簇合并。
Python實戰(zhàn)
AgglomerativeClustering是scikit-learn提供的層級聚類算法模型,其原型為:
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:一個整數(shù),指定分類簇的數(shù)量
connectivity:一個數(shù)組或者可調(diào)用對象或者None,用于指定連接矩陣
affinity:一個字符串或者可調(diào)用對象,用于計算距離。可以為:’euclidean’,’l1’,’l2’,’mantattan’,’cosine’,’precomputed’,如果linkage=’ward’,則affinity必須為’euclidean’
memory:用于緩存輸出的結(jié)果,默認為不緩存
n_components:在 v-0.18中移除
compute_full_tree:通常當訓(xùn)練了n_clusters后,訓(xùn)練過程就會停止,但是如果compute_full_tree=True,則會繼續(xù)訓(xùn)練從而生成一顆完整的樹
linkage:一個字符串,用于指定鏈接算法
‘ward’:單鏈接single-linkage,采用dmindmin
‘complete’:全鏈接complete-linkage算法,采用dmaxdmax
‘a(chǎn)verage’:均連接average-linkage算法,采用davgdavg
pooling_func:一個可調(diào)用對象,它的輸入是一組特征的值,輸出是一個數(shù)
屬性
labels:每個樣本的簇標記
n_leaves_:分層樹的葉節(jié)點數(shù)量
n_components:連接圖中連通分量的估計值
children:一個數(shù)組,給出了每個非節(jié)點數(shù)量
方法
fit(X[,y]):訓(xùn)練樣本
fit_predict(X[,y]):訓(xùn)練模型并預(yù)測每個樣本的簇標記
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
這里寫代碼片
"""
測試函數(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ù)量對于聚類效果的影響
"""
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()
"""
考察鏈接方式對聚類結(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
可以看到當n_clusters=4時,ARI指數(shù)最大,因為確實是從四個中心點產(chǎn)生的四個簇。
1
2
可以看到,三種鏈接方式隨分類簇的數(shù)量的總體趨勢相差無幾。但是單鏈接方式ward的峰值最大
python實現(xiàn)一個層次聚類方法
層次聚類(Hierarchical Clustering) 一.概念 層次聚類不需要指定聚類的數(shù)目,首先它是將數(shù)據(jù)中的每個實例看作一個類,然后將最相似的兩個類合并,該過程迭代計算只到剩下一個類為止,類 ...
機器學(xué)習(xí)(6): 層次聚類 hierarchical clustering
假設(shè)有N個待聚類的樣本,對于層次聚類來說,步驟: ? ? ? ?1.(初始化)把每個樣本歸為一類,計算每兩個類之間的距離,也就是樣本與樣本之間的相似度: ? ? ? ?2.尋找各個類之間最近的兩個類, ...
吳裕雄 python 機器學(xué)習(xí)——K均值聚類KMeans模型
import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics ...
吳裕雄 python 機器學(xué)習(xí)——混合高斯聚類GMM模型
import numpy as np import matplotlib.pyplot as plt from sklearn import mixture from sklearn.metrics ...
Python機器學(xué)習(xí)算法 — K-Means聚類
K-Means簡介 步,直到每個簇的中心基本不再變化: 6)將結(jié)果輸出. K-Means的說明 如圖所示,數(shù)據(jù)樣本用圓點表示,每個簇的中心點用叉叉表示: ? ? ? (a)剛開始時是原始數(shù)據(jù),雜亂無章 ...
吳裕雄 python 機器學(xué)習(xí)——層次聚類AgglomerativeClustering模型
import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics ...
機器學(xué)習(xí)算法總結(jié)(五)——聚類算法(K-means,密度聚類,層次聚類)
本文介紹無監(jiān)督學(xué)習(xí)算法,無監(jiān)督學(xué)習(xí)是在樣本的標簽未知的情況下,根據(jù)樣本的內(nèi)在規(guī)律對樣本進行分類,常見的無監(jiān)督學(xué)習(xí)就是聚類算法. 在監(jiān)督學(xué)習(xí)中我們常根據(jù)模型的誤差來衡量模型的好壞,通過優(yōu)化損失函數(shù)來改善 ...
Python機器學(xué)習(xí)--聚類
K-means聚類算法 測試: # -*- coding: utf-8 -*- """ Created on Thu Aug 31 10:59:20 2017 @auth ...
100天搞定機器學(xué)習(xí)|day54 聚類系列:層次聚類原理及案例
幾張GIF理解K-均值聚類原理 k均值聚類數(shù)學(xué)推導(dǎo)與python實現(xiàn) 前文說了k均值聚類,他是基于中心的聚類方法,通過迭代將樣本分到k個類中,使每個樣本與其所屬類的中心或均值最近. 今天我們看一下無監(jiān) ...
隨機推薦
Cocos2d-x不要隨便在onEnter里面addChild
使用任何版本的Cocos2d-x(1.x,2.x,3.0),在onEnter中調(diào)用addChild,都要小心謹慎,因為它有可能導(dǎo)致兩種莫名其妙的BUG,莫名其妙的BUG當然難以定位了!更何況這個BUG ...
安裝centos6.5如何選擇安裝包
(1)系統(tǒng)安裝類型選擇及自定義額外包組 進入如圖2-28所示界面.上半部分是系統(tǒng)定制的不同的系統(tǒng)安裝類型選擇項,默認是"Desktop",這里我們選擇"Minimal&q ...
javascript數(shù)據(jù)結(jié)構(gòu)與算法---列表
javascript數(shù)據(jù)結(jié)構(gòu)與算法---列表 前言:在日常生活中,人們經(jīng)常要使用列表,比如我們有時候要去購物時,為了購物時東西要買全,我們可以在去之前,列下要買的東西,這就要用的列表了,或者我們小時候 ...
Python多版本共存之pyenv
經(jīng)常遇到這樣的情況: 系統(tǒng)自帶的Python是2.6,自己需要Python?2.7中的某些特性: 系統(tǒng)自帶的Python是2.x,自己需要Python?3.x: 此時需要在系統(tǒng)中安裝多個Python, ...
來講講C#中的類
1.什么是類? 面向?qū)ο蟮恼Z言,最基本的就是類.在C#中,類是這樣來定義的:類代表一組具有公共屬性和行為的對象. 舉個例子,現(xiàn)實生活中,人就是一個“類”,但這只是一個統(tǒng)稱,指所有的人.我們要找個人一起 ...
【HDU3530】 [Sdoi2014]數(shù)數(shù) (AC自動機+數(shù)位DP)
3530: [Sdoi2014]數(shù)數(shù) Time Limit:?10 Sec??Memory Limit:?512 MBSubmit:?682??Solved:?364 Description 我們稱一 ...
python image show()方法的預(yù)覽問題
在windows下面使用PIL中Image的show()函數(shù)時,執(zhí)行下列代碼: from PIL import Image img = Image.open("1.png") ...
python3操作數(shù)據(jù)庫 借助pycharm快速連接并操作mysql數(shù)據(jù)庫
1.https://blog.csdn.net/qiushi_1990/article/details/78041299
Android開發(fā)小技巧之根據(jù)position判斷ListView是否在顯示
使用ListView的時候,會有判斷指定項是否正在顯示的需求,其實很簡單,代碼如下: private boolean isShowing(int position) { int showViewCou ...
總結(jié)
以上是生活随笔為你收集整理的层次聚类python实现_Python机器学习——Agglomerative层次聚类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中oxf2是什么_0x02-
- 下一篇: Java7运行applet_Java a