Advertisement
VladSmirN

Untitled

Feb 15th, 2023
813
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.83 KB | None | 0 0
  1. df = pd.read_csv("/content/drive/MyDrive/iris.csv")
  2.  
  3. x_cluster = df.sample(frac=1).copy()
  4. x_train = x_cluster.iloc[:,[0,1,2,3]].to_numpy()
  5. y_train = x_cluster.species.to_numpy()
  6.  
  7. def euclidean_metric(a, b):
  8.   return (sum((a - b)**2))**(0.5)
  9.  
  10. def average_distance(centers):
  11.   distance = 0
  12.   for i in range(len(centers)-1):
  13.     for j in range(i+1,len(centers)):
  14.       distance += euclidean_metric(x_train[centers[i]] , x_train[centers[j]])
  15.   return distance / len(centers)
  16.  
  17. # Инициализация массива центров
  18. centers = []
  19. # Множество индексов точек
  20. points = set(range(x_train.shape[0]))
  21. # Добавление случайно выбранной точки в качестве первого центра
  22. centers.append(np.random.choice(x_train.shape[0], 1)[0])
  23. # Удаление первого центра из множества точек
  24. points.remove(centers[0])
  25. # Инициализация порогового значения T и флага добавления новых центров
  26. T = -1
  27. add_new_center = True
  28.  
  29. # Пока есть необработанные точки
  30. while add_new_center:
  31.     # Инициализация min_max
  32.     min_max = (-1,-1)
  33.    
  34.     # Для каждой точки в множестве points
  35.     for point in points:
  36.         # Расчет расстояний до всех центров
  37.         distance = [euclidean_metric(x_train[point] ,x_train[center]) for  center in centers]
  38.         # Нахождение индекса ближайшего центра
  39.         center_for_points = np.argmin(distance)
  40.  
  41.         # Если расстояние до ближайшего центра максимальное
  42.         if min_max[1] < distance[center_for_points]:
  43.             # Обновление min_max
  44.             min_max = (point,distance[center_for_points])
  45.  
  46.     # Если расстояние до ближайшего центра максимальное и превышает порог T
  47.     if min_max[1] > T:
  48.         # Добавление нового центра
  49.         centers.append(point)
  50.         # Удаление добавленного центра из множества points
  51.         points.remove(point)
  52.         # Продолжение поиска новых центров
  53.         add_new_center = True
  54.     else:
  55.         # Завершение поиска новых центров
  56.         add_new_center = False
  57.     # Обновление порогового значения T
  58.     T = average_distance(centers)
  59.  
  60. # Распределение точек по кластерам
  61. answer = [ [] for x in centers]
  62. for point in points:
  63.     center_ = np.argmin([euclidean_metric(x_train[point] ,x_train[center]) for  center in centers])
  64.     answer[center_].append(y_train[point])
  65.    
  66. answer
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement