使用Python進行K均值聚類


使用Python進行K均值聚類

在機器學習中,當我們要處理一個未標記的數據集時,稱為“無監督學習”。有時我們只是想知道我們的數據是如何組織起來的這樣我們就能知道數據是如何組織起來的。聚類意味著對一組對象進行分組。

K-means聚類是無監督學習的一部分,我們使用的是未標記的數據集,這個算法會自動為我們將數據分組成聚類。它是目前最流行、應用最廣泛的聚類算法之一。它用於各種應用程序,例如市場細分,圖像細分等。

該算法將接受兩個輸入:

a)K(它是您想要的群聚類數)

b)訓練數據集

表示形式:

  • K =聚類數
  • C稱為聚類質心
  • m =訓練示例數
  • idx C(i)=已將實例X(i)分配給聚類的聚類質心

看一個示例,使您可以清楚地看到此符號

使用Python進行K均值聚類

聚類分配步驟:

在此步驟中,我們將根據數據集中最接近的聚類質心向數據集中分配一個聚類質心,併為分配的數據集上色。這是通過計算歐式距離來實現的。

使用Python進行K均值聚類

經過隨機定義的聚類質心和聚類分配步驟後,將如下圖所示:

使用Python進行K均值聚類

隨機初始化


使用Python進行K均值聚類

在聚類分配步驟之後

移動質心的步驟:

我們要做的是獲取兩個聚類質心,即紅x和藍x,然後將它們移動到相同顏色點的平均值。因此,我們要做的是查看所有紅色點並計算平均值,實際上,平均值是所有紅色點的位置,然後將紅色聚類質心移到那裡。藍色x也是如此。

使用Python進行K均值聚類

計算出運動質心後,我們可以從上圖看到質心的位置發生了變化

K-均值的優化目標:


使用Python進行K均值聚類

這稱為distortion函數

局部最優:

使用Python進行K均值聚類

不幸的是,通過隨機初始化K-means算法也可能被卡在不同的局部最優值上,在左邊的圖中,藍色的聚類捕獲了大量的點,而紅色、綠色的聚類則對相對擁有較少的點。

為了得到如圖所示的最佳全局最優解,我們可以多次嘗試對聚類質心進行隨機初始化,並多次運行K-means算法,從而得到儘可能好的局部最優解或全局最優解。

選擇聚類數:

我們通常知道K的值,否則我們用肘部法。

使用Python進行K均值聚類

我們針對不同的K值(例如K = 10到1)運行算法,並繪製K值與distortion的關係。如圖所示,選擇elbow點的K值。

使用python實現:

導入Python庫

<code>

import

numpy

as

np

import

pandas

as

pd

import

matplotlib.pyplot

as

plt/<code>

導入機器學習數據集

<code>

X

= pd.read_csv(

"data1.csv"

)/<code>

可視化數據集

<code>a = X[

'0'

].values b = X[

'1'

].values X = np.

array

(

list

(zip(a, b))) plt.scatter(a, b , c=

'black'

, s=

7

)/<code>

定義K值並隨機初始化點

<code>

K

=

3

c_x

= np.random.randint(

0

, np.max(X) , size = K)

c_y

= np.random.randint(

0

, np.max(X) , size = K)

c

= np.array(list(zip(c_x,c_y)),dtype = np.float32)/<code>

我們的聚類質心在這些點上,它們是隨機選擇的

[[6. 1.][4. 5.][5. 4.]]

使用Python進行K均值聚類

聚類分配

將每個輸入值分配給最近的中心

<code>

m

=

X.shape[0]

idx

=

np.zeros(m)

for

i in range(m):

temp

=

np.zeros(K)

for

j in range(K):

=

np.sum((X[i,:] - c[j,:]) ** 2)

=

np.argmin(temp)

/<code>

計算質心

我們通過獲取分配給該聚類的所有點的平均值來找到新質心。

<code>

for

i in

range

(K): points = [X[j]

for

j in

range

(

len

(X))

if

idx[j] == i] c[i] = np.mean(points, axis=

0

)/<code>

進行可視化

<code>colors = [

'r'

,

'g'

,

'b'

] fig, ax = plt.subplots()

for

i in

range

(K): points = np.array([X[j]

for

j in

range

(

len

(X))

if

idx[j] == i]) ax.scatter(points[:,

0

], points[:,

1

], c=colors[i]) ax.scatter(c[:,

0

], c[:,

1

], marker=

'*'

, s=

200

, c=

'#050505'

)/<code>
使用Python進行K均值聚類


分享到:


相關文章: