對給定的樣本集, 按照樣本之間的距離大小,把樣本集劃分為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個類別中...