機器學習 之 層次聚類
層次聚類和K-Means是同一類的,屬於劃分聚類。
概述
層次聚類方法對給定的資料集進行層次的分解,直到滿足某種條件為止,傳統的層次聚類演算法主要分為兩大類演算法:
凝聚的層次聚類:AGNES演算法( AGglomerative NESting )=>採用自底向上的策略。 最初將每個物件作為一個簇,然後這些簇根據某些準則被一步一步合併,兩個簇間的距離可以由這兩個不同簇中距離最近的資料點的相似度來確定;聚類的合併過程反覆進行直到所有的物件滿足簇數目。
分裂的層次聚類:DIANA演算法(DIvisive ANALysis)=>採用自頂向下的策略(與二分k-means非常類似)。首先將所有物件置於一個簇中,然後按照某種既定的規則(聚類規則,如k-means)逐漸細分為越來越小的簇(比如最大的歐式距離),直到達到某個終結條件(簇數目或者簇距離達到閾值)。
AGNES和DIANA演算法優缺點
簡單,理解容易
合併點/分裂點選擇不太容易
合併/分類的操作不能進行撤銷
大資料集不太適合
執行效率較低 O(t∗n2)O(t*n^2)O(t∗n2),t為迭代次數,n為樣本點數
接下來著重看一下AGNES演算法中簇間距離的合併策略
最小距離(SL聚類)
兩個聚簇中最近的兩個樣本之間的距離(single/word-linkage聚類法)
最終得到模型容易形成鏈式結構
最大距離(CL聚類)
兩個聚簇中最遠的兩個樣本的距離(complete-linkage聚類法)
如果存在異常值,那麼構建可能不太穩定
平均距離(AL聚類)
兩個聚簇中樣本間兩兩距離的平均值(average-linkage聚類法)
兩個聚簇中樣本間兩兩距離的中值(median-linkage聚類法)
不同的合併策略
程式碼
當然這裡也只是以AGNES為例。
API
引數
n_clusters:聚類數
affinity : string or callable, default: “euclidean”,距離度量公式,預設為歐式
memory:記憶體或磁碟檔案,因為計算量比較大,比較耗記憶體
linkage : {“ward”, “complete”, “average”, “single”}, optional (default=”ward”),相似度度量方式
程式碼
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.neighbors import kneighbors_graph ## KNN的K近鄰計算
import sklearn.datasets as ds
import warnings
## 設定屬性防止中文亂碼及攔截異常資訊
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
warnings.filterwarnings(action='ignore', category=UserWarning)
## 模擬資料產生: 產生600條資料
np.random.seed(0)
n_clusters = 4
N = 1000
data1, y1 = ds.make_blobs(n_samples=N, n_features=2, centers=((-1, 1), (1, 1), (1, -1), (-1, -1)), random_state=0)
n_noise = int(0.1*N)
r = np.random.rand(n_noise, 2)
min1, min2 = np.min(data1, axis=0)
max1, max2 = np.max(data1, axis=0)
r[:, 0] = r[:, 0] * (max1-min1) + min1
r[:, 1] = r[:, 1] * (max2-min2) + min2
data1_noise = np.concatenate((data1, r), axis=0)
y1_noise = np.concatenate((y1, [4]*n_noise))
#擬合月牙形資料
data2, y2 = ds.make_moons(n_samples=N, noise=.05)
data2 = np.array(data2)
n_noise = int(0.1 * N)
r = np.random.rand(n_noise, 2)
min1, min2 = np.min(data2, axis=0)
max1, max2 = np.max(data2, axis=0)
r[:, 0] = r[:, 0] * (max1 - min1) + min1
r[:, 1] = r[:, 1] * (max2 - min2) + min2
data2_noise = np.concatenate((data2, r), axis=0)
y2_noise = np.concatenate((y2, [3] * n_noise))
def expandBorder(a, b):
d = (b - a) * 0.1
return a-d, b+d
## 畫圖
# 給定畫圖的顏色 鄭州婦科醫院哪家好
cm = mpl.colors.ListedColormap(['#FF0000', '#00FF00', '#0000FF', '#d8e507', '#F0F0F0'])
plt.figure(figsize=(14, 12), facecolor='w')
linkages = ("ward", "complete", "average")#把幾種距離方法,放到list裡,後面直接迴圈取值
for index, (n_clusters, data, y) in enumerate(((4, data1, y1), (4, data1_noise, y1_noise),
(2, data2, y2), (2, data2_noise, y2_noise))):
# 前面的兩個4表示幾行幾列,第三個參數列示第幾個子圖(從1開始,從左往右數)
plt.subplot(4, 4, 4*index+1)
plt.scatter(data[:, 0], data[:, 1], c=y, cmap=cm)
plt.title(u'原始資料', fontsize=17)
plt.grid(b=True, ls=':')
min1, min2 = np.min(data, axis=0)
max1, max2 = np.max(data, axis=0)
plt.xlim(expandBorder(min1, max1))
plt.ylim(expandBorder(min2, max2))
# 計算類別與類別的距離(只計算最接近的七個樣本的距離) -- 希望在agens演算法中,在計算過程中不需要重複性的計算點與點之間的距離
connectivity = kneighbors_graph(data, n_neighbors=7, mode='distance', metric='minkowski', p=2, include_self=True)
connectivity = (connectivity + connectivity.T)
for i, linkage in enumerate(linkages):
##進行建模,並傳值
print(n_clusters)
ac = AgglomerativeClustering(n_clusters=n_clusters, affinity='euclidean',
connectivity=connectivity, linkage=linkage)
ac.fit(data)
y = ac.labels_
plt.subplot(4, 4, i+2+4*index)
plt.scatter(data[:, 0], data[:, 1], c=y, cmap=cm)
plt.title(linkage, fontsize=17)
plt.grid(b=True, ls=':')
plt.xlim(expandBorder(min1, max1))
plt.ylim(expandBorder(min2, max2))
plt.suptitle(u'AGNES層次聚類的不同合併策略', fontsize=30)
plt.tight_layout(0.5, rect=(0, 0, 1, 0.95))
plt.show()
4
4
4
4
4
4
2
2
2
2
2
2
得出效果圖
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2686070/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料探勘之 層次聚類聚類
- 【機器學習】--層次聚類從初識到應用機器學習聚類
- 【Python機器學習實戰】聚類演算法(2)——層次聚類(HAC)和DBSCANPython機器學習聚類演算法
- 資料探勘-層次聚類聚類
- 機器學習-聚類分析之DBSCAN機器學習聚類
- 09聚類演算法-層次聚類-CF-Tree、BIRCH、CURE聚類演算法
- 機器學習——dbscan密度聚類機器學習聚類
- 機器學習(8)——其他聚類機器學習聚類
- 一文讀懂層次聚類(Python程式碼)聚類Python
- 機器學習入門|聚類(二)機器學習聚類
- 演算法金 | K-均值、層次、DBSCAN聚類方法解析演算法聚類
- 機器學習演算法筆記之8:聚類演算法機器學習演算法筆記聚類
- 【機器學習】K-means聚類分析機器學習聚類
- 前端架構思想:聚類分層前端架構聚類
- 聚類之K均值聚類和EM演算法聚類演算法
- 機器學習Sklearn系列:(五)聚類演算法機器學習聚類演算法
- 【機器學習】--譜聚類從初始到應用機器學習聚類
- 【Python機器學習實戰】聚類演算法(1)——K-Means聚類Python機器學習聚類演算法
- 機器學習之k-means聚類演算法(python實現)機器學習聚類演算法Python
- 【機器學習】---密度聚類從初識到應用機器學習聚類
- 《Spark機器學習》筆記——Spark構建聚類模型Spark機器學習筆記聚類模型
- 從零開始學機器學習——聚類視覺化機器學習聚類視覺化
- 聚類之dbscan演算法聚類演算法
- 從零開始學機器學習——K-Means 聚類機器學習聚類
- 機器學習(五):混合高斯聚類GMM(求聚類標籤)+PCA降維(3維降2維)習題機器學習聚類PCA
- ML.NET 示例:聚類之鳶尾花聚類
- 分類 和 聚類聚類
- 聚類分析聚類
- 機器學習演算法(22)python實現用scikit-learn進行全連線的凝聚層次聚類演算法(Agglo-merative-Clustering)機器學習演算法Python聚類
- 9.1.6 DBSCAN聚類演算法————機器學習實戰第二版聚類演算法機器學習
- 層級聚類和Python實現的初學者指南(附連結)聚類Python
- mahout之聚類演算法——KMeans分析聚類演算法
- 三層網路結構(核心層、匯聚層 、接入層)
- 聚類(part3)--高階聚類演算法聚類演算法
- 機器學習中的聚類演算法演變及學習筆記機器學習聚類演算法筆記
- 機器學習—聚類5-1(K-Means演算法+瑞士捲)機器學習聚類演算法
- 《機器學習實戰》kMeans演算法(K均值聚類演算法)機器學習演算法聚類
- 教你文字聚類聚類