k-means伪代码

Posted wqbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 #返回最终的簇中心点

 

以上是关于k-means伪代码的主要内容,如果未能解决你的问题,请参考以下文章

手写k-means算法

K-Means算法原理

为啥使用 k-means(来自 Scipy)聚类到两个片段的图像会显示两个以上不同的像素值?

k-means聚类算法

找到 K-means 集群中的最小方差

是否有在单个活动中处理多个片段的 Android 设计模式?