无监督学习K-means算法的python实现

k-means算法
k-means算法是一个机器学习的经典算法,用求聚类。是无监督学习的典型代表

由于时间关系(赶着出去玩),直接上代码,可能会有bug hhh

import numpy as np
import math
#定义结点
class node:
    def _init_(self,x1,x2):
        self.x1=x1
        self.x2=x2
#生成初始的K个质心
def get_initial_centroids(K):
    x1=np.random.rand(K)
    x2=np.random.rand(K)
    return np.vstack((x1,x2)).T
#计算欧式距离
def Euclid_Distance(a1,b1,a2,b2):
    distance=math.sqrt((a1-b1)**2+(a2-b2)**2)
    return distance
if __name__ == '__main__':
    print("请输入K的值")
    K=int(input())
    centre=get_initial_centroids(K)
    
    print("请输入数据的个数的两倍")
    y=int(input())#y为输入数据的个数,为偶数。
    if y%2 != 0:
        print("y得为偶数")
    print("请输入数据")
    data=[]
    for i in range(0,int(y)):
        x=int(input())
        data.append(x)

    data=np.array(data)
    data=data.reshape((int(y/2),2))
    epoch=int(input())#输入迭代次数
    i=0
    #print(centre)
    #print(data)
    while i<epoch:
        lis=[]
        m={}
        for j in range(0,K):
            lis.append([])
        for j in range(0,int(y/2)):
            m={}
            for k in range(0,K):
                m[Euclid_Distance(data[j][0],centre[k][0],data[j][1],centre[k][1])]=k
            kkk=0
            for k in m:
                if kkk==0:
                    kk=k
                elif k<kk:
                    kk=k
                kkk+=1
            lis[m[kk]].append(j)
        #重新计算质心
        for j in range(0,K):
            xx=0
            yy=0
            pc=0
            for k in lis[j]:
                  xx+=data[k][0]
                  yy+=data[k][1]
                  pc=pc+1
            if pc==0:
                continue
            centre[j][0]=xx/pc
            centre[j][1]=yy/pc
        i+=1
    print(lis)


TYP
发布了7 篇原创文章 · 获赞 0 · 访问量 552

猜你喜欢

转载自blog.csdn.net/weixin_44000193/article/details/95629644