k-means偽代碼


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 #返回最終的簇中心點

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM