【scikit-learn基础】--『监督学习』之 层次聚类
層次聚類算法是機(jī)器學(xué)習(xí)中常用的一種無(wú)監(jiān)督學(xué)習(xí)算法,它用于將數(shù)據(jù)分為多個(gè)類別或?qū)哟巍?br>該方法在計(jì)算機(jī)科學(xué)、生物學(xué)、社會(huì)學(xué)等多個(gè)領(lǐng)域都有廣泛應(yīng)用。
層次聚類算法的歷史可以追溯到上世紀(jì)60年代,當(dāng)時(shí)它主要被用于社會(huì)科學(xué)中。
隨著計(jì)算機(jī)技術(shù)的發(fā)展,這種方法在90年代得到了更為廣泛的應(yīng)用。
1. 算法概述
層次聚類的基本原理是創(chuàng)建一個(gè)層次的聚類,通過(guò)不斷地合并或分裂已存在的聚類來(lái)實(shí)現(xiàn)。
它分為兩種策略:
- 凝聚策略:初始時(shí)將每個(gè)點(diǎn)視為一個(gè)簇,然后逐漸合并相近的簇
- 分裂策略:開(kāi)始時(shí)將所有點(diǎn)視為一個(gè)簇,然后逐漸分裂
在scikit-learn中,層次聚類的策略有4種:
-
ward:默認(rèn)策略,也就是最小方差法。它傾向于合并那些使得合并后的簇內(nèi)部方差最小的兩個(gè)簇 -
complete:計(jì)算兩個(gè)簇之間的距離時(shí),考慮兩個(gè)簇中距離最遠(yuǎn)的兩個(gè)樣本之間的距離 -
average:計(jì)算兩個(gè)簇之間的距離時(shí),考慮兩個(gè)簇中所有樣本之間距離的平均值 -
single:計(jì)算兩個(gè)簇之間的距離時(shí),考慮兩個(gè)簇中距離最近的兩個(gè)樣本之間的距離
2. 創(chuàng)建樣本數(shù)據(jù)
下面創(chuàng)建月牙形狀數(shù)據(jù)來(lái)看看層次聚類的各個(gè)策略之間的比較。
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
ax = plt.subplot()
X, y = make_moons(noise=0.05, n_samples=1000)
ax.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25, cmap=plt.cm.prism)
plt.show()
關(guān)于各種樣本數(shù)據(jù)的生成,可以參考:TODO
3. 模型訓(xùn)練
用四種不同的策略來(lái)訓(xùn)練上面月牙形狀的樣本數(shù)據(jù)。
from sklearn.cluster import AgglomerativeClustering
# 定義
regs = [
AgglomerativeClustering(linkage="ward"),
AgglomerativeClustering(linkage="complete"),
AgglomerativeClustering(linkage="single"),
AgglomerativeClustering(linkage="average"),
]
# 訓(xùn)練模型
for reg in regs:
reg.fit(X, y)
fig, axes = plt.subplots(nrows=2, ncols=2)
fig.set_size_inches((10, 8))
# 繪制聚類之后的結(jié)果
axes[0][0].scatter(
X[:, 0], X[:, 1], marker="o", c=regs[0].labels_, s=25, cmap=plt.cm.prism
)
axes[0][0].set_title("ward 策略")
axes[0][1].scatter(
X[:, 0], X[:, 1], marker="o", c=regs[1].labels_, s=25, cmap=plt.cm.prism
)
axes[0][1].set_title("complete 策略")
axes[1][0].scatter(
X[:, 0], X[:, 1], marker="o", c=regs[2].labels_, s=25, cmap=plt.cm.prism
)
axes[1][0].set_title("single 策略")
axes[1][1].scatter(
X[:, 0], X[:, 1], marker="o", c=regs[3].labels_, s=25, cmap=plt.cm.prism
)
axes[1][1].set_title("average 策略")
plt.show()
從結(jié)果可以看出,single策略效果最好,它聚類的結(jié)果與原始數(shù)據(jù)的分類情況最為接近。
不過(guò),這并不能說(shuō)明single策略由于其它策略,只能說(shuō)明single策略最適合上面的樣本數(shù)據(jù)。
4. 總結(jié)
層次聚類在許多場(chǎng)景中都得到了應(yīng)用,例如圖像分割、文檔聚類、生物信息學(xué)中的基因聚類等。
它特別適合那些需要多層次結(jié)構(gòu)的應(yīng)用。
層次聚類的最大優(yōu)勢(shì)在于它提供了一種層次結(jié)構(gòu)的聚類,這對(duì)于許多應(yīng)用來(lái)說(shuō)是非常自然的,它能夠展示數(shù)據(jù)在不同粒度下的聚類結(jié)果。
但它也存在一些缺點(diǎn)。
首先,它的計(jì)算復(fù)雜度相對(duì)較高,特別是當(dāng)數(shù)據(jù)量很大時(shí);
其次,一旦做出合并或分裂的決策,就不能撤銷,這可能導(dǎo)致錯(cuò)誤的累積。
此外,確定何時(shí)停止合并或分裂也是一個(gè)挑戰(zhàn)。
總結(jié)
以上是生活随笔為你收集整理的【scikit-learn基础】--『监督学习』之 层次聚类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 聊一聊为什么我要整合Microsoft.
- 下一篇: 网络-华为、思科交换机配置TFTP自动备