返回文章列表

無監督學習演算法探索密度估計與聚類別分析

本文探討無監督學習演算法中的密度估計與聚類別分析技術。以合成資料集為例,演示如何使用均值漂移、關聯傳播和 DBSCAN 等演算法識別資料中的模式和結構。同時比較 K-Means 與 DBSCAN 在不同資料集上的表現,並分析其適用場景。

機器學習 資料分析

在機器學習領域,無監督學習演算法扮演著重要角色,尤其在資料探索和模式識別方面。密度估計作為理解資料分佈的關鍵技術,常與聚類別分析結合使用,以揭示資料的內在結構。本文將深入探討均值漂移、關聯傳播和 DBSCAN 等演算法如何應用於密度估計和聚類別分析,並比較 K-Means 與 DBSCAN 的特性與應用場景。透過 Python 程式碼和視覺化圖表,展示這些演算法在合成資料集上的實際應用,並分析其優缺點,幫助讀者更好地理解和應用這些技術。

玄貓的機器學習之旅:無監督學習演算法

在機器學習的世界中,無監督學習演算法是一種重要的技術,用於分析和理解資料的內在結構。其中,密度估計是一個關鍵的概念,用於描述資料的分佈情況。玄貓將帶領我們探索這個迷人的領域,並深入瞭解無監督學習演算法的工作原理。

密度估計

密度估計是一種統計方法,用於描述資料的分佈情況。它可以用於識別資料中的模式、結構和相關性。玄貓使用了一個簡單的例子來演示密度估計的概念:

$$f(x) = \frac{1}{2\pi} \exp\left(-\frac{1}{2}x^2\right)$$

這個公式描述了一個高斯分佈,其中 $x$ 是一個實數向量,$f(x)$ 是該向量的密度函式。

合成資料

為了更好地理解密度估計的概念,玄貓建立了一個合成資料集。這個資料集包含 2000 個樣本,每個樣本都是一個 2 維實數向量。資料集使用 make_blobs 函式生成,該函式可以建立具有不同分佈的資料集。

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

X, y = make_blobs(n_samples=2000, centers=4, cluster_std=1.5, random_state=42)

plt.title('資料點')
plt.scatter(X[:, 0], X[:, 1], edgecolors='black', linewidths=.5)
plt.show()

這個程式碼生成了一個具有 4 個聚類別的資料集,每個聚類別都有一個不同的中心和標準差。結果是一個具有明顯結構的資料集。

均值漂移聚類別

均值漂移聚類別是一種無監督學習演算法,用於識別資料中的模式和結構。它的工作原理是透過迭代地將資料點向最近的模式移動,最終得到一組聚類別和樣本到聚類別的分配。

玄貓使用均值漂移聚類別演算法來分析合成資料集。結果表明,演算法可以有效地識別資料中的模式和結構,並得到一組有意義的聚類別。

內容解密

均值漂移聚類別演算法的工作原理是透過迭代地將資料點向最近的模式移動。這個過程可以用以下步驟描述:

  1. 初始化:選擇一個隨機的資料點作為初始模式。
  2. 迭代:對於每個資料點,計算其與最近模式的距離。如果距離小於某個閾值,則將資料點移動到最近模式。
  3. 更新:更新模式的位置和標準差。
  4. 重複:重複步驟 2 和 3,直到收斂。

圖表翻譯

以下是均值漂移聚類別演算法的流程圖: 這個流程圖描述了均值漂移聚類別演算法的工作原理。它從初始化開始,然後進入迭代過程,在每次迭代中,更新模式的位置和標準差,直到收斂。

機器學習演算法:均值漂移(Mean Shift)與核密度估計

簡介

均值漂移(Mean Shift)是一種非引數化的密度估計方法,常用於資料分群(clustering)。本文將探討均值漂移的基本原理、核密度估計的概念,以及如何使用Python實作均值漂移演算法。

核密度估計

給定一組觀察資料(x1, x2,…, xn),每個觀察資料都是一個d維的實數向量。選擇一個核函式K和頻寬引數h,核函式需要滿足以下條件:

  • K(x) dx = 1
  • K(x) = K(-x) 對所有x值均成立

使用這些觀察資料和核函式,可以得到整個人口的密度函式估計:

fK(x) = 1 / (nh^d) * ∑[K((x - xi) / h)]從i=1到n

其中,核函式K需要滿足上述條件。

均值漂移演算法

均值漂移演算法是一種使用核密度估計來找尋資料分群的方法。首先,需要估計頻寬引數h的適當值。然後,使用這個估計的頻寬引數h和核函式K,可以實作均值漂移演算法。

