Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- df = pd.read_csv("/content/drive/MyDrive/iris.csv")
- x_cluster = df.sample(frac=1).copy()
- x_train = x_cluster.iloc[:,[0,1,2,3]].to_numpy()
- y_train = x_cluster.species.to_numpy()
- def euclidean_metric(a, b):
- return (sum((a - b)**2))**(0.5)
- def average_distance(centers):
- distance = 0
- for i in range(len(centers)-1):
- for j in range(i+1,len(centers)):
- distance += euclidean_metric(x_train[centers[i]] , x_train[centers[j]])
- return distance / len(centers)
- # Инициализация массива центров
- centers = []
- # Множество индексов точек
- points = set(range(x_train.shape[0]))
- # Добавление случайно выбранной точки в качестве первого центра
- centers.append(np.random.choice(x_train.shape[0], 1)[0])
- # Удаление первого центра из множества точек
- points.remove(centers[0])
- # Инициализация порогового значения T и флага добавления новых центров
- T = -1
- add_new_center = True
- # Пока есть необработанные точки
- while add_new_center:
- # Инициализация min_max
- min_max = (-1,-1)
- # Для каждой точки в множестве points
- for point in points:
- # Расчет расстояний до всех центров
- distance = [euclidean_metric(x_train[point] ,x_train[center]) for center in centers]
- # Нахождение индекса ближайшего центра
- center_for_points = np.argmin(distance)
- # Если расстояние до ближайшего центра максимальное
- if min_max[1] < distance[center_for_points]:
- # Обновление min_max
- min_max = (point,distance[center_for_points])
- # Если расстояние до ближайшего центра максимальное и превышает порог T
- if min_max[1] > T:
- # Добавление нового центра
- centers.append(point)
- # Удаление добавленного центра из множества points
- points.remove(point)
- # Продолжение поиска новых центров
- add_new_center = True
- else:
- # Завершение поиска новых центров
- add_new_center = False
- # Обновление порогового значения T
- T = average_distance(centers)
- # Распределение точек по кластерам
- answer = [ [] for x in centers]
- for point in points:
- center_ = np.argmin([euclidean_metric(x_train[point] ,x_train[center]) for center in centers])
- answer[center_].append(y_train[point])
- answer
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement