Python实现简单的K-Means算法,可视化

 运行效果:

import matplotlib.pyplot as plt
import numpy as np

#随机生成大致是K个类别的点,用均匀分布生成中心点的位置,用高斯分布生成中心点周围的点
def generatorN(K):
    center=[[np.random.rand(1)*20,np.random.rand(1)*20] for _ in range(K)]
    _data=[]
    for x, y in center:
        _data.append([np.random.randn(100)+x ,np.random.randn(100)+y])

    return _data
#得到随机的初始点
def get_random_starts(_data,k_classes):
    _starts=np.random.randint(0,499,k_classes)

    _results={}
    for idx,start in enumerate( _starts):
        _results[idx]=_data[start,:]
    return _results
#每个点聚类到最近的中心点
def group_by_means(_data,_means):
    _groups={(x,y):[] for x,y in _means.values()}
    for x,y in _data:
        min_distance=10000000
        min_x = None
        min_y = None
        for center_x,center_y in _means.values():
            distance=(x-center_x)**2+(y-center_y)**2

            if distance<min_distance:
                min_distance=distance
                min_x,min_y=center_x,center_y
        _groups[(min_x,min_y)].append([x,y])
    return _groups
#计算每个簇的中心位置----累加每个点坐标,再除以点个数
def cal_new_means(_groups):
    new_means={i:None for i in range(len(_groups))}
    for idx,key in enumerate(_groups):
        len_value=len(_groups[key])
        sum_x,sum_y=0,0
        for x,y in _groups[key]:
            sum_x+=x
            sum_y+=y
        new_means[idx]=[sum_x/len_value,sum_y/len_value]
    return new_means
#判断终止的情况(没有实现)
def if_stop():
    pass
#画图
def draw_data(_groups):
    #fig=plt.figure(dpi=180)
    plt.title("画图")
    for xys in _groups.values():
        xs=[xy[0] for xy in xys]
        ys=[xy[1] for xy in xys]
        plt.scatter(xs,ys)
    plt.show()
classes_num=5

raw_data=generatorN(classes_num)#k,2,num
raw_data=np.transpose(raw_data,(0,2,1)).reshape(-1,2)#num*k,2

starts=get_random_starts(raw_data,classes_num)#k,2
means=starts#迭代用
while True :
    groups=group_by_means(raw_data,means)
    draw_data(groups)
    means=cal_new_means(groups)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

York1996

您的打赏,是我更新的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值