10 種聚類算法的完整 Python 操作示例
大家好,我是東哥。分享一篇關(guān)于聚類的文章,10種聚類介紹和Python代碼。
聚類是在輸入數(shù)據(jù)的特征空間中查找自然組的無(wú)監(jiān)督問題。
對(duì)于所有數(shù)據(jù)集,有許多不同的聚類算法和單一的最佳方法。
在 scikit-learn 機(jī)器學(xué)習(xí)庫(kù)的 Python 中如何實(shí)現(xiàn)、適配和使用頂級(jí)聚類算法。
聚類
聚類算法
聚類算法示例
庫(kù)安裝
聚類數(shù)據(jù)集
親和力傳播
聚合聚類
BIRCH
DBSCAN
K-均值
Mini-Batch K-均值
Mean Shift
OPTICS
光譜聚類
高斯混合模型
一.聚類
聚類技術(shù)適用于沒有要預(yù)測(cè)的類,而是將實(shí)例劃分為自然組的情況。?
—源自:《數(shù)據(jù)挖掘頁(yè):實(shí)用機(jī)器學(xué)習(xí)工具和技術(shù)》2016年。
這些群集可能反映出在從中繪制實(shí)例的域中工作的某種機(jī)制,這種機(jī)制使某些實(shí)例彼此具有比它們與其余實(shí)例更強(qiáng)的相似性。
—源自:《數(shù)據(jù)挖掘頁(yè):實(shí)用機(jī)器學(xué)習(xí)工具和技術(shù)》2016年。
該進(jìn)化樹可以被認(rèn)為是人工聚類分析的結(jié)果; 將正常數(shù)據(jù)與異常值或異常分開可能會(huì)被認(rèn)為是聚類問題; 根據(jù)自然行為將集群分開是一個(gè)集群?jiǎn)栴},稱為市場(chǎng)細(xì)分。
聚類是一種無(wú)監(jiān)督學(xué)習(xí)技術(shù),因此很難評(píng)估任何給定方法的輸出質(zhì)量。
—源自:《機(jī)器學(xué)習(xí)頁(yè):概率觀點(diǎn)》2012。
二.聚類算法
聚類分析的所有目標(biāo)的核心是被群集的各個(gè)對(duì)象之間的相似程度(或不同程度)的概念。聚類方法嘗試根據(jù)提供給對(duì)象的相似性定義對(duì)對(duì)象進(jìn)行分組。
—源自:《統(tǒng)計(jì)學(xué)習(xí)的要素:數(shù)據(jù)挖掘、推理和預(yù)測(cè)》,2016年
一些聚類算法要求您指定或猜測(cè)數(shù)據(jù)中要發(fā)現(xiàn)的群集的數(shù)量,而另一些算法要求指定觀測(cè)之間的最小距離,其中示例可以被視為“關(guān)閉”或“連接”。因此,聚類分析是一個(gè)迭代過(guò)程,在該過(guò)程中,對(duì)所識(shí)別的群集的主觀評(píng)估被反饋回算法配置的改變中,直到達(dá)到期望的或適當(dāng)?shù)慕Y(jié)果。scikit-learn 庫(kù)提供了一套不同的聚類算法供選擇。下面列出了10種比較流行的算法:
親和力傳播
聚合聚類
BIRCH
DBSCAN
K-均值
Mini-Batch K-均值
Mean Shift
OPTICS
光譜聚類
高斯混合
三.聚類算法示例
首先,讓我們安裝庫(kù)。不要跳過(guò)此步驟,因?yàn)槟阈枰_保安裝了最新版本。你可以使用 pip Python 安裝程序安裝 scikit-learn 存儲(chǔ)庫(kù),如下所示:
sudo?pip?install?scikit-learn
#?檢查?scikit-learn?版本
import?sklearn
print(sklearn.__version__)
0.22.1
我們將使用 make _ classification ()函數(shù)創(chuàng)建一個(gè)測(cè)試二分類數(shù)據(jù)集。數(shù)據(jù)集將有1000個(gè)示例,每個(gè)類有兩個(gè)輸入要素和一個(gè)群集。這些群集在兩個(gè)維度上是可見的,因此我們可以用散點(diǎn)圖繪制數(shù)據(jù),并通過(guò)指定的群集對(duì)圖中的點(diǎn)進(jìn)行顏色繪制。
這將有助于了解,至少在測(cè)試問題上,群集的識(shí)別能力如何。該測(cè)試問題中的群集基于多變量高斯,并非所有聚類算法都能有效地識(shí)別這些類型的群集。因此,本教程中的結(jié)果不應(yīng)用作比較一般方法的基礎(chǔ)。下面列出了創(chuàng)建和匯總合成聚類數(shù)據(jù)集的示例。
#?綜合分類數(shù)據(jù)集
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?y?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?為每個(gè)類的樣本創(chuàng)建散點(diǎn)圖
for?class_value?in?range(2):
#?獲取此類的示例的行索引
row_ix?=?where(y?==?class_value)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

