真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python層次聚類怎么應(yīng)用

本文小編為大家詳細(xì)介紹“Python層次聚類怎么應(yīng)用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Python層次聚類怎么應(yīng)用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

在鶴慶等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),全網(wǎng)營(yíng)銷推廣,外貿(mào)營(yíng)銷網(wǎng)站建設(shè),鶴慶網(wǎng)站建設(shè)費(fèi)用合理。

層次聚類和K-means有什么不同?

K-means 工作原理可以簡(jiǎn)要概述為:

  • 決定簇?cái)?shù)(k)

  • 從數(shù)據(jù)中隨機(jī)選取 k 個(gè)點(diǎn)作為質(zhì)心

  • 將所有點(diǎn)分配到最近的聚類質(zhì)心

  • 計(jì)算新形成的簇的質(zhì)心

  • 重復(fù)步驟 3 和 4

這是一個(gè)迭代過(guò)程,直到新形成的簇的質(zhì)心不變,或者達(dá)到最大迭代次數(shù)。

但是 K-means 是存在一些缺點(diǎn)的,我們必須在算法開(kāi)始前就決定簇?cái)?shù) K 的數(shù)量,但實(shí)際我們并不知道應(yīng)該有多少個(gè)簇,所以一般都是根據(jù)自己的理解先設(shè)定一個(gè)值,這就可能導(dǎo)致我們的理解和實(shí)際情況存在一些偏差。

層次聚類完全不同,它不需要我們開(kāi)始的時(shí)候指定簇?cái)?shù),而是先完整的形成整個(gè)層次聚類后,通過(guò)決定合適的距離,自動(dòng)就可以找到對(duì)應(yīng)的簇?cái)?shù)和聚類。

什么是層次聚類?

下面我們由淺及深的介紹什么是層次聚類,先來(lái)一個(gè)簡(jiǎn)單的例子。

假設(shè)我們有以下幾點(diǎn),我們想將它們分組:

Python層次聚類怎么應(yīng)用

我們可以將這些點(diǎn)中的每一個(gè)分配給一個(gè)單獨(dú)的簇,就是4個(gè)簇(4種顏色):

Python層次聚類怎么應(yīng)用

然后基于這些簇的相似性(距離),將最相似的(距離最近的)點(diǎn)組合在一起并重復(fù)這個(gè)過(guò)程,直到只剩下一個(gè)集群:

Python層次聚類怎么應(yīng)用

上面本質(zhì)上就是在構(gòu)建一個(gè)層次結(jié)構(gòu)。先了解到這里,后面我們?cè)敿?xì)介紹它的分層步驟。

層次聚類的類型

主要有兩種類型的層次聚類:

  • 凝聚層次聚類

  • 分裂層次聚類

凝聚層次聚類

先讓所有點(diǎn)分別成為一個(gè)單獨(dú)的簇,然后通過(guò)相似性不斷組合,直到最后只有一個(gè)簇為止,這就是凝聚層次聚類的過(guò)程,和我們上面剛剛說(shuō)的一致。

分裂層次聚類

分裂層次聚類正好反過(guò)來(lái),它是從單個(gè)集群開(kāi)始逐步分裂,直到無(wú)法分裂,即每個(gè)點(diǎn)都是一個(gè)簇。

所以無(wú)論是 10、100、1000 個(gè)數(shù)據(jù)點(diǎn)都不重要,這些點(diǎn)在開(kāi)始的時(shí)候都屬于同一個(gè)簇:

Python層次聚類怎么應(yīng)用

現(xiàn)在,在每次迭代中拆分簇中相隔最遠(yuǎn)的兩點(diǎn),并重復(fù)這個(gè)過(guò)程,直到每個(gè)簇只包含一個(gè)點(diǎn):

Python層次聚類怎么應(yīng)用

上面的過(guò)程就是分裂層次聚類。

執(zhí)行層次聚類的步驟

上面已經(jīng)說(shuō)了層次聚類的大概過(guò)程,那關(guān)鍵的來(lái)了,如何確定點(diǎn)和點(diǎn)的相似性呢?

這是聚類中最重要的問(wèn)題之一了,一般計(jì)算相似度的方法是:計(jì)算這些簇的質(zhì)心之間的距離。距離最小的點(diǎn)稱為相似點(diǎn),我們可以合并它們,也可以將其稱為基于距離的算法。