Python實作

from sklearn.cluster import MeanShift, estimate_bandwidth
import numpy as np

# Estimate the bandwidth for Mean Shift algorithm
bandwidth = estimate_bandwidth(X, quantile=0.12, n_samples=25)

# Instantiate and fit the Mean Shift model using the estimated bandwidth
meanshift = MeanShift(bandwidth=bandwidth)
meanshift.fit(X)

# Retrieve the labels for each data point and find the unique labels
labels = meanshift.labels_
labels_unique = np.unique(labels)

# Calculate the number of clusters based on unique labels
n_clusters_ = len(labels_unique)

# Predict the cluster assignment for all data points
Pred = meanshift.predict(X)

# Define colors for each cluster label and generate a list of colors for the plot
colors = list(map(lambda x: 'red' if x == 1 else 'blue' if x == 2 else 'green' if x == 3 else 'orange', Pred))

# Create a scatter plot of the data points with colors based on their cluster

3.6.1.4 關聯傳播演算法

在無監督機器學習中,Mean Shift和關聯傳播演算法都提供了不需要事先確定叢集數量的優點,因為它們可以同時對資料進行叢集化和確定叢集數量。此外,關聯傳播演算法不需要在演算法執行前估計叢集數量。由玄貓於2007年提出,關聯傳播演算法允許資料點之間交換訊息,直到一組代表(exemplars)出現,每個代表象徵著一個叢集。

關聯傳播演算法的運作原理

在關聯傳播演算法中,資料點之間的相似度矩陣s被用來計算每個資料點之間的相似度。矩陣s的對角線元素s(i, i)代表了輸入偏好,反映了每個輸入作為代表的機率。當所有輸入的初始值設定為統一值時,它會決定玄貓生成的類別數量。

演算法透過兩個訊息傳遞階段交替進行,修改兩個矩陣:

  • 責任矩陣 R:包含值 r(i, k),量化了 x_k 作為 x_i 的代表的適合程度與其他候選代表相比。
  • 可用性矩陣 A:包含值 a(i, k),反映了 x_ix_k 作為其代表的可用性。

關聯傳播演算法的優點

關聯傳播演算法的主要優點是它不需要事先確定叢集數量,並且可以自動地從資料中學習出合適的叢集結構。此外,該演算法還可以處理高維度資料,並且對異常值具有較強的魯棒性。

關聯傳播演算法的應用

關聯傳播演算法在許多領域都有廣泛的應用,包括:

  • 客戶分段:根據客戶的購買行為和偏好進行分段。
  • 推薦系統:根據使用者的歷史行為和偏好推薦商品或服務。
  • 生物資訊學:分析基因表達資料和蛋白質相互作用網路。

關聯傳播演算法的實作

以下是使用Python實作關聯傳播演算法的簡單示例:

import numpy as np

def affinity_propagation(similarity_matrix):
    # 初始化責任矩陣和可用性矩陣
    responsibility_matrix = np.zeros((len(similarity_matrix), len(similarity_matrix)))
    availability_matrix = np.zeros((len(similarity_matrix), len(similarity_matrix)))

    # 訊息傳遞階段
    for _ in range(100):
        # 更新責任矩陣
        for i in range(len(similarity_matrix)):
            for k in range(len(similarity_matrix)):
                responsibility_matrix[i, k] = similarity_matrix[i, k] - np.max(similarity_matrix[i, :] - similarity_matrix[i, k])

        # 更新可用性矩陣
        for i in range(len(similarity_matrix)):
            for k in range(len(similarity_matrix)):
                availability_matrix[i, k] = np.sum(responsibility_matrix[:, k]) - responsibility_matrix[i, k]

    # 求出代表
    exemplars = np.argmax(responsibility_matrix, axis=1)

    return exemplars

# 測試資料
similarity_matrix = np.array([
    [-1, -0.5, -0.2],
    [-0.5, -1, -0.3],
    [-0.2, -0.3, -1]
])

exemplars = affinity_propagation(similarity_matrix)
print(exemplars)

這個示例實作了基本的關聯傳播演算法,但在實際應用中可能需要根據具體問題進行調整和最佳化。

瞭解隱式群聚:親和力傳播演算法

在機器學習中,群聚分析是一種重要的技術,用於根據資料點之間的相似度將其分成不同的群組。其中,親和力傳播(Affinity Propagation)演算法是一種根據訊息傳播的群聚方法,能夠自動地決定群數,並找出每個群的代表點(exemplar)。

親和力傳播演算法的核心概念

