日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

Python机器学习——Agglomerative层次聚类

發(fā)布時(shí)間:2024/6/21 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 Python机器学习——Agglomerative层次聚类 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

層次聚類(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=<function mean>)

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’:?jiǎn)捂溄觭ingle-linkage,采用dmindmin
‘complete’:全鏈接complete-linkage算法,采用dmaxdmax
‘average’:均連接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

這里寫代碼片
"""
    測(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的峰值最大

總結(jié)

以上是生活随笔為你收集整理的Python机器学习——Agglomerative层次聚类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。