zoukankan      html  css  js  c++  java
  • python 实现kmeans聚类

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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
  • 相关阅读:
    Google's Innovation Factory (and how testing adapts)
    虎年拜年帖
    [ZZ]让测试也敏捷起来
    Selenimu做爬虫续
    OKR的解说
    春秋航空的机上店铺
    免费TK域名试用
    快速排序_C语言实现
    第一篇博客
    C、C++代码格式优化软件献给编程爱好者
  • 原文地址:https://www.cnblogs.com/jyxbk/p/8675402.html
Copyright © 2011-2022 走看看