人工智慧 (05) 機器學習 - 無監督式學習群集方法

Jason990420發表於2019-12-19

檔案建立日期: 2019/12/19
最後修訂日期: None
相關軟體資訊:

  • Windows 10
  • Python 3.7.2
  • Numpy 1.17.3
  • sklearn 0.21.3
  • matplotlib 3.1.1
  • pandas 0.25.1

參考檔案: AI with Python Tutorial

說明: 所有內容歡迎引用, 只需註明來源及作者, 本文內容如有錯誤或用詞不當, 敬請指正.

標題: 人工智慧 (05) 機器學習 - 無監督式學習群集方法

無監督式的機器學習演算法沒有任何監督者可以提供任何型別的指導. 聚集主要是將觀測值集合劃分為子集.

資料群集演算法

  1. K-均值演算法 ( K-Means algorithm ) - 這是一個迭代演算法, 因此我們需要在每次迭代時更新K個質心的位置, 直到找到全域性最優值.
    • 指定所需的K個子組數.
    • 固定群集數量, 並將每個資料點隨機分配給群集.
  2. 均值漂移演算法 ( Mean Shift Algorithm ) - 它沒有做任何假設, 因此它是一個非引數演算法. 也稱為分層群集 ( hierarchical clustering ) 或均值漂移群集分析 ( mean shift cluster analysis ).
    • 從分配給它們自己群集的資料點開始.
    • 計算質心並更新新質心的位置.
    • 重複此過程, 我們將群集的峰值移近, 即移向密度較高的區域.
    • 在質心不再移動的階段停止.

衡量群集效能

  1. 輪廓分析 ( Silhouette Analysis ) - 通過測量群集之間的距離來檢查群集的質量.
    輪廓得分分析
    • 值的範圍: [-1, 1]群集
    • 1 - 群集遠離其他的群集
    • 0 - 群集很接近其他的群集
    • -1 - 樣品被指定到錯誤的群集
  2. 計算輪廓分數 ( Calculating Silhouette Score )
    silhousette score = (p-q)/max(p,q)
    p是到該資料點不屬於的最近群集中, 點的平均距離. 並且, q是到其自身群集中所有點的群集內平均距離, 可以用來判斷最佳群數.

尋找最近的鄰居 ( Finding Nearest Neighbors )

  1. K-近鄰演算法( KNN, K-nearest neighbors ) - 從給定資料集中查詢到輸入點最近的點的過程. 在輸入資料點與各種類別的鄰近度上對資料點進行分類.
  2. KNN 分類器 - 使用最近鄰居演算法對給定資料點進行分類的分類模型.
    找到預定數量, 即距離最接近新樣本的訓練樣本的'k'-必須分類. 新樣本將從鄰居本身獲取標籤. KNN分類器具有一個固定的使用者定義常量, 用於必須確定的鄰居數量. 對於距離, 標準歐幾里德距離是最常見的選擇. KNN分類器直接在學習的樣本上工作, 而不是建立學習規則.

示例 1. K-均值演算法

# -----------------------------------------------------------------------------
# K-Means algorithm
# -----------------------------------------------------------------------------

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets.samples_generator import make_blobs

# Create two-dimensional dataset, containing four blobs

X, y_true = make_blobs(n_samples=500, centers=4,    # 用來生成群集演算法的測試資料
            cluster_std=0.40, random_state=0)       # 500個樣本, 4箇中心點
                                                    # 標準偏差為0.4
kmeans = KMeans(n_clusters=4)                       # 建立K-Means
kmeans.fit(X)                                       # 訓練 & 預測
y_kmeans = kmeans.predict(X)
centers = kmeans.cluster_centers_                   # 群集的中心座標

# 畫圖顯示分佈及中心點
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5);
plt.show()

人工智慧 (05) 機器學習 - 無監督式學習群集方法

示例 2. 均值漂移演算法

# -----------------------------------------------------------------------------
# Mean Shift clustering algorithm
# -----------------------------------------------------------------------------

import numpy as np
from sklearn.cluster import MeanShift
from sklearn.datasets.samples_generator import make_blobs
import matplotlib.pyplot as plt
from matplotlib import style

style.use("ggplot")

centers = [[2,2],[4,5],[3,10]]              # 用來生成群集演算法的測試資料,
X, _ = make_blobs(n_samples = 500,          # 500個樣本, 三個中心點, 標準偏差為 1
        centers = centers, cluster_std = 1)

