系统聚类法python_Python使用系统聚类算法对随机元素进行分类

本文介绍了Python如何使用系统聚类算法对随机坐标元素进行层次聚类,通过欧几里得距离计算合并最近的点,直至形成指定数量的类。算法适用于小数据集,对于大数据聚类效率较低。
摘要由CSDN通过智能技术生成

原标题:Python使用系统聚类算法对随机元素进行分类

系统聚类算法又称层次聚类或系谱聚类,首先把样本看作各自一类,定义类间距离,选择距离最小的一对元素合并成一个新的类,重复计算各类之间的距离并重复上面的步骤,直到将所有原始元素分成指定数量的类。该算法的计算复杂度比较高,不适合大数据聚类问题。

fromrandom importrandrange

defgenerate(s, m1, m2):

'''生成形式如[('a', (1,5)), ('b', (3,6))]的随机坐标'''

x = [(ch, (randrange(m1), randrange(m1))) forch ins]

returnx

defxitongJulei(points, k=5):

'''根据欧几里得距离对points进行聚类,最终划分为k类'''

points = points[:]

whilelen(points)>k:

nearest = float('inf')

# 查找距离最近的两个点,进行合并

# 合并后的两个点,使用中点代替其坐标

forindex1, point1 inenumerate(points[:-1]):

position1 = point1[1]

# 注意:这里的start参数很重要

forindex2, point2 inenumerate(points[index1+1:], start=index1+1):

position2 = point2[1]

distance = (position1[0]-position2[0])**2 + (position1[1]-position2[1])**2

ifdistance < nearest:

result = (index1, index2)

nearest = distance

# 弹出距离最近的两个点,合并为一个点

p2 = points.pop(result[1])

p1 = points.pop(result[0])

p = (p1[0]+p2[0], ((p1[1][0]+p2[1][0])/2, (p1[1][1]+p2[1][1])/2))

# 使用合并后的点代替原来的两个点

points.append(p)

# 查看每步处理后的数据

print(points)

returnpoints

# 生成随机测试数据

points = generate('abcde', 5, 5)

print('origin:'.center(20,'=')+'n', points)

print('steps:'.center(20,'='))

# 聚类

result = xitongJulei(points, k=2)

print('result'.center(20,'='))

print(result)

附上代码截图方便理解代码的对齐关系:

某次运行结果:

======origin:=======

[('a', (1, 3)), ('b', (1, 0)), ('c', (1, 3)), ('d', (0, 0)), ('e', (4, 4))]

=======steps:=======

[('b', (1, 0)), ('d', (0, 0)), ('e', (4, 4)), ('ac', (1.0, 3.0))]

[('e', (4, 4)), ('ac', (1.0, 3.0)), ('bd', (0.5, 0.0))]

[('e', (4, 4)), ('acbd', (0.75, 1.5))]

=======result=======

[('e', (4, 4)), ('acbd', (0.75, 1.5))]返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值