Python实现k-means算法

来源:互联网 发布:java 车牌识别 编辑:程序博客网 时间:2024/05/21 23:33

k-means算法描述如下:

输入:期望得到的簇的数目k,n个对象的数据D
输出:k个簇的集合
方法:

(1)选择k个对象作为初始的簇的质心

(2)repeat

(3)计算对象与各个簇的质心的距离,将对象划分到距离其最近的簇

(4)重新计算每个新簇的均值

(5)Until簇的质心不再变化

Python代码:

假设:给定如下要进行聚类的对象:
 {2,4,10,12,3,20,30,11,25},k = 2

# coding=utf-8'''计算两点之间的距离'''def distance(n1, n2):    d = n1 - n2    if d < 0:        d = -d    return d    '''计算一串数的中点'''def center(nums):    sum = 0    for item in nums:        sum = sum + item    return sum / len(nums)'''k-means算法'''def main():    n = 2    nums = [2, 4, 10, 12, 3, 20, 30, 11, 25]        c1 = nums[0]            #类1的中心点,初始为第一个数    c2 = nums[1]            #类2的中心点,初始为第二个数    new_c1 = c1-1           #一次聚类后类1新的中心点    new_c2 = c2 - 1         #一次聚类后类2新的中心点    g1 = []                 #类1    g2 = []                 #类2    isFirst = True    step = 1    #k-means核心算法    while not c1 == new_c1 or not c2 == new_c2:        print "----------------------------------------------"        print  "step %d"  % step         step = step + 1        #不是第一次运行,使用新的中心点        if not isFirst:            c1 = new_c1            c2 = new_c2        isFirst = False        #通过距离划分族        for item in nums :            d1 = distance(item, new_c1)            d2 = distance(item, new_c2)            if d1 <= d2 :                g1.append(item)            else:                g2.append(item)        #计算新类的中点        new_c1 = center(g1)        new_c2 = center(g2)        g1.sort()        g2.sort()        print  "group 1 is",  g1        print  "group 2 is",  g2        #清空g1, g2        del g1[:]        del g2[:]        print "----------------------------------------------"#开始运行main()

初学数据挖掘,很多原理都不懂,写个算法练练手。



0 0
原创粉丝点击