親和力傳播演算法的核心是透過兩個矩陣來描述資料點之間的關係:責任矩陣(responsibility matrix)和可用性矩陣(availability matrix)。責任矩陣表示每個資料點選擇另一個資料點作為其代表點的適宜度,而可用性矩陣則表示每個資料點被其他資料點選擇作為代表點的適宜度。

演算法流程

  1. 初始化:初始化責任矩陣和可用性矩陣,通常設定為零。
  2. 更新:根據資料點之間的相似度更新責任矩陣和可用性矩陣。
  3. 迭代:重複更新步驟,直到群聚邊界穩定或達到預設的迭代次數。
  4. 找出代表點:根據最終的責任矩陣和可用性矩陣找出每個群的代表點。

Python 實作

以下是使用 Python 和 scikit-learn 函式庫實作親和力傳播演算法的示例:

from sklearn.datasets import make_blobs
from sklearn.cluster import AffinityPropagation
import matplotlib.pyplot as plt
from itertools import cycle

# 生成合成資料
centers = [[1, 1], [-1, -1], [1, -1]]
X, y = make_blobs(n_samples=250, centers=centers, cluster_std=0.5, random_state=42)

# 設定親和力傳播演算法
af = AffinityPropagation(preference=-50)

# 執行演算法
af.fit(X)

# 繪製群聚結果
plt.title('Data points')
plt.scatter(X[:, 0], X[:, 1], edgecolors='black', linewidths=.5)
plt.show()

這段程式碼生成了一個包含三個群的合成資料集,然後使用親和力傳播演算法進行群聚分析。最後,程式碼繪製了資料點的散佈圖,以視覺化方式呈現群聚結果。

圖表翻譯

此圖示

上述程式碼生成的圖表展示了親和力傳播演算法對合成資料集進行群聚分析的結果。圖表中,每個資料點以不同的顏色表示其所屬的群。透過這個圖表,我們可以直觀地看到資料點之間的群聚結構。

圖表解釋

這個圖表是使用 matplotlib 函式庫繪製的。圖表的 x 軸和 y 軸分別表示資料點的第一個和第二個特徵。每個資料點在圖表中的位置對應到其在原始空間中的位置。透過觀察圖表,我們可以發現資料點大致分成了三個群,每個群都有一個明顯的中心。這些中心對應到親和力傳播演算法找出的代表點。

使用 Affinity Propagation 演算法進行資料分群

Affinity Propagation 是一種根據訊息傳遞的分群演算法,能夠自動決定分群的數量。以下是使用 Affinity Propagation 演算法進行資料分群的步驟:

步驟 1:設定 Affinity Propagation 演算法

from sklearn.cluster import AffinityPropagation
import numpy as np

# 載入資料
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])

# 設定 Affinity Propagation 演算法
af = AffinityPropagation(preference=-50).fit(X)

步驟 2:取得分群中心和標籤

# 取得分群中心的索引和每個資料點的標籤
cluster_centers_indices = af.cluster_centers_indices_
labels = af.labels_

步驟 3:計算分群數量

# 計算分群數量
n_clusters = len(cluster_centers_indices)
print('Estimated number of clusters: %d' % n_clusters)

步驟 4:繪製分群結果

import matplotlib.pyplot as plt
from itertools import cycle

# 關閉現有的繪圖視窗,建立新的繪圖視窗,並清除繪圖視窗
plt.close('all')
plt.figure(1)
plt.clf()

# 定義一個迴圈的顏色序列,用於繪製分群
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')

# 迭代分群數量和顏色序列
for k, col in zip(range(n_clusters), colors):
    class_members = labels == k
    cluster_center = X[cluster_centers_indices[k]]
    plt.plot(X[class_members, 0], X[class_members, 1], col + '.')
    plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
             markersize=14)

結果分析

Affinity Propagation 演算法可以自動決定分群的數量,並且可以處理具有不同密度和形狀的資料集。然而,演算法的表現可能會受到初始引數設定的影響,因此需要仔細調整引數以獲得最佳結果。

內容解密:

  • AffinityPropagation 類別用於設定 Affinity Propagation 演算法。
  • preference 引數用於控制分群的數量。
  • fit 方法用於訓練模型。
  • cluster_centers_indices_ 屬性用於取得分群中心的索引。
  • labels_ 屬性用於取得每個資料點的標籤。
  • n_clusters 變數用於計算分群數量。
  • cycle 函式用於定義一個迴圈的顏色序列。
  • zip 函式用於迭代分群數量和顏色序列。

圖表翻譯:

此圖示為使用 Affinity Propagation 演算法進行資料分群的結果。圖中,每個資料點都被標記為屬於哪個分群,分群中心以大型圓圈表示。不同的分群使用不同的顏色表示。圖表顯示了演算法自動決定分群數量和分配資料點到各個分群的能力。

3.6 無監督式機器學習演算法

無監督式機器學習是一種不需要事先標記資料的學習方式,常用於資料分群(Clustering)。在這節中,我們將探討幾種常見的無監督式機器學習演算法,包括 K-Means、階層式分群(Hierarchical Clustering)和根據密度的空間分群應用於雜訊(DBSCAN)。

3.6.1 K-Means 分群

K-Means 是一種廣泛使用的分群演算法,根據資料的特徵將其分成 K 個群。以下是 K-Means 的基本步驟:

  1. 初始化 K 個中心點。
  2. 將每個資料點分配到最接近的中心點。
  3. 更新中心點為每個群的平均值。
  4. 重複步驟 2 和 3,直到中心點不再改變。

3.6.1.5 根據密度的空間分群應用於雜訊(DBSCAN)

DBSCAN是一種根據密度的分群演算法,能夠處理不同形狀和大小的分群,並且對雜訊和異常值具有良好的容忍性。DBSCAN 的主要目的是找出資料中具有高密度的區域,並將其分成不同的分群。

DBSCAN 的基本步驟如下:

  1. 初始化兩個引數:minPts(最小點數)和 eps(最大距離)。
  2. 將每個資料點標記為核心點、邊界點或雜訊點。
  3. 將核心點和邊界點連線起來,形成分群。
  4. 將雜訊點標記為不屬於任何分群。

以下是使用 Python 實作 DBSCAN 的範例:

import numpy as np
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs, make_circles, make_moons
from sklearn.cluster import KMeans

# 生成一個合成資料集
X, labels_true = make_circles(n_samples=1000, factor=0.3, noise=0.1)

# 標準化資料
X = StandardScaler().fit_transform(X)

# 設定 K-Means 的分群數
clusters_kmeans = 2

# 執行 K-Means 分群
kmeans = KMeans(n_clusters=clusters_kmeans)
y_k = kmeans.fit_predict(X)

# 執行 DBSCAN 分群
dbscan = DBSCAN(eps=0.3, min_samples=10)
y_db = dbscan.fit_predict(X)

# 繪製分群結果
plt.scatter(X[:, 0], X[:, 1], c=y_k, cmap='viridis')
plt.title('K-Means 分群')
plt.show()

plt.scatter(X[:, 0], X[:, 1], c=y_db, cmap='viridis')
plt.title('DBSCAN 分群')
plt.show()

這個範例比較了 K-Means 和 DBSCAN 在合成資料集上的表現。結果顯示,DBSCAN 能夠更好地處理不同形狀和大小的分群,並且對雜訊和異常值具有良好的容忍性。

使用DBSCAN進行聚類別分析

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一種根據密度的空間聚類別演算法,常用於識別資料中的聚類別結構。以下是使用DBSCAN進行聚類別分析的步驟:

步驟1:設定DBSCAN引數

首先,我們需要設定DBSCAN的引數,包括ε(epsilon)和min_samples。ε代表了鄰近點之間的最大距離,而min_samples則代表了成為核心點所需的最少樣本數。在這個例子中,我們設定ε為0.3,min_samples為10。

db = DBSCAN(eps=0.3, min_samples=10).fit(X)

步驟2:建立核心點遮罩

接下來,我們需要建立一個遮罩來識別核心點。核心點是指那些至少有min_samples個鄰近點的點。

core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
labels = db.labels_

步驟3:計算聚類別數量和雜訊點數量

然後,我們計算聚類別的數量和雜訊點的數量。聚類別的數量是指具有不同標籤的點的數量,而雜訊點是指那些不屬於任何聚類別的點。

n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)

步驟4:繪製聚類別結果

最後,我們繪製聚類別的結果。首先,我們建立一個圖形,並設定其大小。然後,我們定義聚類別的顏色,並繪製每個聚類別的點和其對應的centroid。

fig, (ax1, ax2) = plt.subplots(ncols=2)
fig.set_figheight(10)
fig.set_figwidth(30)

colours = ['red','blue','green']

for i in range(clusters_kmeans):
    ax1.scatter(X[y_k == i, 0], X[y_k == i, 1], s=100, c=colours[i], label='Cluster'+str(i+1))
ax1.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:,1], s=100, c='black', label='Centroids')
ax1.set_title("K-means with chosen number of clusters: 2")
ax1.legend()