我們?cè)O(shè)計(jì)了一種名為“親和傳播”的方法,它作為兩對(duì)數(shù)據(jù)點(diǎn)之間相似度的輸入度量。在數(shù)據(jù)點(diǎn)之間交換實(shí)值消息,直到一組高質(zhì)量的范例和相應(yīng)的群集逐漸出現(xiàn)
—源自:《通過(guò)在數(shù)據(jù)點(diǎn)之間傳遞消息》2007。
它是通過(guò) AffinityPropagation 類實(shí)現(xiàn)的,要調(diào)整的主要配置是將“ 阻尼 ”設(shè)置為0.5到1,甚至可能是“首選項(xiàng)”。
下面列出了完整的示例。
#?親和力傳播聚類
from?numpy?import?unique
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?sklearn.cluster?import?AffinityPropagation
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?_?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?定義模型
model?=?AffinityPropagation(damping=0.9)
#?匹配模型
model.fit(X)
#?為每個(gè)示例分配一個(gè)集群
yhat?=?model.predict(X)
#?檢索唯一群集
clusters?=?unique(yhat)
#?為每個(gè)群集的樣本創(chuàng)建散點(diǎn)圖
for?cluster?in?clusters:
#?獲取此群集的示例的行索引
row_ix?=?where(yhat?==?cluster)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

#?聚合聚類
from?numpy?import?unique
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?sklearn.cluster?import?AgglomerativeClustering
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?_?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?定義模型
model?=?AgglomerativeClustering(n_clusters=2)
#?模型擬合與聚類預(yù)測(cè)
yhat?=?model.fit_predict(X)
#?檢索唯一群集
clusters?=?unique(yhat)
#?為每個(gè)群集的樣本創(chuàng)建散點(diǎn)圖
for?cluster?in?clusters:
#?獲取此群集的示例的行索引
row_ix?=?where(yhat?==?cluster)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

BIRCH 遞增地和動(dòng)態(tài)地群集傳入的多維度量數(shù)據(jù)點(diǎn),以嘗試?yán)每捎觅Y源(即可用內(nèi)存和時(shí)間約束)產(chǎn)生最佳質(zhì)量的聚類。
—源自:《 BIRCH :1996年大型數(shù)據(jù)庫(kù)的高效數(shù)據(jù)聚類方法》
#?birch聚類
from?numpy?import?unique
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?sklearn.cluster?import?Birch
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?_?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?定義模型
model?=?Birch(threshold=0.01,?n_clusters=2)
#?適配模型
model.fit(X)
#?為每個(gè)示例分配一個(gè)集群
yhat?=?model.predict(X)
#?檢索唯一群集
clusters?=?unique(yhat)
#?為每個(gè)群集的樣本創(chuàng)建散點(diǎn)圖
for?cluster?in?clusters:
#?獲取此群集的示例的行索引
row_ix?=?where(yhat?==?cluster)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

…我們提出了新的聚類算法 DBSCAN 依賴于基于密度的概念的集群設(shè)計(jì),以發(fā)現(xiàn)任意形狀的集群。DBSCAN 只需要一個(gè)輸入?yún)?shù),并支持用戶為其確定適當(dāng)?shù)闹?/p>
-源自:《基于密度的噪聲大空間數(shù)據(jù)庫(kù)聚類發(fā)現(xiàn)算法》,1996
它是通過(guò) DBSCAN 類實(shí)現(xiàn)的,主要配置是“ eps ”和“ min _ samples ”超參數(shù)。
下面列出了完整的示例。
#?dbscan?聚類
from?numpy?import?unique
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?sklearn.cluster?import?DBSCAN
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?_?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?定義模型
model?=?DBSCAN(eps=0.30,?min_samples=9)
#?模型擬合與聚類預(yù)測(cè)
yhat?=?model.fit_predict(X)
#?檢索唯一群集
clusters?=?unique(yhat)
#?為每個(gè)群集的樣本創(chuàng)建散點(diǎn)圖
for?cluster?in?clusters:
#?獲取此群集的示例的行索引
row_ix?=?where(yhat?==?cluster)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

本文的主要目的是描述一種基于樣本將 N 維種群劃分為 k 個(gè)集合的過(guò)程。這個(gè)叫做“ K-均值”的過(guò)程似乎給出了在類內(nèi)方差意義上相當(dāng)有效的分區(qū)。
-源自:《關(guān)于多元觀測(cè)的分類和分析的一些方法》1967年
#?k-means?聚類
from?numpy?import?unique
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?sklearn.cluster?import?KMeans
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?_?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?定義模型
model?=?KMeans(n_clusters=2)
#?模型擬合
model.fit(X)
#?為每個(gè)示例分配一個(gè)集群
yhat?=?model.predict(X)
#?檢索唯一群集
clusters?=?unique(yhat)
#?為每個(gè)群集的樣本創(chuàng)建散點(diǎn)圖
for?cluster?in?clusters:
#?獲取此群集的示例的行索引
row_ix?=?where(yhat?==?cluster)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

...我們建議使用 k-均值聚類的迷你批量?jī)?yōu)化。與經(jīng)典批處理算法相比,這降低了計(jì)算成本的數(shù)量級(jí),同時(shí)提供了比在線隨機(jī)梯度下降更好的解決方案。
—源自:《Web-Scale K-均值聚類》2010
#?mini-batch?k均值聚類
from?numpy?import?unique
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?sklearn.cluster?import?MiniBatchKMeans
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?_?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?定義模型
model?=?MiniBatchKMeans(n_clusters=2)
#?模型擬合
model.fit(X)
#?為每個(gè)示例分配一個(gè)集群
yhat?=?model.predict(X)
#?檢索唯一群集
clusters?=?unique(yhat)
#?為每個(gè)群集的樣本創(chuàng)建散點(diǎn)圖
for?cluster?in?clusters:
#?獲取此群集的示例的行索引
row_ix?=?where(yhat?==?cluster)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

對(duì)離散數(shù)據(jù)證明了遞推平均移位程序收斂到最接近駐點(diǎn)的基礎(chǔ)密度函數(shù),從而證明了它在檢測(cè)密度模式中的應(yīng)用。
—源自:《Mean Shift :面向特征空間分析的穩(wěn)健方法》,2002
#?均值漂移聚類
from?numpy?import?unique
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?sklearn.cluster?import?MeanShift
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?_?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?定義模型
model?=?MeanShift()
#?模型擬合與聚類預(yù)測(cè)
yhat?=?model.fit_predict(X)
#?檢索唯一群集
clusters?=?unique(yhat)
#?為每個(gè)群集的樣本創(chuàng)建散點(diǎn)圖
for?cluster?in?clusters:
#?獲取此群集的示例的行索引
row_ix?=?where(yhat?==?cluster)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

