kmeans聚类的python实现

1. kmeans算法简介

待补充

2. python实现

2.1 基础版

kmeans算法,前几天的一道面试在线编程题目。好久不用python手法都生疏了,写的很慢。不过后来对比了下网络上的其他kmeans的python实现,感觉自己的实现相对简洁美观,代码量少。这主要依赖于numpy包的使用。
废话少说,直接上代码.
对于输入数据的说明
data是一个\(n*m\)的数组,\(data\in R^{n*m}\)\(n\)是训练数据的样本个数,\(m\)是feature的维数,\(k\)是设定好的聚类数

import numpy as np
def kmeans(data, n, m, k):
    rarray = np.random.random(size=k)
    rarray = np.floor(rarray*n)
    rarray.astype(int)
    end = True
    cls = np.zeros([1,n],np.int)            
    center = np.take(data,rarray)
    pcenter = np.zeros([k,m])
    while end:
        for i in xrange(n):
            tmp = data[i] - center
            tmp = np.square(tmp)
            tmp = np.sum(tmp,axis=1)
            cls[i] = np.argmin(tmp)
        center = np.zeros([k,m])
        count = np.zeros([1,k],np.int)
        for i in xrange(n):
            center[cls[i]]=center[cls[i]]+data[i]
            count[cls[i]]= count[cls[i]]+1
        if center/count == pcenter:
            end = False
        pcenter = center/count

2.2 修改版

说是修改版其实有点勉强,不过确实是一个很有用的修改。编程中在做数值相等判断的时候,直接使用==判断并不可靠。实际上经过运算后的两个值(浮点型)并不可能完全一致,可能会因为小数点后的些许差异导致判断为false。
比如:

print 1e-5 == 1e-6 //这肯定是false,但是实际这两个值可以看作近似相等。

在kmeans中判断是否结束循环,就是判断重新计算的聚类中心点是否和原聚类中心点一致,实际上新旧聚类中心点之间会有一个可允许的误差。修改代码如下:

import numpy as np
def kmeans(data, n, m, k):
    rarray = np.random.random(size=k)
    rarray = np.floor(rarray*n)
    rarray.astype(int)
    cls = np.zeros([1,n],np.int)            
    center = np.take(data,rarray)
    pcenter = np.zeros([k,m])
    end = True
    while end:
        for i in xrange(n):
            tmp = data[i] - center
            tmp = np.square(tmp)
            tmp = np.sum(tmp,axis=1)
            cls[i] = np.argmin(tmp)
        center = np.zeros([k,m])
        count = np.zeros([1,k],np.int)
        for i in xrange(n):
            center[cls[i]]=center[cls[i]]+data[i]
            count[cls[i]]= count[cls[i]]+1
        if np.sum(center/count - pcenter) <= 1e-4:
            end = False
        pcenter = center/count

3. 待解决的问题

由于聚类之后,开始新的迭代过程中,可能有某一类\(k'\)会产生特殊情况:训练样本中没有任何一个被分到这个类。这个时候对应的count[k'] = 0,直接做除法显然就会报错,这个问题暂时还没有解决。

转载于:https://www.cnblogs.com/dagger14/p/6586432.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值