nq1s788

k-means

Apr 25th, 2026 (edited)
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.26 KB | None | 0 0
  1. from math import dist
  2. data = open('27.txt').readlines()
  3. a = []
  4. for e in data:
  5.     x, y = map(float, e.replace(',', '.').split())
  6.     a.append((x, y))
  7. cen = [(-7.9, -4.9), (-3.5, 7.2), (3.6, 8.0)]
  8. cluster = [[], [], []]
  9. for _ in range(100):
  10.     for e in a:
  11.         if dist(e, cen[0]) < dist(e, cen[1]) and dist(e, cen[0]) < dist(e, cen[2]):
  12.             cluster[0].append(e)
  13.         elif dist(e, cen[1]) < dist(e, cen[0]) and dist(e, cen[1]) < dist(e, cen[2]):
  14.             cluster[1].append(e)
  15.         else:
  16.             cluster[2].append(e)
  17.         #### альтернативный вариант вместо ифов
  18.         #dis = [dist(e, cen[0]), dist(e, cen[1]), dist(e, cen[2])]
  19.         #cluster[dis.index(min(dis))].append(e)
  20.     new_cen = []
  21.     for i in range(3):
  22.         best_c = (-1, -1)
  23.         best_rst = 100000000
  24.         for c in cluster[i]:
  25.             rst = 0
  26.             for e in cluster[i]:
  27.                 rst += dist(e, c)
  28.             if rst < best_rst:
  29.                 best_rst = rst
  30.                 best_c = c
  31.         new_cen.append(best_c)
  32.     if new_cen == cen:
  33.         cen = new_cen
  34.         break
  35.     cen = new_cen
  36. rx = abs(sum(c[0] for c in cen)) / 3
  37. ry = abs(sum(c[1] for c in cen)) / 3
  38. print(int(rx * 10000), int(ry * 10000))
Advertisement
Add Comment
Please, Sign In to add comment