当前位置:   article > 正文

【数据挖掘】AGNES聚类算法(python实现)_agnes聚类算法 算法实例

agnes聚类算法 算法实例

一、python代码 

  1. '''
  2. Author: Vici__
  3. date: 2020/5/21
  4. '''
  5. import math
  6. '''
  7. Point类,记录坐标x,y和点的名字id
  8. '''
  9. class Point:
  10. '''
  11. 初始化函数
  12. '''
  13. def __init__(self, x, y, id):
  14. self.x = x # 横坐标
  15. self.y = y # 纵坐标
  16. self.id = id # 名字(编号)
  17. '''
  18. 计算两点之间的欧几里得距离
  19. '''
  20. def calc_Euclidean_distance(self, p2):
  21. return math.sqrt((self.x - p2.x) * (self.x - p2.x) + (self.y - p2.y) * (self.y - p2.y))
  22. '''
  23. 1. 获取数据集
  24. '''
  25. def get_dataset():
  26. # 原始数据集以元组形式存放,(横坐标,纵坐标,编号)
  27. datas = [(0, 2, 'A'), (0, 0, 'B'), (1.5, 0, 'C'), (5, 0, 'D'), (5, 2, 'E')]
  28. dataset = [] # 用于计算两点之间的距离,形式 [point1, point2...]
  29. C = {} # 用于簇之间的合并操作,形式{index1:[p1], index2:[p2]...}
  30. for i in range(len(datas)): # 遍历原始数据集
  31. point = Point(datas[i][0], datas[i][1], datas[i][2]) # 利用(横坐标,纵坐标,编号)实例化
  32. dataset.append(point) # 放入dataset中
  33. C[str(i)] = [point] # 编号和点做映射
  34. return dataset, C # [p1, p2], {index:[p1]}
  35. '''
  36. 2. 计算任意两点之间的距离
  37. '''
  38. def get_dist(dataset):
  39. n = len(dataset) # 点的个数
  40. dist = [] # 存放任意两点之间的距离
  41. for i in range(n):
  42. dist_i = [] # 临时列表
  43. for j in range(n): # 遍历数据集
  44. # 计算距离并放入临时列表中
  45. dist_i.append(dataset[i].calc_Euclidean_distance(dataset[j]))
  46. dist.append(dist_i) # 利用临时列表创建二维列表
  47. # 打印dist
  48. print("任意两点之间的距离:")
  49. for d in dist:
  50. print(d)
  51. print()
  52. return dist
  53. '''
  54. 3. 寻找最小距离,并返回这两点的编号
  55. '''
  56. def find_Min(dist):
  57. n = len(dist)
  58. (p1, p2) = (-1, -1) # 定义两个点的编号
  59. Min = float("INF") # 初始化最小值为无穷大
  60. for i in range(n): # 遍历dist列表
  61. for j in range(i+1, n): # 从i+1开始即可,因为这个列表是对称矩阵
  62. if dist[i][j] < Min and dist[i][j] != 0: # 当前两点距离小于最小值
  63. Min = dist[i][j] # 更新最小距离
  64. (p1, p2) = (i, j) # 更新两点编号
  65. return p1, p2 # 返回这两点的编号
  66. '''
  67. 4. 更新距离列表,将此列表扩大一行一列
  68. '''
  69. def update_dist(index, dist, p1, p2):
  70. last_row = [] # 新加的最后一行
  71. n = len(dist)
  72. for i in range(n):
  73. Min = min(dist[p1][i], dist[p2][i]) # 取这两个点和其它点之间较小的距离,作为这新簇和其它点的距离
  74. dist[i].append(Min) # 增加最后一列
  75. last_row.append(Min) # 增加最后一行
  76. last_row.append(0)
  77. dist.append(last_row)
  78. for i in range(n): # 遍历原dist列表,使p1, p2失效,新增的簇代替了他们
  79. dist[p1][i] = float("INF")
  80. dist[p2][i] = float("INF")
  81. dist[i][p1] = float("INF")
  82. dist[i][p2] = float("INF")
  83. '''
  84. 5. AGNES算法主函数
  85. '''
  86. def AGNES(dataset, C, k):
  87. dist = get_dist(dataset) # 计算任意两点之间的距离
  88. index = count = len(dataset) # index是用来给新簇编号的,count是用来记录簇的个数的
  89. while count > k: # 当簇等于k个时,结束循环
  90. p1, p2 = find_Min(dist) # 找到当前最短距离的两个簇
  91. C[str(index)] = C[str(p1)] + C[str(p2)] # 新簇是两个簇的合并
  92. del C[str(p1)]
  93. del C[str(p2)] # 删除两个旧簇
  94. update_dist(index, dist, p1, p2) # 更新dist列表
  95. index += 1 # 新簇编号前移
  96. count -= 1 # 簇的个数减少1个
  97. print("合并后的新簇:")
  98. for value_set in C.values():
  99. for element in value_set:
  100. print(element.id, end="")
  101. print()
  102. # 打印结果
  103. dataset, C = get_dataset()
  104. k = 2
  105. AGNES(dataset, C, k)

二、测试

要求输出聚类后各个簇中数据点的编号。实验数据:设有5个样本点。设终止条件为“k=2”。样本数据集如下表所示:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/293289
推荐阅读
相关标签
  

闽ICP备14008679号