柚子快報(bào)邀請(qǐng)碼778899分享:機(jī)器學(xué)習(xí)第九章-聚類
柚子快報(bào)邀請(qǐng)碼778899分享:機(jī)器學(xué)習(xí)第九章-聚類
目錄
9.1聚類任務(wù)
9.2性能度量
9.3距離計(jì)算
9.4圓形聚類
9.4.1k均值算法
9.4.2學(xué)習(xí)向量量化法(LVQ)
9.4.3高斯混合聚類
9.5密度聚類
?9.6層次聚類
9.1聚類任務(wù)
????????在"無(wú)監(jiān)督學(xué)習(xí)"中研究最多、應(yīng)用最廣的是"聚類" .聚類試圖將數(shù)據(jù)集中的樣本劃分為若干個(gè)通常是不相交的子集,每個(gè)子集稱為一個(gè)"簇" .聚類過程僅能自動(dòng)形成簇結(jié)構(gòu),簇所對(duì)應(yīng)的概念語(yǔ)義需由使用者來(lái)把握和命名。聚類的結(jié)果可用包含m個(gè)元素的簇標(biāo)記向量 λ=(λ1;λ2;... ;λm) 表示.
9.2性能度量
????????聚類性能度量亦稱聚類"有效性指標(biāo)"聚類性能度量大致有兩類. 一類是將聚類結(jié)果與某個(gè)"參考模型" 進(jìn)行比較,稱為"外部指標(biāo)" ; 另一類是直接考察聚類結(jié)果而不利用任何參考模型,稱為"內(nèi)部指標(biāo)" 。
????????聚類性能度量外部指標(biāo)有如下:
Jaccard 系數(shù)(計(jì)算聚類結(jié)果與參考模型之間的交集與并集的比值)
:?
FM 指數(shù)(計(jì)算聚類結(jié)果與參考模型之間的精確度和召回率的調(diào)和平均數(shù))
:? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Rand 指數(shù)(計(jì)算聚類結(jié)果與參考模型之間的一致決策和不一致決策的比值)
??
上述性能度量的結(jié)果值均在
[0
1]
區(qū)間,值越大越好.
????????
聚類性能度量?jī)?nèi)部指標(biāo)有如下:
DB 指數(shù) (通過衡量各個(gè)簇的緊密度和分離度來(lái)評(píng)估聚類的效果):?
?????????????????????????????????????????????????????
Du
nn?指數(shù)(通過比較簇內(nèi)的緊密度和簇間的分離度來(lái)評(píng)估聚類的質(zhì)量):
???????????????????????????????????????????????????????????
DBI
的值越小越好,而
DI
則相反,值越大越好.
9.3距離計(jì)算
????????對(duì)函數(shù) dist(. ,.),若它是一個(gè)"距離度量" (distance measure) ,則需滿足一 些基本性質(zhì):
????????非負(fù)性: dist(Xi
,
Xj) >=
?
0 ;
????????同一性: dist(Xi
,
Xj)=0當(dāng)且僅當(dāng) Xi
=
Xj ;
????????對(duì)稱性: dist(Xi
,
Xj)) =
dist(xj
,
Xi)
;
????????直遞性: dist(Xi
,
Xj)
<=
dist(Xi
,
Xk) + dist(Xk,Xj)
最常用的是 "閔可夫斯基距離":? ? ? ?,p>=1
p=2
時(shí),閔可夫斯基距離即歐氏距離:
p=1
時(shí),閔可夫斯基距離即曼哈頓距離:
????????我們常將屬性劃分為"連續(xù)屬性"
和"離散屬性"
,前者在定義域上有無(wú)窮多個(gè)可能的取值,后者在定義域上是有限個(gè)取值.
????????對(duì)無(wú)序?qū)傩钥刹捎?VDM,表示在屬性 u上取值為a 的樣本數(shù),
表示在第i個(gè)樣本簇
中在屬性u(píng)
上取值為a
的樣本數(shù) ,k
為樣本簇?cái)?shù),則屬性u(píng)
上兩個(gè)離散值a,b之間的 VDM
距離為:
????????????????????????
????????????????????????????????
????????
當(dāng)樣本空間中不同屬性的重要
性不同時(shí)
,可使用"
加權(quán)距
離",
以加權(quán)閔
可夫
斯基距離為
例:
???????????????????????
????????
9.4圓形聚類
????????算法先對(duì)原型進(jìn)行初始化,然后對(duì)原型進(jìn)行迭代更新求解.采用不同的原型表示、不同的求解方式,將產(chǎn)生不同的算法.
9.4.1k均值算法
????????給定樣本集 ?"k 均值" 算法針對(duì)聚類所得簇劃分 最小化平方誤差:
????????????????????????????????????????
? ? ? ? 步驟如下:
選擇K值:確定要分成的簇的數(shù)量K。 初始化中心:隨機(jī)選擇K個(gè)點(diǎn)作為初始簇中心(質(zhì)心)。 分配簇:將每個(gè)數(shù)據(jù)點(diǎn)分配到距離其最近的簇中心所屬的簇。 更新中心:重新計(jì)算每個(gè)簇的質(zhì)心,質(zhì)心是簇中所有點(diǎn)的均值。 重復(fù)迭代:重復(fù)步驟3和步驟4,直到簇中心不再發(fā)生顯著變化,或者達(dá)到預(yù)設(shè)的迭代次數(shù)。 停止:算法結(jié)束時(shí),簇的劃分穩(wěn)定,所有點(diǎn)被劃分到其最終的簇中。
下面是關(guān)于k均值算法的實(shí)驗(yàn)過程及分析結(jié)果:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成樣本數(shù)據(jù)
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 執(zhí)行K均值算法
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
# 獲取簇中心和每個(gè)點(diǎn)的簇標(biāo)簽
centers = kmeans.cluster_centers_
labels = kmeans.labels_
# 可視化結(jié)果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
plt.title('K-Means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
分析:
1.數(shù)據(jù)生成:生成了300個(gè)樣本數(shù)據(jù),劃分為4個(gè)簇,每個(gè)簇的標(biāo)準(zhǔn)差為0.60。
2.K均值算法:對(duì)這些數(shù)據(jù)執(zhí)行了K均值聚類,指定了4個(gè)簇。
3.可視化:結(jié)果圖展示了數(shù)據(jù)點(diǎn)按簇進(jìn)行著色,簇中心以紅色“X”標(biāo)記。? ?
????????通過運(yùn)行代碼,可以直觀地看到數(shù)據(jù)點(diǎn)如何被聚類到4個(gè)不同的簇中,以及每個(gè)簇的中心位置。這有助于驗(yàn)證K均值算法在實(shí)際數(shù)據(jù)上的效果。
實(shí)驗(yàn)結(jié)果:
9.4.2學(xué)習(xí)向量量化法(LVQ)
????????LVQ 假設(shè)數(shù)據(jù)樣本帶有類別標(biāo)記,學(xué)習(xí)過程利用樣本的這些監(jiān)督信息來(lái)輔助聚類。
步驟如下:
初始化:從訓(xùn)練數(shù)據(jù)中隨機(jī)選擇若干樣本點(diǎn)作為初始的原型向量(或質(zhì)心),這些原型向量的數(shù)量通常等于類別數(shù)。 分配類別:為每個(gè)原型向量分配一個(gè)類別標(biāo)簽,通常是其所屬的訓(xùn)練樣本的類別。 訓(xùn)練過程:對(duì)每個(gè)訓(xùn)練樣本:
更新原型:
如果樣本點(diǎn)的真實(shí)類別與最近原型的類別相同,則將原型向量向樣本點(diǎn)移動(dòng)(調(diào)整原型向量的位置)。如果樣本點(diǎn)的真實(shí)類別與最近原型的類別不同,則將原型向量遠(yuǎn)離樣本點(diǎn)移動(dòng)。選擇最近原型:找到距離樣本點(diǎn)最近的原型向量,并確定其類別標(biāo)簽。計(jì)算距離:計(jì)算樣本點(diǎn)到所有原型向量的距離。 重復(fù)訓(xùn)練:重復(fù)步驟3,直到原型向量的位置穩(wěn)定,或者達(dá)到預(yù)設(shè)的訓(xùn)練次數(shù)。 分類:使用訓(xùn)練好的原型向量對(duì)新樣本進(jìn)行分類:計(jì)算新樣本與所有原型向量的距離,并將樣本分配給距離最近的原型的類別
學(xué)習(xí)向量量化的實(shí)驗(yàn)過程及分析結(jié)果如下:
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
class LVQ:
def __init__(self, n_prototypes):
self.n_prototypes = n_prototypes
def fit(self, X, y, n_iter=100, lr=0.01):
self.classes = np.unique(y)
self.prototypes = np.zeros((self.n_prototypes, X.shape[1]))
self.labels = np.zeros(self.n_prototypes, dtype=int)
# Initialize prototypes randomly
for i in range(self.n_prototypes):
idx = np.random.choice(len(X))
self.prototypes[i] = X[idx]
self.labels[i] = y[idx]
for _ in range(n_iter):
for i, x in enumerate(X):
dists = np.linalg.norm(x - self.prototypes, axis=1)
closest_idx = np.argmin(dists)
if y[i] == self.labels[closest_idx]:
self.prototypes[closest_idx] += lr * (x - self.prototypes[closest_idx])
else:
self.prototypes[closest_idx] -= lr * (x - self.prototypes[closest_idx])
def predict(self, X):
dists = np.linalg.norm(X[:, np.newaxis] - self.prototypes, axis=2)
closest_idx = np.argmin(dists, axis=1)
return self.labels[closest_idx]
# Load Iris dataset
data = load_iris()
X = data.data
y = data.target
# Standardize the features
scaler = StandardScaler()
X = scaler.fit_transform(X)
# Split into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Initialize and train LVQ model
model = LVQ(n_prototypes=10)
model.fit(X_train, y_train)
# Predict and evaluate
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'準(zhǔn)確率: {accuracy:.2f}')
分析:? ? ? ??
????????這個(gè)實(shí)現(xiàn)沒有依賴于 sklearn_lvq 庫(kù),而是手動(dòng)實(shí)現(xiàn)了 LVQ 算法。使用了 numpy 和 scikit-learn 進(jìn)行數(shù)據(jù)處理和評(píng)估。
初始化 LVQ 類:定義?LVQ?類及其方法。訓(xùn)練模型:初始化原型,更新原型的位置。預(yù)測(cè)和評(píng)估:通過計(jì)算距離并預(yù)測(cè)類別,評(píng)估模型性能。
實(shí)驗(yàn)結(jié)果:
9.4.3高斯混合聚類
????????高斯混合聚類采用概率模型來(lái)表達(dá)聚類原型。對(duì)n維樣本空間X中的隨機(jī)向量 x,若x服從高斯分布,其概率密度函數(shù)為:
步驟如下:????????
1.?初始化參數(shù)
2.?期望步驟(E-Step)
3.?最大化步驟(M-Step)
4.?收斂性檢查
5.?結(jié)果解釋
下面是關(guān)于高斯混合聚類算法的實(shí)驗(yàn)過程及分析結(jié)果:
import numpy as np
from sklearn.mixture import GaussianMixture
import matplotlib.pyplot as plt
# 生成示例數(shù)據(jù)
np.random.seed(0)
n_samples = 300
C = np.array([[0.7, -0.7], [0.7, 0.7]])
X = np.dot(np.random.randn(n_samples, 2), C)
# 應(yīng)用高斯混合模型
gmm = GaussianMixture(n_components=2, random_state=0)
gmm.fit(X)
labels = gmm.predict(X)
# 結(jié)果可視化
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis')
plt.title('GMM Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
# 繪制高斯分布
ax = plt.gca()
x = np.linspace(X[:, 0].min(), X[:, 0].max(), 100)
y = np.linspace(X[:, 1].min(), X[:, 1].max(), 100)
X_grid, Y_grid = np.meshgrid(x, y)
Z = np.exp(gmm.score_samples(np.c_[X_grid.ravel(), Y_grid.ravel()]))
Z = Z.reshape(X_grid.shape)
contour = ax.contour(X_grid, Y_grid, Z, levels=5, cmap='Greys', alpha=0.5)
plt.colorbar(contour)
plt.show()
# 輸出分析結(jié)果
print("GMM Converged:", gmm.converged_)
print("Number of Iterations:", gmm.n_iter_)
print("Means of the clusters:\n", gmm.means_)
print("Covariances of the clusters:\n", gmm.covariances_)
? 分析:
聚類可視化:散點(diǎn)圖顯示了數(shù)據(jù)點(diǎn)根據(jù)模型預(yù)測(cè)的簇標(biāo)簽進(jìn)行著色。等高線圖顯示了高斯分布的輪廓。GMM 收斂狀態(tài):通過?gmm.converged_?判斷模型是否收斂。迭代次數(shù):gmm.n_iter_?表示模型收斂的迭代次數(shù)。均值和協(xié)方差:gmm.means_?和?gmm.covariances_?提供了每個(gè)簇的均值和協(xié)方差矩陣。
這個(gè)代碼和結(jié)果分析展示了高斯混合模型在二維數(shù)據(jù)上的應(yīng)用。
實(shí)驗(yàn)結(jié)果:
9.5密度聚類
????????密度聚類算法從樣本密度的角度來(lái)考察樣本之間的可連接性,并基于可連接樣本不斷擴(kuò)展聚類簇以獲得最終的聚類結(jié)果.DBSCAN 是一種著名的密度聚類算法,它基于一組"鄰域"參數(shù)來(lái)刻畫樣本分布的緊密程度.
DBSCAN算法步驟如下:
選擇參數(shù):設(shè)置兩個(gè)參數(shù),eps(鄰域的半徑)和 min_samples(一個(gè)簇的最小樣本數(shù))。 遍歷數(shù)據(jù)點(diǎn):對(duì)于數(shù)據(jù)集中的每一個(gè)點(diǎn),計(jì)算其 eps 鄰域內(nèi)的點(diǎn)數(shù)。 密度檢驗(yàn):
如果鄰域內(nèi)點(diǎn)數(shù)大于或等于?min_samples,將該點(diǎn)標(biāo)記為核心點(diǎn),并形成一個(gè)新簇。否則,標(biāo)記為噪聲點(diǎn)(如果它在任何核心點(diǎn)的鄰域內(nèi))。 擴(kuò)展簇:
從核心點(diǎn)開始,遞歸地將所有密度可達(dá)的點(diǎn)加入到同一簇中。對(duì)于新加入的點(diǎn),再檢查其鄰域,重復(fù)此過程直到所有密度可達(dá)的點(diǎn)被處理完。 重復(fù):對(duì)數(shù)據(jù)集中尚未標(biāo)記的點(diǎn)重復(fù)步驟2至4,直到所有點(diǎn)被處理完。 處理噪聲:所有未被分配到任何簇的點(diǎn)被標(biāo)記為噪聲。
DBSCAN的優(yōu)點(diǎn)是能夠發(fā)現(xiàn)任意形狀的簇,并能自動(dòng)識(shí)別噪聲點(diǎn)。
下面是關(guān)于DBSCAN算法的實(shí)驗(yàn)代碼及分析結(jié)果:
import numpy as np
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
# 生成示例數(shù)據(jù)
X, _ = make_moons(n_samples=300, noise=0.1, random_state=42)
# 應(yīng)用 DBSCAN 算法
dbscan = DBSCAN(eps=0.3, min_samples=5)
labels = dbscan.fit_predict(X)
# 結(jié)果可視化
plt.figure(figsize=(8, 6))
unique_labels = np.unique(labels)
colors = plt.cm.get_cmap('viridis', len(unique_labels))
for label in unique_labels:
mask = (labels == label)
plt.scatter(X[mask, 0], X[mask, 1], c=[colors(label)], label=f'Cluster {label}' if label != -1 else 'Noise', s=50)
plt.title('DBSCAN Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()
# 輸出分析結(jié)果
print("Cluster labels:", np.unique(labels))
print("Number of clusters found:", len(set(labels)) - (1 if -1 in labels else 0))
print("Number of noise points:", list(labels).count(-1))
分析結(jié)果:
聚類可視化: 散點(diǎn)圖展示了通過 DBSCAN 聚類得到的結(jié)果。不同的顏色表示不同的簇,噪聲點(diǎn)(未分配到任何簇的點(diǎn))通常會(huì)被標(biāo)記為單獨(dú)的顏色。 簇標(biāo)簽: np.unique(labels)?列出了所有簇標(biāo)簽。標(biāo)簽?-1?表示噪聲點(diǎn)。 簇?cái)?shù)量: len(set(labels)) - (1 if -1 in labels else 0)?計(jì)算了簇的數(shù)量。-1?被排除在外,因?yàn)樗碓肼朁c(diǎn),不屬于任何簇。 噪聲點(diǎn)數(shù)量: list(labels).count(-1)?計(jì)算了噪聲點(diǎn)的數(shù)量。
實(shí)驗(yàn)結(jié)果:
?9.6層次聚類
????????層次聚類試圖 不同層次對(duì)數(shù)據(jù)集進(jìn)行劃分,從而形成樹聚類結(jié)構(gòu) ,數(shù)據(jù)集的劃分采用"自 底向上 "的聚合策略,也可采 "自頂向下" 分拆策略.
????????AGNES 是一種采用自底 向上聚合策略的層次聚類算法.它先將數(shù)據(jù)集中的每個(gè)樣本看作初始聚類簇,然后在算法運(yùn)行的每一步中找出離最近的兩個(gè)聚類簇進(jìn)行合并,該過程不斷重復(fù),直至達(dá)到預(yù)設(shè)的聚類簇個(gè)數(shù).
步驟如下:
初始化:將每個(gè)數(shù)據(jù)點(diǎn)視為一個(gè)單獨(dú)的簇。 計(jì)算距離:計(jì)算所有簇之間的距離。初始時(shí),距離是數(shù)據(jù)點(diǎn)之間的距離。 合并簇:
找到距離最小的兩個(gè)簇,將它們合并成一個(gè)新的簇。更新簇間的距離。具體方法取決于距離度量,例如單鏈接、全鏈接或平均鏈接。 重復(fù):重復(fù)步驟2和3,直到所有點(diǎn)被合并成一個(gè)簇或達(dá)到預(yù)定的簇?cái)?shù)量。 停止條件:算法結(jié)束時(shí),得到一個(gè)樹狀圖(dendrogram),表示不同簇的合并過程。
下面是AGNES算法的實(shí)驗(yàn)代碼和分析結(jié)果:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_moons
import scipy.cluster.hierarchy as sch
# 生成示例數(shù)據(jù)
X, _ = make_moons(n_samples=300, noise=0.1, random_state=42)
# 應(yīng)用 AGNES 算法(AgglomerativeClustering)
agnes = AgglomerativeClustering(n_clusters=2, linkage='ward')
labels = agnes.fit_predict(X)
# 結(jié)果可視化
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50, edgecolor='k')
plt.title('Agglomerative Clustering (AGNES)')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
# 生成樹狀圖(dendrogram)
plt.figure(figsize=(10, 7))
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))
plt.title('Dendrogram for AGNES')
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.show()
# 輸出分析結(jié)果
print("Cluster labels:", np.unique(labels))
print("Number of clusters found:", len(set(labels)))
分析結(jié)果:
聚類可視化: 散點(diǎn)圖展示了通過 AGNES 聚類得到的結(jié)果。不同的顏色表示不同的簇,便于觀察數(shù)據(jù)的分組情況。 樹狀圖: 樹狀圖展示了數(shù)據(jù)點(diǎn)合并的過程。每次合并操作都會(huì)在樹狀圖上形成一個(gè)連接線,線的高度表示合并時(shí)的距離。通過觀察樹狀圖,可以確定不同簇的形成過程和距離。 簇標(biāo)簽: np.unique(labels)?列出了所有簇的標(biāo)簽。與散點(diǎn)圖中的顏色對(duì)應(yīng)。 簇?cái)?shù)量: len(set(labels))?計(jì)算了最終得到的簇的數(shù)量。這與在 AGNES 中設(shè)定的?n_clusters?參數(shù)一致。
這段代碼展示了如何使用 AGNES 進(jìn)行層次聚類,并通過可視化結(jié)果和樹狀圖來(lái)分析聚類效果
實(shí)驗(yàn)結(jié)果:
????????
柚子快報(bào)邀請(qǐng)碼778899分享:機(jī)器學(xué)習(xí)第九章-聚類
推薦鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。