首页 > 代码库 > Python--K-mean-algorithm进行样本点的分类

Python--K-mean-algorithm进行样本点的分类

在模式识别中,K均值算法主要用于分类数目已知的聚类,实现较为简单,算法目的清晰,属于较为简单的动态聚类算法之一。

算法中通过迭代判断前后两次算法的聚类中心是否一致,从而决定是否继续迭代(前后一致则退出算法,完成分类)。

 

下面的K均值算法的简单示例:

#K-均值算法聚类分析

from numpy import*
from math import sqrt
#要求编写程序对下列数据进行聚类分析,取K为2
x=array([
        [0,0],[1,0],[0,1],[1,1],[2,1],
        [1,2],[2,2],[3,2],[6,6],[7,6],
        [8,6],[6,7],[7,7],[8,7],[9,7],
        [7,8],[8,8],[9,8],[8,9],[9,9]])


#求样本点与聚类中心的距离
def dis(a,b):
    return sqrt((a[0]-b[0])**2+(a[1]-b[1])**2)
    
#对样本分类
def distribution(x,z_1,z_2,n1,n2):
    for i in range(0,len(x)):
        if (dis(x[i],z_1) < dis(x[i],z_2)):
            n1.append(i)
        else:
            n2.append(i)

#建立新的聚类中心
def new_dis_center(x,z_1,z_2,n1,n2):
    z_1_1=[0,0]
    z_2_1=[0,0]
    for i in range(0,(len(n1))):
        z_1_1=z_1_1+x[n1[i]]/len(n1)
        
    for i in range(0,(len(n2))):
        z_2_1=z_2_1+x[n2[i]]/len(n2)
    return z_1_1,z_2_1
    
#迭代函数 输入数据以及初始聚类中心
def iteration_fun(x,z_1,z_2):
    #初始化迭代聚类中心中间量
    z_1_1=[0,0]
    z_2_1=[0,0]
    n1=[]
    n2=[]
    
    distribution(x,z_1,z_2,n1,n2)
    (z_1_1,z_2_1)=new_dis_center(x,z_1,z_2,n1,n2)
    
    #迭代判断
    if (z_1_1 == z_1).all() or (z_2_1==z_2).all():
        print("The Clustering Center after iteration:")
        print("Clustering center one: ")
        print(z_1)
        print("Clustering center two: ")
        print(z_2)
    else:
        z_1=z_1_1
        z_2=z_2_1
        iteration_fun(x,z_1,z_2)
    

#初始化聚类中心(包括备用迭代聚类中心)  聚类样本集
z_1=x[0]
z_2=x[1]

iteration_fun(x,z_1,z_2)

 

Python--K-mean-algorithm进行样本点的分类