K Means聚類演算法

2021-09-10 14:20:11 字數 4308 閱讀 9239

介紹

k-means稱為聚類演算法。聚類是將乙個資料集中在某些方面相似的資料成員進行分類的過程,聚類技術通常稱為無監督學習。

核心思想

k均值聚類演算法就是先隨機選取k個物件作為初始聚類中心,然後計算每個物件與聚類中心之間的距離,把每個物件分配給離它最近的聚類中心。一旦所有物件都被分配了,每個聚類中心就會根據聚類中現有的物件重新計算,重複此過程,直到滿足某個終止條件。一般的終止條件可以是:所有的聚類中心都不在發生變化。

**示例

import numpy as np

import matplotlib.pyplot as plt

import math

''' 訓練集,分成兩部分,便於觀察訓練結果

'''data1 = np.random.randint(0,

50,size=(50

,2))

data2 = np.random.randint(50,

100,size=(50

,2))

traindata = np.concatenate(

[data1,data2]

)# 初始化圓心,這裡分為2類

definitialize_center

(t_data)

: num_1 = np.random.randint(0,

50)num_2 = np.random.randint(0,

50)# 確保兩圓心不是同一點

while num_1 == num_2:

num_2 = np.random.randint(0,

50)c1 =

[t_data[num_1][0

],t_data[num_1][1

]]c2 =

[t_data[num_2][0

],t_data[num_2][1

]]print

("初始化的圓心c1,c2 : "

+str

(c1)

+' '

+str

(c2)

)return

[c1,c2]

''' 引數說明:

data : 訓練集資料點

c1 : 圓心一

c2 : 圓心二

返回標記陣列

'''def

cir_distance

(data,c1,c2)

: mark =

for i in

range(0

,int

(data.size/2)

):# 計算距離

dist_1 = math.sqrt(

(data[i][0

]- c1[0]

)**2+

(data[i][1

]- c1[1]

)**2)

dist_2 = math.sqrt(

(data[i][0

]- c2[0]

)**2+

(data[i][1

]- c2[1]

)**2)

if dist_1 < dist_2:1)

# 標記為1類別

else:2

)# 標記為2類別

return np.array(mark)

''' 函式功能:更新圓心

引數說明:

data : 訓練集資料

mark : 標記資料

返回更新後的圓心,list型別

'''def

get_new_center

(data,mark)

: mark_1 = data[mark ==1]

mark_2 = data[mark ==2]

#print(mark_1)

sum_x1,sum_y1,sum_x2,sum_y2 =0,

0,0,

0for i in

range(0

,int

(mark_1.size/2)

):sum_x1 = sum_x1 + mark_1[i][0

] sum_y1 = sum_y1 + mark_1[i][1

] c1 =

[int

(sum_x1 /

(mark_1.size /2)

),int(sum_y1 /

(mark_1.size /2)

)]for j in

range(0

,int

(mark_2.size/2)

):sum_x2 = sum_x2 + mark_2[j][0

] sum_y2 = sum_y2 + mark_2[j][0

] c2 =

[int

(sum_x2 /

(mark_2.size /2)

),int(sum_y2 /

(mark_2.size /2)

)]return

[c1,c2]

''' 畫圖:訓練集的圖形,訓練後兩圓心的位置,

'''def

plot

(t_data,mark,c1,c2,i)

: red = t_data[mark ==1]

blue = t_data[mark ==2]

plt.scatter(red[:,

0],red[:,

1],10

,'r'

) plt.scatter(blue[:,

0],blue[:,

1],10

,'b'

) plt.scatter(c1[0]

,c1[1]

,100

,'r'

,'x'

) plt.scatter(c2[0]

,c2[1]

,100

,'b'

,'x'

) plt.title(

" train "

+str

(i))

plt.show(

)'''

分類函式

引數說明:

t_data : 訓練集資料

c1、c2 : 圓心

n : 迭代次數

'''def

classify

(t_data,c1,c2,n)

:# 迭代n次

for i in

range(0

,n):

mark = cir_distance(t_data,c1,c2)

# 返回標記陣列

last_c1,last_c2 = c1,c2

c1,c2 = get_new_center(t_data,mark)

# 更新圓心

print

('訓練'

+str

(i+1)+

'次後的圓心'

+str

(c1)

+' '

+str

(c2))if

(last_c1 == c1 and last_c2 == c2)

:# 如果聚類中心沒有發生變化,終止聚類

print

('共訓練'

+str

(i+1)+

'次')

break

else

: plot(t_data, mark, c1, c2, i)

# 主函式

defmain()

: c1, c2 = initialize_center(traindata)

# 初始化圓心

classify(traindata, c1, c2,5)

if __name__ ==

'__main__'

: main(

)

執行結果這張圖就是最終聚類的結果了,所有的圓點代表聚類物件,x代表聚類中心。

這張圖顯示了聚類過程中聚類中心位置的變化情況。

K Means聚類演算法

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

聚類演算法 K means

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

k means聚類演算法

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