介紹
k-means稱為聚類演算法。聚類是將乙個資料集中在某些方面相似的資料成員進行分類的過程,聚類技術通常稱為無監督學習。
核心思想
k均值聚類演算法就是先隨機選取k個物件作為初始聚類中心,然後計算每個物件與聚類中心之間的距離,把每個物件分配給離它最近的聚類中心。一旦所有物件都被分配了,每個聚類中心就會根據聚類中現有的物件重新計算,重複此過程,直到滿足某個終止條件。一般的終止條件可以是:所有的聚類中心都不在發生變化。
**示例
執行結果這張圖就是最終聚類的結果了,所有的圓點代表聚類物件,x代表聚類中心。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
("初始化的圓心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)
# 更新圓心
('訓練'
+str
(i+1)+
'次後的圓心'
+str
(c1)
+' '
+str
(c2))if
(last_c1 == c1 and last_c2 == c2)
:# 如果聚類中心沒有發生變化,終止聚類
('共訓練'
+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(
)
這張圖顯示了聚類過程中聚類中心位置的變化情況。
K Means聚類演算法
k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...
聚類演算法 K means
演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...
k means聚類演算法
說到聚類,得跟分類區別開來,分類是按人為給定的標準將樣本歸到某個類別中去,在機器學習中多是監督學習,也就是訓練樣本要給標籤 正確的類別資訊 而聚類是在某種規則下自動將樣本歸類,在機器學習中是無監督學習,不需要提前給樣本打標籤。k means聚類演算法,就是在某種度量方式下,將樣本自動劃分到k個類別中...