關於K means聚類演算法重點理解

2021-10-04 11:01:08 字數 3435 閱讀 8361

阿里面試時候被問到簡單介紹一下k-means演算法,以及迴圈迭代的終止條件是什麼?特此記錄,共勉!

k均值聚類演算法(k-means clustering algorithm)是一種迭代求解的聚類分析演算法。

1、預將資料分為k組,則隨機選取k個物件作為初始的聚類中心;

2、然後計算每個物件與各個種子聚類中心之間的距離,把每個物件分配給距離它最近的聚類中心。

3、聚類中心以及分配給它們的物件就代表乙個聚類。每分配乙個樣本,聚類的聚類中心會根據聚類中現有的物件被重新計算。這個過程將不斷重複直到滿足某個終止條件。

1、可以是沒有(或最小數目)物件被重新分配給不同的聚類

2、沒有(或最小數目)聚類中心再發生變化

3、誤差平方和區域性最小。

偽**1、選擇k個點作為初始質心。

2、repeat 將每個點指派到最近的質心,形成k個簇 重新計算每個簇的質心 until 質心不發生變化。

k值的選擇主要還是根據經驗以及利用k-means聚類的目的來決定。

import numpy as np

import matplotlib.pyplot as plt

# 載入資料

defloaddataset

(filename)

: data = np.loadtxt(filename,delimiter=

'\t'

)return data

# 歐氏距離計算

defdisteclud

(x,y)

:return np.sqrt(np.

sum(

(x-y)**2

))# 計算歐氏距離

# 為給定資料集構建乙個包含k個隨機質心的集合

defrandcent

(dataset,k)

: m,n = dataset.shape

centroids = np.zeros(

(k,n)

)for i in

range

(k):

index =

int(np.random.uniform(

0,m))#

centroids[i,:]

= dataset[index,:]

return centroids

# k均值聚類

defkmeans

(dataset,k):

m = np.shape(dataset)[0

]#行的數目

# 第一列存樣本屬於哪一簇

# 第二列存樣本的到簇的中心點的誤差

clusterassment = np.mat(np.zeros(

(m,2))

) clusterchange =

true

# 第1步 初始化centroids

centroids = randcent(dataset,k)

while clusterchange:

clusterchange =

false

# 遍歷所有的樣本(行數)

for i in

range

(m):

mindist =

100000.0

minindex =-1

# 遍歷所有的質心

#第2步 找出最近的質心

for j in

range

(k):

# 計算該樣本到質心的歐式距離

distance = disteclud(centroids[j,:]

,dataset[i,:]

)if distance < mindist:

mindist = distance

minindex = j

# 第 3 步:更新每一行樣本所屬的簇

if clusterassment[i,0]

!= minindex:

clusterchange =

true

clusterassment[i,:]

= minindex,mindist**

2#第 4 步:更新質心

for j in

range

(k):

pointsincluster = dataset[np.nonzero(clusterassment[:,

0].a == j)[0

]]# 獲取簇類所有的點

centroids[j,:]

= np.mean(pointsincluster,axis=0)

# 對矩陣的行求均值

print

("congratulations,cluster complete!"

)return centroids,clusterassment

defshowcluster

(dataset,k,centroids,clusterassment)

: m,n = dataset.shape

if n !=2:

print

("資料不是二維的"

)return1

mark =

['or'

,'ob'

,'og'

,'ok'

,'^r'

,'+r'

,'sr'

,'dr',',

'pr'

]if k >

len(mark)

:print

("k值太大了"

)return

1# 繪製所有的樣本

for i in

range

(m):

markindex =

int(clusterassment[i,0]

) plt.plot(dataset[i,0]

,dataset[i,1]

,mark[markindex])

mark =

['dr'

,'db'

,'dg'

,'dk'

,'^b'

,'+b'

,'sb'

,'db',',

'pb'

]# 繪製質心

for i in

range

(k):

plt.plot(centroids[i,0]

,centroids[i,1]

,mark[i])

plt.show(

)dataset = loaddataset(

"test.txt"

)k =

4centroids,clusterassment = kmeans(dataset,k)

showcluster(dataset,k,centroids,clusterassment)

K Means聚類演算法

k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...

聚類演算法 K means

演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...

k means聚類演算法

說到聚類,得跟分類區別開來,分類是按人為給定的標準將樣本歸到某個類別中去,在機器學習中多是監督學習,也就是訓練樣本要給標籤 正確的類別資訊 而聚類是在某種規則下自動將樣本歸類,在機器學習中是無監督學習,不需要提前給樣本打標籤。k means聚類演算法,就是在某種度量方式下,將樣本自動劃分到k個類別中...