1.4 凝聚聚類(agglomerative)
1.4.1原理
凝聚聚類(agglomerative clustering)指的是許多基于相同原則建構的聚類算法,這一原則是:算法首先聲明每個點是自己的簇,然後合并兩個最相似的簇,直到滿足某種停止準則為止
度量相似值,Sklearn有四種選項:linkage : {"ward", "complete", "average", "single"}, optional (預設="ward")
- ward連結:預設選項,挑選兩個簇來合并,是的所有簇中的方差增加最小。這通常會得到大小差不多相等的簇。
- average連結:也稱為均連結,将簇中所有點之間"平均距離" 最小的兩個簇合并。
- complete連結:也稱為最大連結,将簇中點之間"最大距離"最小的兩個簇合并。
- single連結:也稱單連結,将簇中所有點之間"最小距離"最小的兩個簇合并
ward适用于大多數資料集。如果簇中的成員個數非常不同(比如其中一個比其他所有都大得多),那麼average或complete可能效果更好。
1.4.2類參數、屬性和方法
類
class sklearn.cluster.AgglomerativeClustering(n_clusters=2, *, affinity='euclidean', memory=None, connectivity=None, compute_full_tree='auto', linkage='ward', distance_threshold=None, compute_distances=False
複制
屬性
屬性 | 類别 | 介紹 |
---|---|---|
n_clusters_ | int | 算法找到的聚類數。如果距離門檻值=無,它将等于給定的n個聚類。 |
labels_ | ndarray of shape (n_samples) | 每個點的聚類标簽 |
n_leaves_ | int | 分層樹中的樹葉數量 |
n_connected_components_ | int | 圖中連接配接元件的估計數量 |
children_ | array-like of shape (n_samples-1, 2) | 每個非葉節點的子節點。小于n_samples的值對應于作為原始樣本的樹葉。大于或等于n_samples的節點I是非葉節點,并且具有子代子代_[i - n_samples]。或者,在第I次疊代中,子[i][0]和子[i][1]被合并以形成節點n_samples + i |
distances_ | array-like of shape (n_nodes-1,) | children_中相應位置的節點之間的距離。僅當使用距離門檻值或計算距離設定為真時才計算。 |
方法
fit(X[, y, sample_weight]) | 根據特征或距離矩陣執行DBSCAN聚類。 |
---|---|
fit_predict(X[, y, sample_weight]) | 從要素或距離矩陣執行DBSCAN聚類,并傳回聚類标簽。 |
get_params([deep]) | 擷取此估計器的參數。 |
set_params(**params) | 設定此估計器的參數。 |
1.4.3對make_blobs資料進行凝聚聚類算法分析
#凝聚算法
from scipy.cluster.hierarchy import dendrogram,ward
def agglomerative_algorithm():
mglearn.plots.plot_agglomerative_algorithm()
plt.show()
blobs = make_blobs(random_state=1,centers=1)
x_blobs = blobs[0]
#使用連線方式進行可視化
linkage =ward(x_blobs)
dendrogram(linkage)
ax = plt.gca() # gca:Get Current Axes
#設定橫縱軸标簽
plt.xlabel("sample index")
plt.ylabel("Cluster distance")
plt.show()
複制
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuQDZxEGO4YjZhJ2Y1ImZiFjN0AjZ4MDMwUWMiVWOkN2Nvw1N2YzNxUjNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
from sklearn.cluster import AgglomerativeClustering
def AgglomerativeClustering_for_blobs ():
blobs = make_blobs(random_state=1,centers=1)
X = blobs[0]
y = blobs[1]
#設定簇個數為3
AC = AgglomerativeClustering(n_clusters=3)
result = AC.fit_predict(X)
print("訓練集資料集配置設定簇标簽為:\n{}".format(AC.labels_))
print("對訓練集資料集預測結果為:\n{}".format(result))
#畫出聚類後的資料集圖像
mglearn.discrete_scatter(X[:,0], X[:,1],AC.labels_,markers='o')
plt.show()
複制
輸出
訓練集資料集配置設定簇标簽為:
[1 1 0 2 1 2 2 1 0 2 1 2 0 0 1 2 2 0 0 0 2 0 2 2 0 1 2 2 1 1 2 0 0 0 2 0 2 0 0 0 2 1 0 0 2 2 2 1 0 0 0 1 2 2 2 2 2 2 2 2 2 2 2 0 0 1 0 0 0 2 2 1 2 2 2 1 2 0 0 0 2 0 2 2 0 1 2 1 2 0 2 0 2 2 2 2 0 2 2 1]
對訓練集資料集預測結果為:
[1 1 0 2 1 2 2 1 0 2 1 2 0 0 1 2 2 0 0 0 2 0 2 2 0 1 2 2 1 1 2 0 0 0 2 0 2 0 0 0 2 1 0 0 2 2 2 1 0 0 0 1 2 2 2 2 2 2 2 2 2 2 2 0 0 1 0 0 0 2 2 1 2 2 2 1 2 0 0 0 2 0 2 2 0 1 2 1 2 0 2 0 2 2 2 2 0 2 2 1]
複制
1.4.4 凝聚聚類分析鸢尾花資料
def AgglomerativeClustering_for_iris():
myutil = util()
X,y = datasets.load_iris().data,datasets.load_iris().target
AC = AgglomerativeClustering(n_clusters=3)
AC.fit(X)
result = AC.fit_predict(X)
title = "鸢尾花"
myutil.draw_scatter_for_Clustering(X,y,result,title,"凝聚算法")
複制
輸出
鸢尾花原始資料集配置設定簇标簽為:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
鸢尾花 凝聚算法 訓練簇标簽為:
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 2 0 2 2 2 2 2 2 0 0 2 2 2 2 0 2 0 2 0 2 2 0 0 2 2 2 2 2 0 0 2 2 2 0 2 2 2 0 2 2 2 0 2 2 0]
複制
1.4.5 凝聚聚類分析紅酒資料
def AgglomerativeClustering_for_wine():
myutil = util()
X,y = datasets.load_wine().data,datasets.load_wine().target
AC = AgglomerativeClustering(n_clusters=3)
AC.fit(X)
result = AC.fit_predict(X)
title = "紅酒"
myutil.draw_scatter_for_Clustering(X,y,result,title,"凝聚算法")
複制
輸出
紅酒原始資料集配置設定簇标簽為:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
紅酒 凝聚算法 訓練簇标簽為:
[0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 0 0 2 2 0 0 2 0 0 0 0 0 0 2 2 0 0 2 2 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 2 1 1 2 1 1 2 2 2 1 1 0 2 1 1 1 2 1 1 2 2 1 1 1 1 1 2 2 1 1 1 1 1 0 2 1 2 1 2 1 1 1 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 2 2 2 1 1 1 1 2 1 1 2 2 1 2 2 1 1 1 1 2 2 2 1 2 2 2 1 2 1 2 2 1 2 2 2 2 1 1 2 2 2 2 2 1]
複制
1.4.6 凝聚聚類分析乳腺癌資料
def AgglomerativeClustering_for_breast_cancer():
myutil = util()
X,y = datasets.load_breast_cancer().data,datasets.load_breast_cancer().target
AC = AgglomerativeClustering(n_clusters=2)
AC.fit(X)
result = AC.fit_predict(X)
title = "乳腺癌"
myutil.draw_scatter_for_Clustering(X,y,result,title,"凝聚算法")
複制
輸出
乳腺癌原始資料集配置設定簇标簽為:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
…
1 1 1 1 1 1 1 0 0 0 0 0 0 1]
乳腺癌 凝聚算法 訓練簇标簽為:
[1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0
…
0 0 0 0 0 0 0 0 1 1 1 0 1 0]
複制
1.4.7 凝聚聚類分析兩個月亮資料
#兩個月亮
def KMeans_for_two_moon():
myutil = util()
X, y = datasets.make_moons(n_samples=200,noise=0.05, random_state=0)
scaler = StandardScaler()
scaler.fit(X)
X_scaled = scaler.transform(X)
# 列印處理後的資料形态
print("處理後的資料形态:",X_scaled.shape)
# 處理後的資料形态: (200, 2) 200個樣本 2類
Kmeans = KMeans(n_clusters=2)
result=Kmeans.fit_predict(X_scaled)
title = "兩個月亮"
#繪制簇配置設定結果
myutil.draw_scatter_for_Clustering(X,y,result,title,"KMeans")
複制
輸出
處理後的資料形态: (200, 2)
兩個月亮原始資料集配置設定簇标簽為:
[0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 1
0 0 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1
1 0 1 0 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 0 1 0 0
0 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 1 1
0 1 1 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1
0 0 1 0 0 0 0 0 0 1 0 1 1 0 1]
兩個月亮 凝聚算法 訓練簇标簽為:
[0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0
0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0
0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 1
1 1 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0
1 0 0 0 0 1 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 1 1 1 0 1 0 0 0
複制
1 1 0 1 1 1 1 0 0 0 1 0 0 1 0]