阿里面試時候被問到簡單介紹一下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個類別中...