吳恩達《Machine Learning》精煉筆記 8:聚類 KMeans 及其 Python實現

红色石头發表於2021-01-16

系列文章:

吳恩達《Machine Learning》精煉筆記 1:監督學習與非監督學習

吳恩達《Machine Learning》精煉筆記 2:梯度下降與正規方程

吳恩達《Machine Learning》精煉筆記 3:迴歸問題和正則化

吳恩達《Machine Learning》精煉筆記 4:神經網路基礎

吳恩達《Machine Learning》精煉筆記 5:神經網路

吳恩達《Machine Learning》精煉筆記 6:關於機器學習的建議

吳恩達《Machine Learning》精煉筆記 7:支援向量機 SVM

本週的主要知識點是無監督學習中的兩個重點:聚類和降維。本文中首先介紹的是聚類中的K均值演算法,包含:

  • 演算法思想
  • 圖解K-Means
  • sklearn實現
  • Python實現

無監督學習unsupervised learning

無監督學習簡介

聚類和降維是無監督學習方法,在無監督學習中資料是沒有標籤的。

比如下面的資料中,橫縱軸都是xx,沒有標籤(輸出yy)。在非監督學習中,我們需要將一系列無標籤的訓練資料,輸入到一個演算法中,快速這個資料的中找到其內在資料結構。

無監督學習應用

  • 市場分割
  • 社交網路分析
  • 組織計算機叢集
  • 瞭解星系的形成

聚類

聚類clustering

聚類試圖將資料集中的樣本劃分成若干個通常是不相交的子集,稱之為“簇cluster”。聚類可以作為一個單獨過程,用於尋找資料內部的分佈結構,也能夠作為其他學習任務的前驅過程。聚類演算法涉及到的兩個問題:效能度量和距離計算

效能度量

聚類效能度量也稱之為“有效性指標”。希望“物以類聚”。聚類的結果是“簇內相似度高”和“簇間相似度低”。

常用的外部指標是:

1.Jaccard 係數
2.FM 係數
3.Rand 係數

上述3個係數的值都在[0,1]之間,越小越好

常用的內部指標是:

1.DB指數
2.Dunn指數

DBI的值越小越好,Dunn的值越大越好。

距離計算

xi,xj 的Lp的距離定義為:

規定:p≥1,常用的距離計算公式有

  • 當p=2時,即為歐式距離,比較常用,即:

  • 當p=1時,即曼哈頓距離,即:

  • 當p趨於無窮,為切比雪夫距離,它是各個座標距離的最大值:

餘弦相似度

餘弦相似度的公式為:

Pearson皮爾遜相關係數

皮爾遜相關係數的公式如下:

K-均值演算法

演算法思想

K-均值,也叫做k-means演算法,最常見的聚類演算法,演算法接受一個未標記的資料集,然後將資料聚類成不同的組。假設將資料分成n個組,方法為:

  • 隨機選擇K個點,稱之為“聚類中心”
  • 對於資料集中的每個資料,按照距離K箇中心點的距離,將其和距離最近的中心點關聯起來,與同個中心點關聯的所有點聚成一類。
  • 計算上面步驟中形成的類的平均值,將該組所關聯的中心點移動到平均值的位置
  • 重複上面兩個步驟,直到中心點不再變化。

圖解K-means

1.給定需要劃分的資料,隨機確定兩個聚類中心點
2.計算其他資料和這兩個中心點的距離,劃入距離小的類中,假設兩個類是C1,C2
3.確定上述步驟中兩個類是C1,C2的均值,這個均值就是新的聚類中心
4.重複:計算資料和這兩個中心點的距離,劃入距離小的類中,形成新的類;再確定新的聚類中心
5.直至中心點不再變化,結束

全過程

K-means演算法過程

吳恩達視訊的中的虛擬碼為