我們?yōu)榫垲惙治鲆肓艘环N新的算法,它不會(huì)顯式地生成一個(gè)數(shù)據(jù)集的聚類;而是創(chuàng)建表示其基于密度的聚類結(jié)構(gòu)的數(shù)據(jù)庫(kù)的增強(qiáng)排序。此群集排序包含相當(dāng)于密度聚類的信息,該信息對(duì)應(yīng)于范圍廣泛的參數(shù)設(shè)置。
—源自:《OPTICS :排序點(diǎn)以標(biāo)識(shí)聚類結(jié)構(gòu)》,1999
#?optics聚類
from?numpy?import?unique
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?sklearn.cluster?import?OPTICS
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?_?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?定義模型
model?=?OPTICS(eps=0.8,?min_samples=10)
#?模型擬合與聚類預(yù)測(cè)
yhat?=?model.fit_predict(X)
#?檢索唯一群集
clusters?=?unique(yhat)
#?為每個(gè)群集的樣本創(chuàng)建散點(diǎn)圖
for?cluster?in?clusters:
#?獲取此群集的示例的行索引
row_ix?=?where(yhat?==?cluster)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

最近在許多領(lǐng)域出現(xiàn)的一個(gè)有希望的替代方案是使用聚類的光譜方法。這里,使用從點(diǎn)之間的距離導(dǎo)出的矩陣的頂部特征向量。
—源自:《關(guān)于光譜聚類:分析和算法》,2002年
#?spectral?clustering
from?numpy?import?unique
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?sklearn.cluster?import?SpectralClustering
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?_?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?定義模型
model?=?SpectralClustering(n_clusters=2)
#?模型擬合與聚類預(yù)測(cè)
yhat?=?model.fit_predict(X)
#?檢索唯一群集
clusters?=?unique(yhat)
#?為每個(gè)群集的樣本創(chuàng)建散點(diǎn)圖
for?cluster?in?clusters:
#?獲取此群集的示例的行索引
row_ix?=?where(yhat?==?cluster)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

#?高斯混合模型
from?numpy?import?unique
from?numpy?import?where
from?sklearn.datasets?import?make_classification
from?sklearn.mixture?import?GaussianMixture
from?matplotlib?import?pyplot
#?定義數(shù)據(jù)集
X,?_?=?make_classification(n_samples=1000,?n_features=2,?n_informative=2,?n_redundant=0,?n_clusters_per_class=1,?random_state=4)
#?定義模型
model?=?GaussianMixture(n_components=2)
#?模型擬合
model.fit(X)
#?為每個(gè)示例分配一個(gè)集群
yhat?=?model.predict(X)
#?檢索唯一群集
clusters?=?unique(yhat)
#?為每個(gè)群集的樣本創(chuàng)建散點(diǎn)圖
for?cluster?in?clusters:
#?獲取此群集的示例的行索引
row_ix?=?where(yhat?==?cluster)
#?創(chuàng)建這些樣本的散布
pyplot.scatter(X[row_ix,?0],?X[row_ix,?1])
#?繪制散點(diǎn)圖
pyplot.show()

三.總結(jié)
聚類是在特征空間輸入數(shù)據(jù)中發(fā)現(xiàn)自然組的無(wú)監(jiān)督問題。
有許多不同的聚類算法,對(duì)于所有數(shù)據(jù)集沒有單一的最佳方法。
在 scikit-learn 機(jī)器學(xué)習(xí)庫(kù)的 Python 中如何實(shí)現(xiàn)、適合和使用頂級(jí)聚類算法。
近期閱讀學(xué)習(xí)推薦:
Python超好用的命令行界面實(shí)現(xiàn)工具
Python自動(dòng)化處理Excel表格實(shí)戰(zhàn)完整代碼分享(課表解析)
如何找到我:
分享
收藏
點(diǎn)贊
在看