步驟5:繪製DBSCAN聚類別結果

接下來,我們繪製DBSCAN的聚類別結果。首先,我們取得唯一的標籤,並繪製每個聚類別的點。

unique_labels = set(labels)

內容解密:

在上述程式碼中,我們使用DBSCAN進行聚類別分析。首先,我們設定DBSCAN的引數,包括ε和min_samples。然後,我們建立一個遮罩來識別核心點,並計算聚類別的數量和雜訊點的數量。最後,我們繪製聚類別的結果,包括K-means和DBSCAN的結果。

圖表翻譯:

以下是DBSCAN聚類別結果的圖表:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 無監督學習演算法探索密度估計與聚類別分析

package "物件導向程式設計" {
    package "核心概念" {
        component [類別 Class] as class
        component [物件 Object] as object
        component [屬性 Attribute] as attr
        component [方法 Method] as method
    }

    package "三大特性" {
        component [封裝
Encapsulation] as encap
        component [繼承
Inheritance] as inherit
        component [多型
Polymorphism] as poly
    }

    package "設計原則" {
        component [SOLID] as solid
        component [DRY] as dry
        component [KISS] as kiss
    }
}

class --> object : 實例化
object --> attr : 資料
object --> method : 行為
class --> encap : 隱藏內部
class --> inherit : 擴展功能
inherit --> poly : 覆寫方法
solid --> dry : 設計模式

note right of solid
  S: 單一職責
  O: 開放封閉
  L: 里氏替換
  I: 介面隔離
  D: 依賴反轉
end note

@enduml

在這個圖表中,我們展示了DBSCAN聚類別分析的流程,從設定引數到繪製結果。

使用DBSCAN進行聚類別分析

在進行資料分析時,瞭解資料的分佈和結構是非常重要的。DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一種常用的聚類別演算法,能夠根據資料的密度和距離將其分成不同的群組。

DBSCAN的原理

DBSCAN的工作原理是根據資料點之間的距離和密度來進行聚類別。它首先計算每個資料點的鄰近點數量,如果某個點的鄰近點數量大於一定閾值,則該點被視為核心點。然後,DBSCAN根據核心點和非核心點之間的距離來將資料點分成不同的群組。

實作DBSCAN

以下是使用Python實作DBSCAN的範例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN

# 生成隨機資料
np.random.seed(0)
X = np.random.rand(100, 2)

# 設定DBSCAN引數
eps = 0.5
min_samples = 10

# 執行DBSCAN
db = DBSCAN(eps=eps, min_samples=min_samples).fit(X)

# 取得聚類別結果
labels = db.labels_
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)

# 繪製聚類別結果
plt.figure(figsize=(8, 6))
for k, col in zip(np.unique(labels), ['r', 'g', 'b']):
    class_member_mask = (labels == k)
    xy = X[class_member_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=6)

plt.title('DBSCAN with Estimated number of clusters: %d' % n_clusters_)
plt.show()

結果分析

執行上述程式碼後,將會生成一個聚類別結果圖,圖中每個點代表一個資料點,相同顏色的點屬於同一群組。圖中還會顯示估計的群組數量。

K-means與DBSCAN的比較

K-means和DBSCAN都是常用的聚類別演算法,但它們有不同的工作原理和適用場景。K-means需要事先設定群組數量,而DBSCAN可以自動估計群組數量。另外,DBSCAN對於噪音和異常值的處理更為有效。

無監督學習演算法,尤其是密度估計和聚類別分析,正成為資料驅動決策的核心技術。本文深入探討了均值漂移、關聯傳播和 DBSCAN 等演算法,分析了它們的核心概念、優缺點以及 Python 實作方式。均值漂移根據核密度估計,能有效識別資料中的密集區域,但對頻寬引數敏感。關聯傳播無需預設叢集數量,適用於複雜資料結構,但在大型資料集上計算成本較高。DBSCAN 同樣無需預設叢集數量,且能有效處理噪聲和異常值,但引數選擇對結果影響較大。技術限制深析顯示,這些演算法的效能和結果都高度依賴於引數設定,需要根據資料特性進行調整。對於重視資料分析精確性的企業,建議結合多種評估指標,例如輪廓係數和 Calinski-Harabasz 指數,來選擇最佳引數和演算法。玄貓認為,隨著資料量的爆炸式增長和演算法的不斷最佳化,無監督學習將在更多領域發揮關鍵作用,例如異常檢測、客戶分群和推薦系統,並推動資料智慧的進一步發展。