ms = MeanShift()                            # 建立均值漂移演算法
ms.fit(X)                                   # 訓練
labels = ms.labels_                         # 每一點的標籤
cluster_centers = ms.cluster_centers_       # 每個群集的中心座標
n_clusters_ = len(np.unique(labels))        # 不同標籤的數量就是群數

colors = 10*['b.','g.','c.','k.','y.','m.']    # 群顏色, 預訂最多70組
for i in range(len(X)):                        # 每6次顏色重來
    plt.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 10)  # 畫所有的點
plt.scatter(cluster_centers[:,0],cluster_centers[:,1],              # 畫群中心點
        marker="x",color='k', s=150, linewidths = 5, zorder=10)
plt.show()

人工智慧 (05) 機器學習 - 無監督式學習群集方法

例 3. 計算輪廓分數

# -----------------------------------------------------------------------------
# Calculating Silhouette Score
# -----------------------------------------------------------------------------

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics

from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs(n_samples=500, centers=4,    # 用來生成群集演算法的測試資料
cluster_std=0.40, random_state=0)                   # 500個樣本, 四個中心點,
                                                    # 標準偏差為 0.4
scores = []
values = np.arange(2, 10)
for num_clusters in values:                     # 從2群找到9群
    kmeans = KMeans(init='k-means++',           # 選擇較好的起始中心點, 加速收斂
                    n_clusters=num_clusters,    # 群數
                    n_init=10)                  # 不同質心種子下執行10次
    kmeans.fit(X)                               # 訓練

    score = metrics.silhouette_score(   # 計算平均輪廓係數
            X, kmeans.labels_,          # 樣品預估標籤
            metric='euclidean',         # 計算距離度量, 兩點x,y平方差總和開根號
            sample_size=len(X))         # 樣品數
    scores.append(score)
num_clusters = np.argmax(scores) + values[0]    # scores中最高的群數, 2開始算起

例 4. K-近鄰演算法

# -----------------------------------------------------------------------------
# KNN (K-Nearest Neighbors)
# -----------------------------------------------------------------------------

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import NearestNeighbors

A = np.array([[3.1, 2.3], [2.3, 4.2], [3.9, 3.5], [3.7, 6.4], [4.8, 1.9],
              [8.3, 3.1], [5.2, 7.5], [4.8, 4.7], [3.5, 5.1], [4.4, 2.9],])
k = 3
test_data = [3.3, 2.9]

knn_model = NearestNeighbors(               # 建模訓練
            n_neighbors=k,                  # 用於查詢的鄰居數
            algorithm='auto').fit(A)        # 按輸入資料自動使用最合適的演算法

# 傳回每個點的K個鄰居區域裡最近的幾個點到鄰居的距離以及下標。
distances, indices = knn_model.kneighbors([test_data])

plt.figure()                                # 畫圖
plt.title('Nearest neighbors')
plt.scatter(A[:, 0], A[:, 1], marker='o', s=100, color='k')
plt.scatter(A[indices][0][:][:, 0], A[indices][0][:][:, 1],
marker='o', s=250, color='k', facecolors='none')
plt.scatter(test_data[0], test_data[1],
marker='x', s=100, color='k')
plt.show()

人工智慧 (05) 機器學習 - 無監督式學習群集方法

例 5. KNN分類器

# -----------------------------------------------------------------------------
# KNN Classifier
# -----------------------------------------------------------------------------

from sklearn.datasets import *
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
import numpy as np

def Image_display(i):                           # 用來顯示圖片的函式
    plt.imshow(digit['images'][i],cmap='Greys_r')
    plt.show()

digit = load_digits()                           # 載入數字圖 (8x8)
digit_d = pd.DataFrame(digit['data'][0:1600])   # 字典轉換成 pandas 的 DataFrame

train_x= digit['data'][:1600]                   # 資料分配
train_y = digit['target'][:1600]
KNN = KNeighborsClassifier(20)                  # 建立K-Neighbos分類器, 20個鄰居
KNN.fit(train_x,train_y)                        # 訓練

test = np.array(digit['data'][1725])            # 測試資料圖: 數字'6'
test1 = test.reshape(1,-1)                      # shape (64,) => shape (1, 64)

test_predict = KNN.predict(test1)               # 預估結果: array([6])

Jason Yang

相關文章