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