K means聚類演算法

2021-09-28 20:01:31 字數 1950 閱讀 1810

對給定的樣本集, 按照樣本之間的距離大小,把樣本集劃分為k個簇。計算過程如下:

隨機選擇k個隨機的點(稱為聚類中心)。

對與資料集中的每個資料點,按照距離k個中心點的距離,把其與距離最近的中心點關聯起來,與同一中心點關聯的所有點聚成一類。

計算每一組的均值,把該組相關聯的中心點移動到平均值的位置。

重複執行2~3步,直至中心點不再變化。

西瓜書給出的實現過程如下:

為避免執行時間過長, 通常設定乙個最大執行輪數最小調整幅度閾值, 若達到最大輪數或調整幅度小於閾值,則停止執行.

k值的選取方式很多,初始點盡量選取相聚較遠的點。

時間複雜度只有o(tkn)空間複雜度:o(n* m)

t是迭代次數,k是設定的聚類數目,而n是資料量,m為每個元素字段個數,因為除了資料量n以外的因素都可以看做是常量,所以時空複雜度可以簡化成o(n),是線性的。

相比起很多其它演算法,k-means算是比較高效的。正所謂天下武功,無堅不摧,唯快不破,它有很多不足,但最大優點就是:快!一般作為資料預處理,或用於輔助分類貼標籤,所以k值一般不會取很大。

優點:

原理簡單並容易實現;

聚類效果較優。

缺點有:

k值的選取不好把握;

需要使用者事先指定類簇個數;

k-means是區域性最優的,聚類結果對初始類簇中心的選取較為敏感。

對於非凸資料集的聚類表現不好(不如dbscan密度聚類好)

主要利用 python的sklearn.cluster的kmeans實現:

import numpy as np

from sklearn.cluster import kmeans

import matplotlib.pyplot as plt

def mykmeans(x,y,cluster,colors):

#生成所需資料

array = np.array(list(zip(x, y))).reshape(len(x), 2)

# 生成聚類標籤

kmeans = kmeans(cluster) # 引數代表生成的簇數

kmeans.fit(array)

markers = ['o', 's', 'd']

#展示結果

for i, l in enumerate(kmeans.labels_):

plt.plot(x[i], y[i], color=colors[l], marker=markers[l], ls='none')

plt.show()

#準備所需二維資料

x = np.array([1, 2, 2, 2, 3, 4, 1, 5, 6, 7, 5, 5, 6, 7, 8, 7, 9, 9])

y = np.array([1, 2, 1, 3, 2, 3, 2, 8, 6, 7, 7, 6, 7, 1, 2, 3, 1, 3])

cluster = 3

colors = ['b', 'g', 'r']

mykmeans(x,y,cluster,colors)

#顯示效果

plt.figure()

colors = ['b', 'g', 'r']

markers = ['o', 's', 'd']

效果如下:

K Means聚類演算法

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

聚類演算法 K means

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

k means聚類演算法

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