從資料集中隨機選擇k個聚類樣本作為初始的聚類中心,然後計算資料集中每個樣本到這k個聚類中心的距離,並將此樣本分到距離最小的聚類中心所對應的類中。將所有樣本歸類後,對於每個類別重新計算每個類別的聚類中心即每個類中所有樣本的質心,重複以上操作直到聚類中心不變為止。
k-means存在缺點:
1)k-means是區域性最優的,容易受到初始質心的影響
2)同時,k值的選取也會直接影響聚類結果,最優聚類的k值應與樣本資料本身的結構資訊相吻合,而這種結構資訊是很難去掌握,因此選取最優k值是非常困難的。
選取密度最大的作為第乙個類中心,然後選取距離第乙個類中心最遠的作為第二個類中心,然後選取距離兩個類中心都較遠的作為第三個類中心,依次類推。。。
參考**
def
kmeans
(k):
m, n =
100,
20# 構造樣本:100行、20列
x =10* np.random.random(
(m, n)
)# 隨機選擇k個初始中心點
init_cent_sample =
set(
)while
len(init_cent_sample)
< k:
init_cent_sample.add(np.random.randint(
0, m)
) cent = x[
list
(init_cent_sample)
]# 記錄每個樣本的類歸屬
cluster_assessment = np.zeros(
(m,2))
# 記錄每個類的中心點在本次迭代後是否有過改變
cent_changed =
true
while cent_changed:
cent_changed =
false
for j in
range
(m):
# 記錄每個樣本距離最近的類
min_inx =-1
# 記錄每個樣本的最小類距
min_dist = math.inf
for i in
range
(k):
d = distance(x[j]
, cent[i]
)if d < min_dist:
min_dist = d
min_inx = i
# 記錄此樣本的中心點是否發生變化
if min_inx != cluster_assessment[j][0
]:cluster_assessment[j]
= np.array(
[min_inx, min_dist]
) cent_changed =
true
print
(cluster_assessment)
# 更新每個類的中心點:均值
for i in
range
(k):
cent_i_samples = np.where(cluster_assessment[:,
0]== i)
iflen
(cent_i_samples)
>0:
print
(cent_i_samples)
cent[i]
= np.mean(x[cent_i_samples]
, axis=0)
# 計算距離
defdistance
(a, b)
:return math.sqrt(
sum(
pow(a - b,2)
))
機器學習之K means演算法
前言 簡介 在之前發表的線性回歸 邏輯回歸 神經網路 svm支援向量機等演算法都是監督學習演算法,需要樣本進行訓練,且 樣本的類別是知道的。接下來要介紹的是非監督學習演算法,其樣本的類別是未知的。非監督學習演算法中,比較有代表性 的就是聚類演算法。而聚類演算法中,又有 以上只是部分演算法,在這裡就不...
機器學習 K Means演算法
簡介 又叫k 均值演算法,是非監督學習中的聚類演算法。基本思想 k means演算法比較簡單。在k means演算法中,用cluster來表示簇 容易證明k means演算法收斂等同於所有質心不再發生變化。基本的k means演算法流程如下 選取k個初始質心 作為初始cluster,每個初始clus...
機器學習之聚類演算法 K Means
參考 聚類演算法可以分為 中心點方法 層次聚類方法 基於密度方法 基於網格 基於模型方法。其中最為經典的是k means演算法 k means屬於中心點方法 也有叫劃分方法 演算法經典簡單。演算法 人工選取k值,並選取k個點作為k個簇的質心 對所有樣本分別計算到k個簇的質心的距離 歐式或者曼哈頓 取...