另外在層次聚類中,還有一個(gè)稱為鄰近矩陣的概念,它存儲(chǔ)了每個(gè)點(diǎn)之間的距離。下面我們通過(guò)一個(gè)例子來(lái)理解如何計(jì)算相似度、鄰近矩陣、以及層次聚類的具體步驟。

案例介紹

假設(shè)一位老師想要將學(xué)生分成不同的組?,F(xiàn)在有每個(gè)學(xué)生在作業(yè)中的分?jǐn)?shù),想根據(jù)這些分?jǐn)?shù)將他們分成幾組。關(guān)于擁有多少組,這里沒(méi)有固定的目標(biāo)。由于老師不知道應(yīng)該將哪種類型的學(xué)生分配到哪個(gè)組,因此不能作為監(jiān)督學(xué)習(xí)問(wèn)題來(lái)解決。下面,我們將嘗試應(yīng)用層次聚類將學(xué)生分成不同的組。

下面是個(gè)5名學(xué)生的成績(jī):

Python層次聚類怎么應(yīng)用

創(chuàng)建鄰近矩陣

首先,我們要?jiǎng)?chuàng)建一個(gè)鄰近矩陣,它儲(chǔ)存了每個(gè)點(diǎn)兩兩之間的距離,因此可以得到一個(gè)形狀為 n X n 的方陣。

這個(gè)案例中,可以得到以下 5 x 5 的鄰近矩陣:

Python層次聚類怎么應(yīng)用

矩陣?yán)镉袃牲c(diǎn)需要注意下:

  • 矩陣的對(duì)角元素始終為 0,因?yàn)辄c(diǎn)與其自身的距離始終為 0

  • 使用歐幾里得距離公式來(lái)計(jì)算非對(duì)角元素的距離

比如,我們要計(jì)算點(diǎn) 1 和 2 之間的距離,計(jì)算公式為:

Python層次聚類怎么應(yīng)用

同理,按此計(jì)算方法完成后填充鄰近矩陣其余元素。

執(zhí)行層次聚類

這里使用凝聚層次聚類來(lái)實(shí)現(xiàn)。

步驟 1:首先,我們將所有點(diǎn)分配成單個(gè)簇:

Python層次聚類怎么應(yīng)用

這里不同的顏色代表不同的簇,我們數(shù)據(jù)中的 5 個(gè)點(diǎn),即有 5 個(gè)不同的簇。

步驟2:接下來(lái),我們需要查找鄰近矩陣中的最小距離并合并距離最小的點(diǎn)。然后我們更新鄰近矩陣:

Python層次聚類怎么應(yīng)用

最小距離是 3,因此我們將合并點(diǎn) 1 和 2:

Python層次聚類怎么應(yīng)用

讓我們看看更新的集群并相應(yīng)地更新鄰近矩陣:

Python層次聚類怎么應(yīng)用

更新之后,我們?nèi)×?、2 兩個(gè)點(diǎn)中值 (7, 10) 最大的來(lái)替換這個(gè)簇的值。當(dāng)然除了最大值之外,我們還可以取最小值或平均值。然后,我們將再次計(jì)算這些簇的鄰近矩陣:

Python層次聚類怎么應(yīng)用

第 3 步:重復(fù)第 2 步,直到只剩下一個(gè)簇。

重復(fù)所有的步驟后,我們將得到如下所示的合并的聚類:

Python層次聚類怎么應(yīng)用

這就是凝聚層次聚類的工作原理。但問(wèn)題是我們?nèi)匀徊恢涝摲謳捉M?是2、3、還是4組呢?

下面開(kāi)始介紹如何選擇聚類數(shù)。

如何選擇聚類數(shù)?

為了獲得層次聚類的簇?cái)?shù),我們使用了一個(gè)概念,叫作樹(shù)狀圖。

通過(guò)樹(shù)狀圖,我們可以更方便的選出聚類的簇?cái)?shù)。

回到上面的例子。當(dāng)我們合并兩個(gè)簇時(shí),樹(shù)狀圖會(huì)相應(yīng)地記錄這些簇之間的距離并以圖形形式表示。下面這個(gè)是樹(shù)狀圖的原始狀態(tài),橫坐標(biāo)記錄了每個(gè)點(diǎn)的標(biāo)記,縱軸記錄了點(diǎn)和點(diǎn)之間的距離:

Python層次聚類怎么應(yīng)用

當(dāng)合并兩個(gè)簇時(shí),將會(huì)在樹(shù)狀圖中連接起來(lái),連接的高度就是點(diǎn)之間的距離。下面是我們剛剛層次聚類的過(guò)程。

Python層次聚類怎么應(yīng)用

然后開(kāi)始對(duì)上面的過(guò)程進(jìn)行樹(shù)狀圖的繪制。從合并樣本 1 和 2 開(kāi)始,這兩個(gè)樣本之間的距離為 3。

Python層次聚類怎么應(yīng)用

可以看到已經(jīng)合并了 1 和 2。垂直線代表 1 和 2 的距離。同理,按照層次聚類過(guò)程繪制合并簇類的所有步驟,最后得到了這樣的樹(shù)狀圖:

Python層次聚類怎么應(yīng)用

通過(guò)樹(shù)狀圖,我們可以清楚地形象化層次聚類的步驟。樹(shù)狀圖中垂直線的距離越遠(yuǎn)代表簇之間的距離越大。

有了這個(gè)樹(shù)狀圖,我們決定簇類數(shù)就方便多了。

現(xiàn)在我們可以設(shè)置一個(gè)閾值距離,繪制一條水平線。比如我們將閾值設(shè)置為 12,并繪制一條水平線,如下:

Python層次聚類怎么應(yīng)用

從交點(diǎn)中可以看到,聚類的數(shù)量就是與閾值水平線與垂直線相交的數(shù)量(紅線與 2 條垂直線相交,我們將有 2 個(gè)簇)。與橫坐標(biāo)相對(duì)應(yīng)的,一個(gè)簇將有一個(gè)樣本集合為 (1,2,4),另一個(gè)集群將有一個(gè)樣本集合 (3,5)。

這樣,我們就通過(guò)樹(shù)狀圖解決了分層聚類中要決定聚類的數(shù)量。

Python代碼實(shí)戰(zhàn)案例

上面是理論基礎(chǔ),有點(diǎn)數(shù)學(xué)基礎(chǔ)都能看懂。下面介紹下在如何用代碼Python來(lái)實(shí)現(xiàn)這一過(guò)程。這里拿一個(gè)客戶細(xì)分的數(shù)據(jù)來(lái)展示一下。

這個(gè)數(shù)據(jù)來(lái)源于UCI 機(jī)器學(xué)習(xí)庫(kù)。我們的目的是根據(jù)批發(fā)分銷商的客戶在不同產(chǎn)品類別(如牛奶、雜貨、地區(qū)等)上的年度支出,對(duì)他們進(jìn)行細(xì)分。

首先對(duì)數(shù)據(jù)進(jìn)行一個(gè)標(biāo)準(zhǔn)化,為了讓所有數(shù)據(jù)在同一個(gè)維度便于計(jì)算,然后應(yīng)用層次聚類來(lái)細(xì)分客戶。

from sklearn.preprocessing import normalize
data_scaled = normalize(data)
data_scaled = pd.DataFrame(data_scaled, columns=data.columns)
import scipy.cluster.hierarchy as shc
plt.figure(figsize=(10, 7))
plt.title("Dendrograms")
dend = shc.dendrogram(shc.linkage(data_scaled, method='ward'))

Python層次聚類怎么應(yīng)用

x 軸包含了所有樣本,y 軸代表這些樣本之間的距離。距離最大的垂直線是藍(lán)線,假如我們決定要以閾值 6 切割樹(shù)狀圖:

plt.figure(figsize=(10, 7))
plt.title("Dendrograms")
dend = shc.dendrogram(shc.linkage(data_scaled, method='ward'))
plt.axhline(y=6, color='r', linestyle='--')

Python層次聚類怎么應(yīng)用

現(xiàn)在我們有兩個(gè)簇了,我們要對(duì)這 2 個(gè)簇應(yīng)用層次聚類:

from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
cluster.fit_predict(data_scaled)

Python層次聚類怎么應(yīng)用

由于我們定義了 2 個(gè)簇,因此我們可以在輸出中看到 0 和 1 的值。0 代表屬于第一個(gè)簇的點(diǎn),1 代表屬于第二個(gè)簇的點(diǎn)。

plt.figure(figsize=(10, 7))
plt.scatter(data_scaled['Milk'], data_scaled['Grocery'], c=cluster.labels_)

Python層次聚類怎么應(yīng)用

讀到這里,這篇“Python層次聚類怎么應(yīng)用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


新聞名稱:Python層次聚類怎么應(yīng)用
URL網(wǎng)址:http://weahome.cn/article/jsdpci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部