機器學習 之 層次聚類

ckxllf發表於2020-04-14

  層次聚類和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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章