溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

K 均值算法是如何讓數(shù)據(jù)自動分組

發(fā)布時間:2021-12-23 10:24:47 來源:億速云 閱讀:142 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)K 均值算法是如何讓數(shù)據(jù)自動分組,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

下面要介紹的K 均值算法是一種無監(jiān)督學(xué)習(xí)。

與分類算法相比,無監(jiān)督學(xué)習(xí)算法又叫聚類算法,就是只有特征數(shù)據(jù),沒有目標(biāo)數(shù)據(jù),讓算法自動從數(shù)據(jù)中“學(xué)習(xí)知識”,將不同類別的數(shù)據(jù)聚集到相應(yīng)的類別中。

1,K 均值算法

K 均值的英文為K-Means,其含義是:

  • K:表示該算法可以將數(shù)據(jù)劃分到K 個不同的組中。

  • 均值:表示每個組的中心點是組內(nèi)所有值的平均值。

K 均值算法可以將一個沒有被分類的數(shù)據(jù)集,劃分到K 個類中。某個數(shù)據(jù)應(yīng)該被劃分到哪個類,是通過該數(shù)據(jù)與群組中心點相似度決定的,也就是該數(shù)據(jù)與哪個類的中心點最相似,則該數(shù)據(jù)就應(yīng)該被劃分到哪個類中。

關(guān)于如何計算事物之間的相似度,可以參考文章《計算機如何理解事物的相關(guān)性》。

使用K 均值算法的一般步驟是:

  1. 確定K 值是多少:

    • 對于K 值的選擇,可以通過分析數(shù)據(jù),估算數(shù)據(jù)應(yīng)該分為幾個類。

    • 如果無法估計確切值,可以多試幾個K 值,最終將劃分效果最好的K 值作為最終選擇。

  2. 選擇K 個中心點:一般最開始的K 個中心點隨機選擇的。

  3. 將數(shù)據(jù)集中的所有數(shù)據(jù),通過與中心點的相似度劃分到不同的類別中。

  4. 根據(jù)類別中的數(shù)據(jù)平均值,重新計算每個類別中心點的位置。

  5. 循環(huán)迭代第3,4步,直到中心點的位置幾乎不再改變,分類過程就算完畢。

K 均值算法是如何讓數(shù)據(jù)自動分組

2,K 均值算法聚類過程

下面以一個二維數(shù)據(jù)點的聚類過程,來看下K 均值算法如何聚類。

首先,這里有一些離散的數(shù)據(jù)點,如下圖:

K 均值算法是如何讓數(shù)據(jù)自動分組

我們使用K 均值算法對這些數(shù)據(jù)點進(jìn)行聚類。隨機選擇兩個點作為兩個類的中心點,分別是紅色x藍(lán)色x

K 均值算法是如何讓數(shù)據(jù)自動分組

計算所有數(shù)據(jù)點到這兩個中心點的距離,距離紅色x 近的點標(biāo)紅色,距離藍(lán)色x 近的點標(biāo)藍(lán)色:

K 均值算法是如何讓數(shù)據(jù)自動分組

重新計算兩個中心點的位置,兩個中心點分別移動到新的位置:

K 均值算法是如何讓數(shù)據(jù)自動分組

重新計算所有數(shù)據(jù)點分別到紅色x藍(lán)色x的距離,距離紅色x 近的點標(biāo)紅色,距離藍(lán)色x 近的點標(biāo)藍(lán)色:

K 均值算法是如何讓數(shù)據(jù)自動分組

再次計算兩個中心點的位置,兩個中心點分別移動到新的位置:

K 均值算法是如何讓數(shù)據(jù)自動分組

直到中心點的位置幾乎不再變化,聚類結(jié)束。

以上過程就是K 均值算法的聚類過程。

3,K 均值算法的實現(xiàn)

K 均值算法是一個聚類算法,sklearn 庫中的 cluster 模塊實現(xiàn)了一系列的聚類算法,其中就包括K 均值算法。

來看下KMeans 類的原型:

KMeans(
	n_clusters=8, 
	init='k-means++', 
	n_init=10, 
	max_iter=300, 
	tol=0.0001, 
	precompute_distances='deprecated', 
	verbose=0, 
	random_state=None, 
	copy_x=True, 
	n_jobs='deprecated', 
	algorithm='auto')

可以看KMeans 類有很多參數(shù),這里介紹幾個比較重要的參數(shù):

  • n_clusters: 即 K 值,可以隨機設(shè)置一些 K 值,選擇聚類效果最好的作為最終的 K 值。

  • init:選擇初始中心點的方式:

    • init='k-means++':可加快收斂速度,是默認(rèn)方式,也是比較好的方式。

    • init='random ':隨機選擇中心點。

    • 也可以自定義方式,這里不多介紹。

  • n_init:初始化中心點的運算次數(shù),默認(rèn)是 10。如果 K 值比較大,可以適當(dāng)增大 n_init 的值。

  • algorithmk-means 的實現(xiàn)算法,有auto,full,elkan三種。

    • 默認(rèn)是auto,根據(jù)數(shù)據(jù)的特點自動選擇用full或者elkan。

  • max_iter:算法的最大迭代次數(shù),默認(rèn)是300。

    • 如果聚類很難收斂,設(shè)置最大迭代次數(shù)可以讓算法盡快結(jié)束。