repeat {
  for i= to m
  #  計算每個樣例屬於的類
  c(i) := index (from 1 to K)  of cluster centroid closest to x(i)

 for k = 1 to K
  # 聚類中心的移動,重新計算該類的質心
 u(k) := average (mean) of points assigned to cluster K
}

西瓜書中的虛擬碼

優化目標Optimization Objective

K-均值最小化問題,是要最小化所有的資料點與其所關聯的聚類中心點之間的距離之和,因此 K-均值的代價函式(畸變函式Distortion function) :

其中μ代表與xi最近的聚類中心點

優化目標就是找出使得代價函式最小的c和μ,即:

隨機初始化

在執行K-均值演算法的之前,首先要隨機初始化所有的聚類中心點:

  • 選擇K<m,即聚類中心的個數小於訓練樣本的例項數量
  • 隨機訓練K個訓練例項,然後令K個聚類中心分別和這K個訓練例項相等

關於K-means的區域性最小值問題:

Scikit learn 實現K-means

make_blobs資料集

make_blobs聚類資料生成器make_blobs方法常被用來生成聚類演算法的測試資料。它會根據使用者指定的特徵數量、中心點數量、範圍等來生成幾類資料。

主要引數

sklearn.datasets.make_blobs(n_samples=100, n_features=2,centers=3, cluster_std=1.0, center_box=(-10.0, 10.0), shuffle=True, random_state=None)[source]
  • n_samples是待生成的樣本的總數
  • n_features是每個樣本的特徵數
  • centers表示類別數
  • cluster_std表示每個類別的方差
import numpy as np
import matplotlib.pyplot as plt
# 匯入 KMeans 模組和資料集
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 定義畫布
plt.figure(figsize=(12,12))

# 定義樣本量和隨機種子
n_samples = 1500
random_state = 170

# X是測試資料集,y是目標分類標籤0,1,2
X, y = make_blobs(n_samples=n_samples, random_state=random_state)

X
array([[-5.19811282e+00,  6.41869316e-01],
       [-5.75229538e+00,  4.18627111e-01],
       [-1.08448984e+01, -7.55352273e+00],
       ...,
       [ 1.36105255e+00, -9.07491863e-01],
       [-3.54141108e-01,  7.12241630e-01],
       [ 1.88577252e+00,  1.41185693e-03]])

y
array([1, 1, 0, ..., 2, 2, 2])

# 預測值的簇類
y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)
y_pred
array([0, 0, 1, ..., 0, 0, 0], dtype=int32)

X[:,0]  # 所有行的第1列資料
array([ -5.19811282,  -5.75229538, -10.84489837, ...,   1.36105255,
        -0.35414111,   1.88577252])

# 子圖1的繪製
plt.subplot(221)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.title("incorrrect Number of Blods")

transformation = [[0.60834549, -0.63667341],[-0.40887718, 0.85253229]]
X_aniso = np.dot(X, transformation)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_aniso)
# 子圖2的繪製
plt.subplot(222)
plt.scatter(X_aniso[:, 0], X_aniso[:, 1], c=y_pred)
plt.title("Anisotropicly Distributed Blobs")

X_varied, y_varied = make_blobs(n_samples=n_samples,
                               cluster_std=[1.0,2.5,0.5],random_state=random_state)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_varied)
plt.subplot(223)
plt.scatter(X_varied[:, 0], X_varied[:, 1], c=y_pred)
plt.title("Unequal Variance")

X_filtered = np.vstack((X[y == 0][:500],
                      X[y == 1][:100],
                      X[y == 2][:10]))
y_pred = KMeans(n_clusters=3,random_state=random_state).fit_predict(X_filtered)
plt.subplot(224)
plt.scatter(X_filtered[:, 0],
           X_filtered[:, 1],
           c=y_pred)
plt.title("Unevenly Sized Blobs")
plt.show()

基於 python實現K-means演算法

這是在網上找到的一個基於Python找到的K-means實驗演算法,學習使用


本文首發於公眾號:AI有道(ID: redstonewill),歡迎關注!

相關文章