柚子快報(bào)邀請(qǐng)碼778899分享:機(jī)器學(xué)習(xí) 聚類的四種常用的算法
柚子快報(bào)邀請(qǐng)碼778899分享:機(jī)器學(xué)習(xí) 聚類的四種常用的算法
1.聚類的簡(jiǎn)介
2.K均值聚類
3.均值漂移算法
4.DBSCAN
? ? ?基本概念
? ? ?算法步驟
? ? ?DBSCAN的優(yōu)勢(shì)
? ? ?DBSCAN的不足
? ? ?使用場(chǎng)景
5.高斯混合模型
6.學(xué)習(xí)總結(jié):
1.聚類的簡(jiǎn)介
聚類是機(jī)器學(xué)習(xí)中一種重要的無監(jiān)督算法(Unsupervised Learning),它可以將數(shù)據(jù)點(diǎn)歸結(jié)為一系列特定的組合。理論上歸為一類的數(shù)據(jù)點(diǎn)具有相同的特性,而不同類別的數(shù)據(jù)點(diǎn)則具有各不相同的屬性。
與監(jiān)督學(xué)習(xí)(如分類器)相比,無監(jiān)督學(xué)習(xí)的訓(xùn)練集沒有人為標(biāo)注的結(jié)果。在非監(jiān)督式學(xué)習(xí)中,數(shù)據(jù)并不被特別標(biāo)識(shí),學(xué)習(xí)模型是為了推斷出數(shù)據(jù)的一些內(nèi)在結(jié)構(gòu)。
以下是五種常用的聚類算法。
K均值聚類? 適用于大規(guī)模數(shù)據(jù)集的聚類分析,常用于市場(chǎng)分析、圖像分析、語(yǔ)音分析、醫(yī)學(xué)分析等領(lǐng)域。 均值漂移算法 基于密度的聚類算法(DBSCAN) 適用于大規(guī)模數(shù)據(jù)集中密度不均勻的聚類分析,常用于空間數(shù)據(jù)分析、異常檢測(cè)等領(lǐng)域。 利用高斯混合模型進(jìn)行最大期望估計(jì) 適用于數(shù)據(jù)集中存在多個(gè)高斯分布的聚類分析,常用于圖像分析、語(yǔ)音分析、信號(hào)處理等領(lǐng)域。
2.K均值聚類
K均值(K-means)聚類是一種無監(jiān)督學(xué)習(xí)方法,用于將數(shù)據(jù)點(diǎn)劃分為K個(gè)不同的簇(或稱為群組、類別)。它的工作原理是通過迭代的方式將數(shù)據(jù)點(diǎn)分配到K個(gè)簇中,使得每個(gè)數(shù)據(jù)點(diǎn)與其所屬簇的質(zhì)心(簇中所有點(diǎn)的平均值)之間的平方距離之和最小。
以下是K均值聚類算法的基本步驟:
初始化:
選擇K個(gè)初始質(zhì)心(可以是隨機(jī)選擇或基于某種啟發(fā)式方法)。分配數(shù)據(jù)點(diǎn)到最近的質(zhì)心:
對(duì)于每個(gè)數(shù)據(jù)點(diǎn),計(jì)算它到所有K個(gè)質(zhì)心的距離(如歐氏距離)。將數(shù)據(jù)點(diǎn)分配到距離它最近的質(zhì)心所對(duì)應(yīng)的簇中。重新計(jì)算質(zhì)心:
對(duì)于每個(gè)簇,計(jì)算其中所有點(diǎn)的平均值(質(zhì)心)。將每個(gè)簇的質(zhì)心更新為該簇中所有點(diǎn)的平均值。迭代:
重復(fù)步驟2和3,直到滿足某個(gè)停止條件(如質(zhì)心的變化小于某個(gè)閾值,或達(dá)到最大迭代次數(shù))。
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
# 假設(shè)我們有一些二維數(shù)據(jù)
data = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
# 選擇K值(簇的數(shù)量)
K = 2
# 初始化KMeans并擬合數(shù)據(jù)
kmeans = KMeans(n_clusters=K, random_state=0)
kmeans.fit(data)
# 獲取聚類標(biāo)簽和質(zhì)心
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
# 打印結(jié)果
print("Labels:", labels)
print("Centroids:", centroids)
# 可視化結(jié)果
plt.scatter(data[:, 0], data[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=200, alpha=0.5)
plt.show()
注意:
K均值對(duì)初始質(zhì)心的選擇是敏感的,不同的初始質(zhì)心可能會(huì)導(dǎo)致不同的聚類結(jié)果。K均值算法不能保證找到全局最優(yōu)解,它只能找到局部最優(yōu)解。K均值假設(shè)簇的形狀是凸的,并且每個(gè)簇的方差大致相同。如果簇的形狀不規(guī)則或大小差異很大,K均值可能無法很好地工作。
K均值聚類在許多領(lǐng)域都有廣泛的應(yīng)用,如圖像處理、市場(chǎng)分析、生物信息學(xué)等。在選擇K值時(shí),通常需要根據(jù)領(lǐng)域知識(shí)和實(shí)驗(yàn)來確定最佳的K值。一種常用的方法是使用“肘部法則”(Elbow Method)或輪廓系數(shù)(Silhouette Score)來評(píng)估不同K值下的聚類效果。
3.均值漂移算法
均值漂移(Mean Shift)算法是一種基于密度的非參數(shù)聚類算法,它的基本思想是通過迭代將數(shù)據(jù)點(diǎn)沿著概率密度梯度的上升方向移動(dòng),直到收斂到局部密度最大值的位置。在這個(gè)過程中,每個(gè)數(shù)據(jù)點(diǎn)都會(huì)向其所在局部區(qū)域的密度增加最快的方向(即均值漂移向量的方向)移動(dòng)。
以下是均值漂移算法的基本步驟:
初始化:為每個(gè)數(shù)據(jù)點(diǎn)選擇一個(gè)初始位置作為中心點(diǎn)。計(jì)算偏移均值:對(duì)于每個(gè)中心點(diǎn),計(jì)算在其一定半徑內(nèi)的所有其他數(shù)據(jù)點(diǎn)與該中心點(diǎn)的向量,并計(jì)算這些向量的平均值(即偏移均值)。更新中心點(diǎn):將每個(gè)中心點(diǎn)移動(dòng)到其對(duì)應(yīng)的偏移均值位置。迭代:重復(fù)步驟2和3,直到滿足某個(gè)停止條件(如中心點(diǎn)的移動(dòng)距離小于某個(gè)閾值,或達(dá)到最大迭代次數(shù))。
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 加載圖像(通常用于圖像分割或目標(biāo)跟蹤,但這里僅用于演示)
# 注意:對(duì)于聚類任務(wù),你通常會(huì)有一個(gè)特征數(shù)據(jù)集而不是圖像
image = cv2.imread('your_image.jpg', 0) # 讀取圖像為灰度圖
# 將圖像轉(zhuǎn)換為float32類型,并歸一化到[0, 1]范圍
image = np.float32(image) / 255.0
# 設(shè)置窗口大?。纯臻g窗口內(nèi)用于計(jì)算均值的鄰域大小)
# 和h參數(shù)(即顏色窗口的帶寬)
sp = 10
h = 150.0
# 應(yīng)用均值漂移
shifted, image_labels, (centers, _) = cv2.meanShiftSmoothing(image, sp, h, None, 10, cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_MAX_ITER, 100)
# 注意:meanShiftSmoothing通常用于圖像平滑,而不是直接聚類
# 但你可以將結(jié)果圖像中的每個(gè)像素值視為一個(gè)聚類標(biāo)簽
# 可視化結(jié)果(這里僅展示平滑后的圖像,而不是聚類結(jié)果)
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(shifted, cmap='gray')
plt.title('Mean Shifted Image'), plt.xticks([]), plt.yticks([])
plt.show()
# 如果你要進(jìn)行聚類,你需要自己實(shí)現(xiàn)均值漂移算法
# 或者使用其他庫(kù),因?yàn)閌opencv-python`的meanShiftSmoothing主要用于圖像平滑
在均值漂移算法中,通常會(huì)引入核函數(shù)來計(jì)算偏移均值,核函數(shù)的選擇會(huì)影響算法的性能。此外,均值漂移算法不需要事先指定聚類數(shù),因?yàn)榫垲悢?shù)將由數(shù)據(jù)算法自動(dòng)確定。
均值漂移算法在圖像處理、計(jì)算機(jī)視覺等領(lǐng)域有廣泛的應(yīng)用,如目標(biāo)跟蹤、圖像分割等。在目標(biāo)跟蹤中,均值漂移算法可以通過迭代運(yùn)算收斂于目標(biāo)概率密度函數(shù)的局部最大值,從而實(shí)現(xiàn)對(duì)目標(biāo)的實(shí)時(shí)跟蹤。在圖像分割中,均值漂移算法可以將圖像分割成不同的區(qū)域,每個(gè)區(qū)域?qū)?yīng)于一個(gè)局部密度最大值,從而實(shí)現(xiàn)圖像的自動(dòng)分割。
需要注意的是,均值漂移算法對(duì)初始中心點(diǎn)的選擇是敏感的,不同的初始中心點(diǎn)可能會(huì)導(dǎo)致不同的聚類結(jié)果。此外,均值漂移算法在處理大規(guī)模數(shù)據(jù)集時(shí)可能會(huì)面臨計(jì)算復(fù)雜度高的問題。
4.DBSCAN
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的空間聚類算法,它可以發(fā)現(xiàn)任意形狀的聚類,并且能夠在聚類過程中識(shí)別并排除噪聲點(diǎn)。以下是DBSCAN算法的基本概念和步驟的概述:
基本概念
ε-鄰域:對(duì)于給定的對(duì)象p,其ε-鄰域是對(duì)象p為中心、ε為半徑的空間區(qū)域。核心對(duì)象:如果對(duì)象p的ε-鄰域內(nèi)至少包含MinPts個(gè)對(duì)象(包括p本身),則p被稱為核心對(duì)象。直接密度可達(dá):如果對(duì)象q在核心對(duì)象p的ε-鄰域內(nèi),則稱對(duì)象q從對(duì)象p直接密度可達(dá)。密度可達(dá):如果存在一個(gè)對(duì)象鏈p?, p?, ..., p?,其中p?=p,p?=q,且對(duì)于任意i (1≤i 算法步驟 參數(shù)設(shè)置:確定鄰域半徑ε和最小樣本數(shù)MinPts。選擇核心對(duì)象:遍歷數(shù)據(jù)集中的每個(gè)對(duì)象,如果其ε-鄰域內(nèi)的對(duì)象數(shù)(包括自身)大于等于MinPts,則將其標(biāo)記為核心對(duì)象。擴(kuò)展聚類簇:對(duì)于每個(gè)核心對(duì)象,找到其所有密度可達(dá)的對(duì)象,形成一個(gè)聚類簇。標(biāo)記噪聲點(diǎn):對(duì)于數(shù)據(jù)集中不屬于任何聚類簇的對(duì)象,將其標(biāo)記為噪聲點(diǎn)。完成聚類:重復(fù)步驟2-4,直到所有對(duì)象都被處理。 from sklearn.cluster import DBSCAN from sklearn.datasets import make_moons import matplotlib.pyplot as plt # 創(chuàng)建示例數(shù)據(jù)集(兩個(gè)半月形的數(shù)據(jù)) X, y = make_moons(n_samples=500, noise=0.05, random_state=0) # 初始化DBSCAN模型 # eps: 鄰域半徑 # min_samples: 最小樣本數(shù)(即MinPts) dbscan = DBSCAN(eps=0.3, min_samples=5) # 對(duì)數(shù)據(jù)進(jìn)行聚類 labels = dbscan.fit_predict(X) # 繪制聚類結(jié)果 unique_labels = set(labels) colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))] for k, col in zip(unique_labels, colors): if k == -1: # 黑色用于噪聲點(diǎn) col = [0, 0, 0, 1] class_member_mask = (labels == k) xy = X[class_member_mask] plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), markeredgecolor='k', markersize=8) plt.title('DBSCAN Clustering') plt.show() DBSCAN的優(yōu)勢(shì) 可以發(fā)現(xiàn)任意形狀的聚類。對(duì)噪聲點(diǎn)不敏感,能夠識(shí)別并排除噪聲點(diǎn)。不需要預(yù)先指定聚類的數(shù)量。 DBSCAN的不足 當(dāng)數(shù)據(jù)量很大時(shí),算法的計(jì)算復(fù)雜度較高。參數(shù)的選擇(ε和MinPts)對(duì)聚類結(jié)果有很大影響,需要仔細(xì)調(diào)整。對(duì)于密度不均勻的數(shù)據(jù)集,可能無法獲得理想的聚類結(jié)果。 使用場(chǎng)景 DBSCAN算法廣泛應(yīng)用于各種領(lǐng)域,包括但不限于: 空間數(shù)據(jù)分析:在地理信息系統(tǒng)(GIS)中分析地理數(shù)據(jù),如城市人口分布、地質(zhì)特征等。圖像分割:在圖像處理中,對(duì)像素進(jìn)行聚類以實(shí)現(xiàn)圖像分割。社交網(wǎng)絡(luò)分析:分析社交網(wǎng)絡(luò)中的用戶行為數(shù)據(jù),識(shí)別群組或社區(qū)結(jié)構(gòu)。市場(chǎng)細(xì)分:在市場(chǎng)營(yíng)銷中,將客戶分成不同的細(xì)分市場(chǎng)以更好地了解他們的需求和行為模式。物聯(lián)網(wǎng)數(shù)據(jù)分析:處理物聯(lián)網(wǎng)設(shè)備產(chǎn)生的大量數(shù)據(jù),識(shí)別設(shè)備之間的關(guān)聯(lián)或異常情況 5.高斯混合模型 高斯混合模型(Gaussian Mixture Model,簡(jiǎn)稱GMM)是一種統(tǒng)計(jì)模型,它使用多個(gè)高斯概率密度函數(shù)(正態(tài)分布曲線)來精確地量化事物。該模型將一個(gè)事物分解為若干個(gè)基于高斯概率密度函數(shù)形成的子模型,從而更準(zhǔn)確地描述數(shù)據(jù)的分布。 在圖像處理中,高斯混合模型常用于對(duì)圖像背景進(jìn)行建模。其原理是,如果圖像所包含的目標(biāo)區(qū)域和背景區(qū)域在灰度上有一定的差異,那么圖像的灰度直方圖會(huì)呈現(xiàn)雙峰或多峰的形狀,其中每個(gè)峰對(duì)應(yīng)于不同的區(qū)域或物體。通過將直方圖的多峰特性看作是多個(gè)高斯分布的疊加,可以解決圖像的分割問題。 高斯混合模型在數(shù)據(jù)建模和分析中有許多重要的應(yīng)用,包括: 聚類:將數(shù)據(jù)分成不同的組,每個(gè)組對(duì)應(yīng)于混合模型中的一個(gè)分量。這種方法尤其適用于數(shù)據(jù)集中存在多個(gè)潛在的子群體的情況。密度估計(jì):估計(jì)數(shù)據(jù)的概率密度函數(shù)。通過對(duì)每個(gè)分量的高斯分布進(jìn)行加權(quán)和,模型能夠更準(zhǔn)確地捕捉數(shù)據(jù)的復(fù)雜分布。異常檢測(cè):通過估計(jì)正常數(shù)據(jù)的分布,模型可以識(shí)別偏離這個(gè)分布的觀測(cè)值作為異常。生成模型:用于生成新的樣本。一旦模型參數(shù)被學(xué)習(xí),可以通過對(duì)分量進(jìn)行隨機(jī)采樣來生成符合模型分布的新數(shù)據(jù)。 import numpy as np import matplotlib.pyplot as plt from sklearn.mixture import GaussianMixture from sklearn.datasets import make_blobs # 生成模擬數(shù)據(jù) X, y_true = make_blobs(n_samples=400, centers=4, cluster_std=0.60, random_state=0) # 初始化高斯混合模型 gmm = GaussianMixture(n_components=4) # 假設(shè)我們知道有4個(gè)聚類 # 擬合模型 gmm.fit(X) # 預(yù)測(cè)標(biāo)簽 y_gmm = gmm.predict(X) # 繪制原始數(shù)據(jù)和聚類結(jié)果 plt.scatter(X[:, 0], X[:, 1], c=y_true, s=40, cmap='viridis') # 繪制GMM的聚類中心 centers = gmm.means_ plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5) # 顯示圖形 plt.title("Gaussian Mixture Model") plt.xlabel("Feature 1") plt.ylabel("Feature 2") plt.show() # 如果需要,可以繪制每個(gè)高斯分量的等高線圖 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) Z = gmm.predict_proba(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape, gmm.n_components) fig, axs = plt.subplots(1, gmm.n_components, figsize=(15, 5)) fig.subplots_adjust(wspace=0.05, hspace=0.05) for i, (ax, color) in enumerate(zip(axs, 'brgc')): ax.contourf(xx, yy, Z[:, i], cmap=color, alpha=0.5) ax.set_xlim(x_min, x_max) ax.set_ylim(y_min, y_max) ax.set_xticks(()) ax.set_yticks(()) ax.set_title(f'Component {i+1}') plt.show() 在智能監(jiān)控系統(tǒng)中,高斯混合模型是背景目標(biāo)提取的一個(gè)重要方法。它使用K(基本為3到5個(gè))個(gè)高斯模型來表征圖像中各個(gè)像素點(diǎn)的特征,并在新一幀圖像獲得后更新混合高斯模型。通過比較當(dāng)前圖像中的每個(gè)像素點(diǎn)與混合高斯模型的匹配程度,可以判斷該點(diǎn)是否屬于背景或前景。 高斯混合模型的參數(shù)包括均值、方差和權(quán)重等,這些參數(shù)的選擇和更新對(duì)于模型的性能至關(guān)重要。在實(shí)際應(yīng)用中,可以采用各種算法和技術(shù)來優(yōu)化這些參數(shù),以提高模型的準(zhǔn)確性和魯棒性。 6.學(xué)習(xí)總結(jié): 在深入學(xué)習(xí)了幾種聚類算法(K均值聚類、均值漂移算法、DBSCAN和高斯混合模型)后,我不僅對(duì)它們各自的工作原理和適用場(chǎng)景有了深刻的理解,更在這個(gè)過程中體會(huì)到了機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘的魅力和挑戰(zhàn)。 首先,聚類算法是數(shù)據(jù)科學(xué)中非常重要的一部分,它們能夠自動(dòng)地將數(shù)據(jù)集中的樣本劃分為若干個(gè)不相交的子集(即聚類),從而揭示出數(shù)據(jù)的內(nèi)在結(jié)構(gòu)和分布。這種無監(jiān)督學(xué)習(xí)的方式讓我意識(shí)到,在缺乏明確標(biāo)簽或指導(dǎo)的情況下,我們?nèi)匀豢梢酝ㄟ^數(shù)據(jù)的特征來探索其內(nèi)在的規(guī)律。 在學(xué)習(xí)的過程中,我深刻體會(huì)到了每種聚類算法的特點(diǎn)和優(yōu)劣。例如,K均值聚類雖然簡(jiǎn)單高效,但對(duì)初始聚類中心的選擇敏感,且需要預(yù)設(shè)聚類數(shù)量;而均值漂移算法雖然可以發(fā)現(xiàn)任意形狀的聚類,但計(jì)算復(fù)雜度較高,對(duì)參數(shù)的選擇也較為敏感。DBSCAN和GMM則分別具有不同的優(yōu)勢(shì),如DBSCAN能夠發(fā)現(xiàn)任意形狀的聚類且對(duì)噪聲和異常值有一定的魯棒性,而GMM可以給出樣本屬于某個(gè)聚類的概率,但同樣需要面對(duì)參數(shù)選擇和計(jì)算復(fù)雜度的問題。 通過對(duì)比不同算法的特點(diǎn)和優(yōu)劣,我逐漸意識(shí)到,在選擇聚類算法時(shí),我們需要綜合考慮數(shù)據(jù)的特性、問題的需求以及計(jì)算資源的限制。同時(shí),對(duì)于每種算法,我們都需要深入理解其原理、參數(shù)設(shè)置以及調(diào)優(yōu)方法,以便在實(shí)際應(yīng)用中取得更好的效果。 此外,學(xué)習(xí)聚類算法也讓我認(rèn)識(shí)到了數(shù)據(jù)預(yù)處理的重要性。在聚類之前,對(duì)數(shù)據(jù)進(jìn)行適當(dāng)?shù)念A(yù)處理(如標(biāo)準(zhǔn)化、歸一化、降維等)可以顯著提高聚類的效果。因此,在進(jìn)行聚類分析時(shí),我們需要充分重視數(shù)據(jù)預(yù)處理環(huán)節(jié),確保數(shù)據(jù)的質(zhì)量和有效性。 最后,我認(rèn)為學(xué)習(xí)聚類算法不僅僅是為了掌握一種技術(shù)或方法,更重要的是培養(yǎng)了一種分析問題和解決問題的能力。在面對(duì)復(fù)雜的數(shù)據(jù)集和問題時(shí),我們需要靈活運(yùn)用不同的算法和工具,結(jié)合實(shí)際情況進(jìn)行選擇和調(diào)整,以達(dá)到最佳的效果。這種能力對(duì)于數(shù)據(jù)科學(xué)家和機(jī)器學(xué)習(xí)工程師來說至關(guān)重要。 總之,學(xué)習(xí)聚類算法讓我收獲頗豐,不僅提高了我的專業(yè)技能和素養(yǎng),更讓我對(duì)機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘領(lǐng)域有了更深入的認(rèn)識(shí)和理解。我相信,在未來的學(xué)習(xí)和工作中,我將繼續(xù)探索和應(yīng)用這些聚類算法,為解決實(shí)際問題提供有力的支持。 文章鏈接:聚類的四種常用的算法-CSDN博客 柚子快報(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)系刪除。