您的位置:首页 > 编程语言 > Python开发

Python实现k-means算法

2014-10-14 21:52 309 查看
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()


初学数据挖掘,很多原理都不懂,写个算法练练手。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: