1、初始化k個簇中心。
2、更新所有樣本點簇歸屬:樣本點到哪個簇中心點最近就屬於哪個簇。
3、重新計算每個簇的中心點(直到簇中心點不再變化或達到更新最大次數)
#k-means偽代碼 import numpy as np import copy #計算歐氏距離 def get_distance(X,Y): return np.sum((X-Y)**2)**0.5 def calc_mean(X): #計算中心點,每一維取均值 l=len(X[0]) list_mean=[] for i in range(l): s=0 for j in X: s+=j[i] m=s/len(X) list_mean.append(m) return list_mean def k_means(x_train,k,max_iter): num_iter = 0 #初始簇中心 cluster_center = x_train[:k] pre_cluster_center = copy.deep_copy(cluster_center) #上一次的簇中心點 #開始迭代 while num_iter<max_iter: #臨時變量 clusters_data={} #字典{簇下標:坐標} for i in x_train: cluster_dists=[] for index,cluster in enumerate(cluster_center): distance=get_distance(i,cluster) cluster_dists.append((index,distance)) #每個樣本到中心點的距離 cluster_dists.sort(key=lambda x:x[1]) #升序 min_index,min_dist=cluster_dists[0] #取距離最近 if min_index not in clusters_data: clusters_data[min_index]=[] clusters_data[min_index].append(i) #數據添加到臨時變量中 #更新簇中心點 for index in clusters_data: cluster_center[index]=calc_mean(clusters_data[index]) if pre_cluster_center == cluster_center: break #如果簇中心點不再變化,那么結束 else: pre_cluster_center = copy.deep_copy(cluster_center) #拷貝一下 return cluster_center #返回最終的簇中心點