Далее нам необходимо написать функцию для поиска центра кластера. Но прежде чем перейти к ней, реализуем вспомогательную функцию для вычисления расстояния между двумя точками.
Расстояние между двумя точками на плоскости между точками A(x1, y1) и B(x2, y2) вычисляется по формуле: d(A,B)= ((x2 - x1)**2 + (y2 - y1)**2)**0.5
Что можно описать функцией:
def d(A, B):
x1, y1 = A
x2, y2 = B
return ((x2 - x1)**2 + (y2 - y1)**2)**0.5
print(d([0, 0], [3, 4])) # 5.0
Но так же надо заметить, что эта функция уже описана в питоне, а именно в библиотеке math.
Тот же самый код, но короче через math:
from math import dist
print(dist([0, 0], [3, 4]))
Please open Telegram to view this post
VIEW IN TELEGRAM
5❤🔥8❤6🔥3
Теперь разберём функцию для поиска центра кластера. Для примера возьмём кластер:
[[0, 0], [4, 3], [2, 2], [5, 6]]
Напомню, что центром кластера называется точка, для которой сумма расстояний до всех остальных точек кластера минимальна.
Алгоритм следующий:
- Берём произвольную точку p из кластера.
- Вычисляем сумму расстояний от p до всех других точек g этого кластера.
- Повторяем для всех точек и выбираем ту, у которой сумма минимальна.
from math import dist
def center(cl):
R = []
for p in cl:
summa = 0
for g in cl:
summa += dist(p, g)
R.append([summa,p])
return min(R)[1]
clustersA = [[[0, 0], [4, 3], [2, 2], [5, 6]], []]
cl = clustersA[0]
print(center(cl)) # [2, 2] - центр первого кластера из двух
Суммы для всех точек:
15.638676800652844 [0, 0]
10.39834563766817 [4, 3]
10.06449510224598 [2, 2]
15.972527336075034 [5, 6]
from math import dist
Импорт функции для вычисления евклидова расстояния между точками.
def center(cl):
Функция, которая находит "центр" кластера (точку с минимальной суммой расстояний до остальных).
R = []
Список для сохранения результатов.
for p in cl:
Первый цикл – перебирает каждую точку кластера.
summa = 0
Обнуление суммы расстояний для текущей точки p.
for g in cl:
Вложенный цикл – вычисляет расстояние от p до всех точек g в кластере.
summa += dist(p, g)
Накопление суммы расстояний для каждой точки p
R.append([summa, p])
Cохранение суммы и точки p в список R.
return min(R)[1]
Поиск точки с минимальной суммой расстояний (центр).
clustersA = [[[0, 0], [4, 3], [2, 2], [5, 6]], []]
Тестовые данные: список из двух кластеров (второй пуст).
cl = clustersA[0]
Выбор первого кластера для обработки.
print(center(cl))
Вывод результата работы функции.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥7❤6👍2
Кульминация решения (опять же на примере кластеров из файла B) - поиск центров кластеров и вычисление среднего арифметическое абсцисс центров кластеров файла B и среднего арифметическое ординат центров кластеров файла B.
centersB = [center(cl) for cl in clustersB]
pxB = sum(x for x, y in centersB) / 3 * 10000
pyB = sum(y for x, y in centersB) / 3 * 10000
print(int(pxB), int(pyB))
centersB = [center(cl) for cl in clustersB]
Находим центры каждого кластера из списка clustersB
pxB = sum(x for x, y in centersB) / 3 * 10000
Вычисляем среднюю x-координату центров кластеров, умножаем на 10000 и делим на 3 (масштабирование)
pyB = sum(y for x, y in centersB) / 3 * 10000
Вычисляем среднюю y-координату центров кластеров, умножаем на 10000 и делим на 3 (масштабирование)
print(int(pxB), int(pyB))
Выводим результат в виде целых чисел
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8❤🔥4👍3
17 заданий - 70 баллов
21 задание - 80 баллов
25 заданий - 90 баллов
Последние два номера дают по 2 первичных балла (за каждый ответ), суммарно за них можно получить 10 вторичных.
Забавный пример программки для перевода:
while True:
s = int(input('Сколько первичных баллов ты планируешь набрать? \n'))
if 1 <= s <= 29:
tab = [7, 14, 20, 27, 34, 40, 43, 46, 48, 51,
54, 56, 59, 62, 64, 67, 70, 72, 75, 78,
80, 83, 85, 88, 90, 93, 95, 98, 100]
print(f'Ты получишь: {tab[s - 1]} баллов! \n')
else:
print('Выход из программы.')
exit()
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤3❤🔥3
🟡 1 бит🟡 1 байт = 8 бит🟡 1 Кбайт = 2¹⁰ байт = 1024 байт🟡 1 Мбайт = 2¹⁰ Кбайт = 1024 Кбайт🟡 1 Гбайт = 2¹⁰ Мбайт = 1024 Мбайт🟡 1 Тбайт = 2¹⁰ Гбайт = 1024 Гбайт🟡 1 Пбайт = 2¹⁰ Тбайт = 1024 Тбайт
Смотрите и запоминайте, если в будущем не хотите получать глупых ошибок в 7 и 11 номерах.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥8👍7❤2
else
после for
или while
в Python? #useful Блок else выполняется только если цикл завершился без использования break.
🔹 Почему это удобно?:
Например, при поиске элемента в списке:
- Если элемент найден — срабатывает break, и блок else пропускается.
- Если элемент не найден — цикл завершится нормально, и else выполнится, позволяя обработать ситуацию.
# Поиск элемента в списке
numbers = [1, 3, 5, 7, 9]
target = 4
for num in numbers:
if num == target:
print("Элемент найден:", target)
break
else:
print("Элемент не найден:", target)
- Если target есть в списке, мы его найдём и выйдем из цикла через break.
- Если target отсутствует, цикл завершится нормально, и сработает блок else, сообщая, что элемент не найден.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥27🔥10❤4
def create_counter():
count = 0 # Внутреннее состояние
def counter():
nonlocal count
count += 1
print("Текущий счет:", count)
return counter
my_counter = create_counter()
my_counter() # Текущий счет: 1
my_counter() # Текущий счет: 2
Каждый вызов my_counter() увеличивает внутренний счетчик, который "запомнен" внутри функции. Это и есть замыкание!
- Хранить состояние между вызовами
- Создавать "приватные" переменные
- Сделать код более модульным и безопасным
Please open Telegram to view this post
VIEW IN TELEGRAM
4❤🔥3❤3🔥1