下面對一些二維坐標(biāo)中的點進(jìn)行聚類,看下如何使用K 均值算法。

4,準(zhǔn)備數(shù)據(jù)點

下面是隨機生成的三類坐標(biāo)點,每類有20 個點,不同類的點的坐標(biāo)在不同的范圍內(nèi):

  • A 類點:Ax 表示A 類點的橫坐標(biāo),Ay 表示A 類點的縱坐標(biāo)。橫縱坐標(biāo)范圍都是 (0, 20]

  • B 類點:Bx 表示B 類點的橫坐標(biāo),By 表示B 類點的縱坐標(biāo)。橫縱坐標(biāo)范圍都是 (40, 60]。

  • C 類點:Cx 表示C 類點的橫坐標(biāo),Cy 表示C 類點的縱坐標(biāo)。橫縱坐標(biāo)范圍都是 (70, 90]。

Ax = [20, 6, 14, 13, 8, 19, 20, 14, 2, 11, 2, 15, 19, 4, 4, 11, 13, 4, 15, 11]
Ay = [14, 19, 17, 16, 3, 7, 9, 18, 20, 3, 4, 12, 9, 17, 14, 1, 18, 17, 3, 5]

Bx = [53, 50, 46, 52, 57, 42, 47, 55, 56, 57, 56, 50, 46, 46, 44, 44, 58, 54, 47, 57]
By = [60, 57, 57, 53, 54, 45, 54, 57, 49, 53, 42, 59, 54, 53, 50, 50, 58, 58, 58, 51]

Cx = [77, 75, 71, 87, 74, 70, 74, 85, 71, 75, 72, 82, 81, 70, 72, 71, 88, 71, 72, 80]
Cy = [85, 77, 82, 87, 71, 71, 77, 88, 81, 73, 80, 72, 90, 77, 89, 88, 83, 77, 90, 72]

我們可以用 Matplotlib 將這些點畫在二維坐標(biāo)中,代碼如下:

import matplotlib.pyplot as plt

plt.scatter(Ax + Bx + Cx, Ay + By + Cy, marker='o')
plt.show()

畫出來的圖如下,可看到這三類點的分布范圍還是一目了然的。

K 均值算法是如何讓數(shù)據(jù)自動分組

關(guān)于如何使用 Matplotlib 繪圖,可以參考文章《如何使用Python 進(jìn)行數(shù)據(jù)可視化》。

5,對數(shù)據(jù)聚類

下面使用K 均值算法對數(shù)據(jù)點進(jìn)行聚類。

創(chuàng)建K 均值模型對象:

from sklearn.cluster import KMeans

# 設(shè)置 K 值為 3,其它參數(shù)使用默認(rèn)值
kmeans = KMeans(n_clusters=3)

準(zhǔn)備數(shù)據(jù),共三大類,60 個坐標(biāo)點:

train_data = [
    # 前20 個為 A 類點
    [20, 14], [6, 19], [14, 17], [13, 16], [8, 3], [19, 7], [20, 9], 
    [14, 18], [2, 20], [11, 3], [2, 4], [15, 12], [19, 9], [4, 17], 
    [4, 14], [11, 1], [13, 18], [4, 17], [15, 3], [11, 5],

    # 中間20 個為B 類點
    [53, 60], [50, 57], [46, 57], [52, 53], [57, 54], [42, 45], [47, 54], 
    [55, 57], [56, 49], [57, 53], [56, 42], [50, 59], [46, 54], [46, 53], 
    [44, 50], [44, 50], [58, 58], [54, 58], [47, 58], [57, 51],

    # 最后20 個為C 類點
    [77, 85], [75, 77], [71, 82], [87, 87], [74, 71], [70, 71], [74, 77], 
    [85, 88], [71, 81], [75, 73], [72, 80], [82, 72], [81, 90], [70, 77], 
    [72, 89], [71, 88], [88, 83], [71, 77], [72, 90], [80, 72],
]

擬合模型:

kmeans.fit(train_data)

對數(shù)據(jù)進(jìn)行聚類:

predict_data = kmeans.predict(train_data)

查看聚類結(jié)果,其中的0,1,2 分別代表不同的類別:

>>> print(predict_data)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]

通過觀察最終的聚類結(jié)果predict_data,可以看到,前,中,后20 個數(shù)據(jù)分別被分到了不同的類中,也非常符合我們的預(yù)期,說明K 均值算法的聚類結(jié)果還是很不錯的 。

因為本例中的二維坐標(biāo)點的分布界限非常明顯,所以最終的聚類結(jié)果非常不錯。

我們可以通過 n_iter_ 屬性來查看迭代的次數(shù):

>>> kmeans.n_iter_
2

通過 cluster_centers_ 屬性查看每個類的中心點坐標(biāo):

>>> kmeans.cluster_centers_
array([[11.25, 11.3 ],
       [75.9 , 80.5 ],
       [50.85, 53.6 ]])

將這三個中心點畫在坐標(biāo)軸中,如下:

K 均值算法是如何讓數(shù)據(jù)自動分組

以上就是K 均值算法是如何讓數(shù)據(jù)自動分組,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI