Собрали программу Junior FullStack Developer and Data Scientist, включает 3 наших самых компактных курса, можно пройти за 2-3 викэнда. В программе вся база по Python + вся база по JavaScript + вся база по Data Science в Python 😎
Подпишись 👉🏻 @KodduuPython 🤖
Подпишись 👉🏻 @KodduuPython 🤖
Как насчёт кода, который рисует фрактал *Множества Мандельброта* и анимирует его приближение? Это отличный пример красоты и сложности фрактальной геометрии! И демо того как оно может тормозить на большом кол-во объектов 🐌 В следующем посте расскажем как ускорить ⚡️
Вот код для визуализации этого фрактала с постепенным "увеличением" на определённой области:
### Объяснение кода:
- Множество Мандельброта создаётся путём проверки, стремятся ли точки в комплексной плоскости к бесконечности при итерациях по формуле \( z = z^2 + c \).
- Функция `generate_mandelbrot` вычисляет фрактал для заданных границ и преобразует его в массив значений.
- Анимация `update` постепенно уменьшает масштаб (приближает) вокруг интересной точки, что позволяет видеть больше деталей.
Подпишись 👉🏻 @KodduuPython 🤖
Вот код для визуализации этого фрактала с постепенным "увеличением" на определённой области:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
# Настройка параметров фрактала
width, height = 800, 800 # Размер окна
max_iter = 256 # Максимальное количество итераций
# Начальные координаты для анимации (центр Мандельброта)
xmin, xmax, ymin, ymax = -2.0, 1.0, -1.5, 1.5
# Функция для вычисления множества Мандельброта
def mandelbrot(c, max_iter):
z = c
for n in range(max_iter):
if abs(z) > 2:
return n
z = z*z + c
return max_iter
# Функция, которая генерирует фрактал
def generate_mandelbrot(xmin, xmax, ymin, ymax, width, height, max_iter):
x, y = np.linspace(xmin, xmax, width), np.linspace(ymin, ymax, height)
C = x + y[:, None] * 1j
mandelbrot_set = np.frompyfunc(lambda c: mandelbrot(c, max_iter), 1, 1)(C).astype(np.float32)
return mandelbrot_set
# Создаем фигуру и ось для анимации
fig, ax = plt.subplots(figsize=(6, 6))
im = ax.imshow(generate_mandelbrot(xmin, xmax, ymin, ymax, width, height, max_iter),
extent=(xmin, xmax, ymin, ymax), cmap='hot', origin='lower')
# Функция обновления для анимации
def update(frame):
zoom_factor = 1.5 ** (-frame * 0.1)
x_center, y_center = -0.7435, 0.1314 # координаты интересной точки
dx, dy = (xmax - xmin) * zoom_factor, (ymax - ymin) * zoom_factor
xmin_new, xmax_new = x_center - dx / 2, x_center + dx / 2
ymin_new, ymax_new = y_center - dy / 2, y_center + dy / 2
mandelbrot_set = generate_mandelbrot(xmin_new, xmax_new, ymin_new, ymax_new, width, height, max_iter)
im.set_data(mandelbrot_set)
im.set_extent((xmin_new, xmax_new, ymin_new, ymax_new))
return im,
# Анимация фрактала
ani = animation.FuncAnimation(fig, update, frames=100, interval=50, blit=True)
plt.show()
### Объяснение кода:
- Множество Мандельброта создаётся путём проверки, стремятся ли точки в комплексной плоскости к бесконечности при итерациях по формуле \( z = z^2 + c \).
- Функция `generate_mandelbrot` вычисляет фрактал для заданных границ и преобразует его в массив значений.
- Анимация `update` постепенно уменьшает масштаб (приближает) вокруг интересной точки, что позволяет видеть больше деталей.
Подпишись 👉🏻 @KodduuPython 🤖
Для ускорения анимации Множества Мандельброта можно воспользоваться несколькими подходами:
1. Уменьшить разрешение (размер
2. Оптимизировать функцию `mandelbrot` с использованием Numba для компиляции в машинный код, что значительно ускоряет обработку.
3. Параллельные вычисления для обработки точек массива.
Давайте применим Numba и создадим ускоренную версию. Для этого сначала нужно установить
Затем добавим
### Изменения в коде:
- Numba (`@njit`) значительно ускоряет функции
- Уменьшение `width` и `height` до 600x600 пикселей снижает нагрузку на процессор.
Эти изменения помогут повысить производительность, делая анимацию более плавной и быстрой.
Подпишись 👉🏻 @KodduuPython 🤖
1. Уменьшить разрешение (размер
width и `height`), чтобы уменьшить количество вычисляемых точек.2. Оптимизировать функцию `mandelbrot` с использованием Numba для компиляции в машинный код, что значительно ускоряет обработку.
3. Параллельные вычисления для обработки точек массива.
Давайте применим Numba и создадим ускоренную версию. Для этого сначала нужно установить
numba, если она не установлена:
pip install numba
Затем добавим
@njit из Numba, чтобы ускорить расчёты:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from numba import njit
# Настройка параметров фрактала
width, height = 600, 600 # Уменьшили размер для повышения скорости
max_iter = 256 # Максимальное количество итераций
# Компилируем функцию с помощью Numba
@njit
def mandelbrot(c, max_iter):
z = c
for n in range(max_iter):
if abs(z) > 2:
return n
z = z * z + c
return max_iter
@njit
def generate_mandelbrot(xmin, xmax, ymin, ymax, width, height, max_iter):
x = np.linspace(xmin, xmax, width)
y = np.linspace(ymin, ymax, height)
mandelbrot_set = np.empty((height, width), dtype=np.float32)
for i in range(width):
for j in range(height):
mandelbrot_set[j, i] = mandelbrot(x[i] + 1j * y[j], max_iter)
return mandelbrot_set
# Создаем фигуру и ось для анимации
fig, ax = plt.subplots(figsize=(6, 6))
im = ax.imshow(generate_mandelbrot(-2.0, 1.0, -1.5, 1.5, width, height, max_iter),
extent=(-2.0, 1.0, -1.5, 1.5), cmap='hot', origin='lower')
# Функция обновления для анимации
def update(frame):
zoom_factor = 1.5 ** (-frame * 0.1)
x_center, y_center = -0.7435, 0.1314 # координаты интересной точки
dx, dy = (1.0 - -2.0) * zoom_factor, (1.5 - -1.5) * zoom_factor
xmin_new, xmax_new = x_center - dx / 2, x_center + dx / 2
ymin_new, ymax_new = y_center - dy / 2, y_center + dy / 2
mandelbrot_set = generate_mandelbrot(xmin_new, xmax_new, ymin_new, ymax_new, width, height, max_iter)
im.set_data(mandelbrot_set)
im.set_extent((xmin_new, xmax_new, ymin_new, ymax_new))
return im,
# Анимация фрактала
ani = animation.FuncAnimation(fig, update, frames=100, interval=50, blit=True)
plt.show()
### Изменения в коде:
- Numba (`@njit`) значительно ускоряет функции
mandelbrot и generate_mandelbrot за счёт компиляции в машинный код.- Уменьшение `width` и `height` до 600x600 пикселей снижает нагрузку на процессор.
Эти изменения помогут повысить производительность, делая анимацию более плавной и быстрой.
Подпишись 👉🏻 @KodduuPython 🤖
Скидка на программу Junior FullStack Developer and Data Scientist действует до 22.11.
Программа включает 3 наших самых компактных курса, можно пройти за 2-3 викэнда. В программе вся база по Python + вся база по JavaScript + вся база по Data Science в Python 😎
Подпишись 👉🏻 @KodduuPython 🤖
Программа включает 3 наших самых компактных курса, можно пройти за 2-3 викэнда. В программе вся база по Python + вся база по JavaScript + вся база по Data Science в Python 😎
Подпишись 👉🏻 @KodduuPython 🤖
Давайте рассмотрим интересный пример оптимизированного кода без графики. Здесь мы попробуем найти самый длинный общий префикс среди списка строк. Это задача с большими списками строк, которую можно значительно ускорить, оптимизировав подход.
❗️Популярная задача на собеседованиях 👆
### 1. Наивное решение
Обычно, для решения задачи нахождения общего префикса используют простой подход: проверяют символы по очереди в каждой строке, пока они совпадают. Однако, это не самый оптимальный способ, особенно при большом количестве строк.
### 2. Оптимизированное решение: Используем
С помощью
### Объяснение кода:
1. `zip(*strings)` — объединяет символы по одной позиции из каждой строки в кортежи. Например, для
2. `takewhile(lambda x: len(set(x)) == 1, ...)` — проходит по символам, пока в каждой позиции у всех строк одинаковый символ.
3. Компоновка результата — только нужные символы сохраняются, и
### Почему это быстрее?
- Использование
- Алгоритм оптимален по времени и памяти, так как завершается, как только находит первое различие между строками.
Подпишись 👉🏻 @KodduuPython 🤖
❗️Популярная задача на собеседованиях 👆
### 1. Наивное решение
Обычно, для решения задачи нахождения общего префикса используют простой подход: проверяют символы по очереди в каждой строке, пока они совпадают. Однако, это не самый оптимальный способ, особенно при большом количестве строк.
### 2. Оптимизированное решение: Используем
zip и itertoolsС помощью
zip и itertools.takewhile можно написать более компактный и быстрый вариант решения, где мы проходим по символам сразу в каждой строке:
from itertools import takewhile
def longest_common_prefix(strings):
if not strings:
return ""
# Проверяем символы по позициям, пока все строки имеют одинаковый символ в одной позиции
prefix = ''.join(
c[0] for c in takewhile(lambda x: len(set(x)) == 1, zip(*strings))
)
return prefix
# Пример использования
strings = ["optimization", "optimize", "option", "optimum"]
print("Самый длинный общий префикс:", longest_common_prefix(strings))
### Объяснение кода:
1. `zip(*strings)` — объединяет символы по одной позиции из каждой строки в кортежи. Например, для
["optimization", "optimize", "option", "optimum"] получится ('o', 'o', 'o', 'o') для первой позиции.2. `takewhile(lambda x: len(set(x)) == 1, ...)` — проходит по символам, пока в каждой позиции у всех строк одинаковый символ.
3. Компоновка результата — только нужные символы сохраняются, и
''.join() собирает их в строку.### Почему это быстрее?
- Использование
zip и itertools позволяет обрабатывать каждый символ только один раз, без дополнительных проверок по индексам, что ускоряет процесс для длинных строк или больших списков.- Алгоритм оптимален по времени и памяти, так как завершается, как только находит первое различие между строками.
Подпишись 👉🏻 @KodduuPython 🤖
👍3
Отпечатки пальцев, в контексте программирования, могут использоваться для уникальной идентификации данных, обычно с помощью хеширования. Чтобы продемонстрировать, как это работает, можно использовать хеш-функции, например,
Вот пример кода:
### Объяснение кода:
1. Хеширование данных: Функция
2. Проверка идентичности: Отпечатки пальцев для одинаковых данных идентичны, но если изменить хотя бы один символ, хеш будет совершенно другим, что демонстрирует чувствительность хеша к изменениям в данных.
Этот метод может быть использован, например, для проверки целостности файлов, безопасного хранения паролей или идентификации уникальных данных.
Подпишись 👉🏻 @KodduuPython 🤖
SHA-256 из библиотеки hashlib в Python. В примере ниже создадим отпечаток пальца для строки, чтобы показать, как хеширование создает уникальный идентификатор для входных данных.Вот пример кода:
import hashlib
# Функция для создания отпечатка пальца (хеш) данных
def create_fingerprint(data: str) -> str:
# Преобразуем строку в байты
byte_data = data.encode('utf-8')
# Создаем хеш с использованием алгоритма SHA-256
fingerprint = hashlib.sha256(byte_data).hexdigest()
return fingerprint
# Примеры данных
data1 = "Hello, world!"
data2 = "Hello, world!"
data3 = "Goodbye, world!"
# Создаем отпечатки пальцев для каждого из примеров
fingerprint1 = create_fingerprint(data1)
fingerprint2 = create_fingerprint(data2)
fingerprint3 = create_fingerprint(data3)
# Выводим результаты
print(f"Отпечаток пальца для 'Hello, world!': {fingerprint1}")
print(f"Отпечаток пальца для идентичной строки 'Hello, world!': {fingerprint2}")
print(f"Отпечаток пальца для 'Goodbye, world!': {fingerprint3}")
# Проверка уникальности
print("\nОтпечатки идентичны для одинаковых данных?" , fingerprint1 == fingerprint2)
print("Отпечатки различаются для разных данных?", fingerprint1 != fingerprint3)
### Объяснение кода:
1. Хеширование данных: Функция
create_fingerprint принимает строку и создает для нее хеш с помощью алгоритма SHA-256, возвращая строку с шестнадцатеричным представлением хеша.2. Проверка идентичности: Отпечатки пальцев для одинаковых данных идентичны, но если изменить хотя бы один символ, хеш будет совершенно другим, что демонстрирует чувствительность хеша к изменениям в данных.
Этот метод может быть использован, например, для проверки целостности файлов, безопасного хранения паролей или идентификации уникальных данных.
Подпишись 👉🏻 @KodduuPython 🤖
Для работы с реальными отпечатками пальцев в Python существуют специализированные библиотеки и инструменты. Они позволяют захватывать, обрабатывать и анализировать изображения отпечатков пальцев, а также выполнять задачи биометрической аутентификации. Вот некоторые из них:
PyFingerprint — это библиотека Python, которая позволяет управлять биометрическими датчиками отпечатков пальцев на базе модуля ZFM-20. Она подходит для простых приложений и работает с популярными USB-сканерами, предоставляя базовый набор функций, включая регистрацию, поиск и удаление отпечатков.
#### Установка
PyFingerprint можно установить через pip:
#### Пример кода
Следующий код показывает, как инициализировать сканер и зарегистрировать или идентифицировать отпечаток пальца:
#### Преимущества и ограничения
* Преимущества: Легкость в использовании, простота интеграции с недорогими USB-сканерами.
* Ограничения: Подходит только для датчиков серии ZFM, ограниченный набор функций для базовых приложений.
PyFingerprint — отличный вариант для проектов с бюджетными ограничениями, особенно для простых DIY-проектов с использованием Raspberry Pi или Arduino.
Подпишись 👉🏻 @KodduuPython 🤖
PyFingerprint — это библиотека Python, которая позволяет управлять биометрическими датчиками отпечатков пальцев на базе модуля ZFM-20. Она подходит для простых приложений и работает с популярными USB-сканерами, предоставляя базовый набор функций, включая регистрацию, поиск и удаление отпечатков.
#### Установка
PyFingerprint можно установить через pip:
pip install PyFingerprint
#### Пример кода
Следующий код показывает, как инициализировать сканер и зарегистрировать или идентифицировать отпечаток пальца:
from pyfingerprint.pyfingerprint import PyFingerprint
try:
# Подключение к сканеру отпечатков пальцев
f = PyFingerprint('/dev/ttyUSB0', 57600, 0xFFFFFFFF, 0x00000000)
if not f.verifyPassword():
raise ValueError("Пароль не подходит!")
# Ожидание отпечатка пальца
print("Поместите палец на сканер...")
while not f.readImage():
pass
# Конвертация изображения отпечатка в шаблон
f.convertImage(0x01)
positionNumber = f.searchTemplate()
if positionNumber >= 0:
print(f"Отпечаток найден на позиции #{positionNumber}")
else:
print("Отпечаток не распознан")
except Exception as e:
print("Ошибка:", str(e))
#### Преимущества и ограничения
* Преимущества: Легкость в использовании, простота интеграции с недорогими USB-сканерами.
* Ограничения: Подходит только для датчиков серии ZFM, ограниченный набор функций для базовых приложений.
PyFingerprint — отличный вариант для проектов с бюджетными ограничениями, особенно для простых DIY-проектов с использованием Raspberry Pi или Arduino.
Подпишись 👉🏻 @KodduuPython 🤖
Отпечатки пальцев, как правило, не хранятся в формате изображений, таких как JPG, из-за риска потери качества и проблем сжатия. Вместо этого используются специализированные форматы и методы хранения биометрической информации, которые сохраняют ключевые характеристики отпечатка пальца в виде шаблона, а не самого изображения.
Предположим, что у нас есть простое изображение отпечатка пальца (в реальности снимок делается датчиком отпечатков и обрабатывается специализированной библиотекой). Вместо изображения будем работать с данными в формате координат уникальных точек, таких как минуции.
Для каждого отпечатка создаем шаблон, используя его уникальные особенности (минутии). Эти шаблоны позволяют системе распознавания идентифицировать отпечаток без использования полного изображения.
#### Функция для генерации шаблона
Теперь создадим функцию, которая будет проверять, насколько похожи два шаблона. Функция будет учитывать допустимую погрешность для координат и углов, так как отпечаток может быть немного смещен или повернут.
#### Функция для сравнения
### Вывод
Код выше покажет количество совпавших точек и степень сходства в процентном выражении (0.0 - 1.0). Чем ближе значение к 1.0, тем больше вероятность того, что отпечатки принадлежат одному человеку.
### Объяснение работы кода
1. Допуски: Мы задали допустимые отклонения в 5 единиц по координатам и углу, чтобы допустить незначительные отличия из-за положения пальца.
2. Совпадение точек: Мы проходим по каждому элементу из первого шаблона и проверяем, есть ли совпадение в пределах допустимого отклонения в данных второго шаблона. Если найдена подходящая точка, добавляем совпадение.
3. Подсчет сходства: Общее количество совпавших точек делится на минимальное количество точек между двумя шаблонами, чтобы получить процент совпадения.
Подпишись 👉🏻 @KodduuPython 🤖
Предположим, что у нас есть простое изображение отпечатка пальца (в реальности снимок делается датчиком отпечатков и обрабатывается специализированной библиотекой). Вместо изображения будем работать с данными в формате координат уникальных точек, таких как минуции.
# Пример извлеченных данных для отпечатка пальца
# Координаты минуций и углы наклона (в реальных случаях извлекаются автоматически)
fingerprint_data_1 = [
{"x": 100, "y": 200, "angle": 45},
{"x": 120, "y": 215, "angle": 60},
{"x": 130, "y": 210, "angle": 90},
{"x": 115, "y": 205, "angle": 30},
]
# Для второго отпечатка (моделируем тот же отпечаток с небольшой погрешностью)
fingerprint_data_2 = [
{"x": 101, "y": 199, "angle": 47},
{"x": 119, "y": 216, "angle": 59},
{"x": 132, "y": 211, "angle": 88},
{"x": 116, "y": 206, "angle": 32},
]
Для каждого отпечатка создаем шаблон, используя его уникальные особенности (минутии). Эти шаблоны позволяют системе распознавания идентифицировать отпечаток без использования полного изображения.
#### Функция для генерации шаблона
import math
# Функция для создания шаблона отпечатка
def create_fingerprint_template(fingerprint_data):
# Преобразуем каждую минутию в формат (x, y, angle)
template = []
for minutia in fingerprint_data:
template.append((minutia["x"], minutia["y"], minutia["angle"]))
return template
# Создаем шаблоны для двух отпечатков
template_1 = create_fingerprint_template(fingerprint_data_1)
template_2 = create_fingerprint_template(fingerprint_data_2)
Теперь создадим функцию, которая будет проверять, насколько похожи два шаблона. Функция будет учитывать допустимую погрешность для координат и углов, так как отпечаток может быть немного смещен или повернут.
#### Функция для сравнения
# Задаем допустимые отклонения для сравнения
tolerance_position = 5 # Допустимое отклонение в координатах
tolerance_angle = 5 # Допустимое отклонение в углах
# Функция сравнения двух шаблонов
def compare_fingerprint_templates(template1, template2):
matches = 0
for minutia1 in template1:
for minutia2 in template2:
# Проверяем, что координаты и угол находятся в пределах допустимых отклонений
if (abs(minutia1[0] - minutia2[0]) <= tolerance_position and
abs(minutia1[1] - minutia2[1]) <= tolerance_position and
abs(minutia1[2] - minutia2[2]) <= tolerance_angle):
matches += 1
break # Переходим к следующей точке
# Возвращаем количество совпавших точек
return matches
# Сравниваем два шаблона
matches = compare_fingerprint_templates(template_1, template_2)
total_points = min(len(template_1), len(template_2))
similarity = matches / total_points
print(f"Совпавшие точки: {matches} из {total_points}")
print(f"Сходство: {similarity:.2f}")
### Вывод
Код выше покажет количество совпавших точек и степень сходства в процентном выражении (0.0 - 1.0). Чем ближе значение к 1.0, тем больше вероятность того, что отпечатки принадлежат одному человеку.
### Объяснение работы кода
1. Допуски: Мы задали допустимые отклонения в 5 единиц по координатам и углу, чтобы допустить незначительные отличия из-за положения пальца.
2. Совпадение точек: Мы проходим по каждому элементу из первого шаблона и проверяем, есть ли совпадение в пределах допустимого отклонения в данных второго шаблона. Если найдена подходящая точка, добавляем совпадение.
3. Подсчет сходства: Общее количество совпавших точек делится на минимальное количество точек между двумя шаблонами, чтобы получить процент совпадения.
Подпишись 👉🏻 @KodduuPython 🤖
👍1
В наше время анализ социальных сетей и построение рекомендаций стали важными задачами для платформ, взаимодействующих с пользователями. Библиотека `networkx` позволяет моделировать такие системы с помощью графов, где узлы представляют пользователей, а рёбра — связи между ними. С
### Установка
Установить
### Пример: Моделирование Социальной Сети
Представим, что у нас есть небольшая социальная сеть, где пользователи связаны друг с другом через дружеские или профессиональные связи. Мы построим граф, где узлы — это пользователи, а рёбра — связи между ними.
Этот код создаст граф, визуализирующий отношения между пользователями, что может помочь понять, кто в сети более связан и какие узлы играют центральную роль.
Подпишись 👉🏻 @KodduuPython 🤖
networkx можно выявлять влиятельных пользователей, находить кластеры и строить алгоритмы рекомендаций.### Установка
Установить
networkx можно с помощью pip:
pip install networkx
### Пример: Моделирование Социальной Сети
Представим, что у нас есть небольшая социальная сеть, где пользователи связаны друг с другом через дружеские или профессиональные связи. Мы построим граф, где узлы — это пользователи, а рёбра — связи между ними.
import networkx as nx
import matplotlib.pyplot as plt
# Создаем граф
G = nx.Graph()
# Добавляем узлы (пользователей) и связи между ними
connections = [
("Alice", "Bob"),
("Alice", "Charlie"),
("Bob", "David"),
("Charlie", "David"),
("David", "Eve"),
("Eve", "Frank"),
("Frank", "Alice"),
("Charlie", "Eve"),
]
G.add_edges_from(connections)
# Визуализация сети
plt.figure(figsize=(8, 6))
nx.draw(G, with_labels=True, node_color='lightblue', node_size=2000, font_size=15)
plt.title("Социальная сеть пользователей")
plt.show()
Этот код создаст граф, визуализирующий отношения между пользователями, что может помочь понять, кто в сети более связан и какие узлы играют центральную роль.
Подпишись 👉🏻 @KodduuPython 🤖
Для социальной сети важно определить влиятельных пользователей, которые могут быть потенциальными лидерами мнений или хабами в сети. Например, чем больше у пользователя связей, тем он может быть более центральным.
Рекомендательные системы используют графы для поиска пользователей, которых стоит порекомендовать друг другу. Один из простых методов — использовать алгоритм общих друзей. Он предлагает пользователю новых друзей на основе количества общих знакомых с другими.
#### Функция для поиска рекомендаций
Этот алгоритм выведет список пользователей, которых стоит порекомендовать
### Применение: Поиск Кластеров (Групп)
Социальные сети часто образуют кластеры — группы людей с тесными связями внутри группы и меньшим количеством связей с пользователями за пределами группы. В
Этот код отобразит кластеры пользователей, показывая, какие группы людей более тесно связаны друг с другом.
### Расширенное Применение: Поиск путей для рекомендаций
Рекомендательные алгоритмы также могут использовать алгоритм кратчайших путей. Например, если у пользователя есть связь с кем-то через промежуточного друга, эта цепочка может стать рекомендацией для создания новых контактов.
Если между двумя пользователями можно найти путь, их можно рекомендовать друг другу, как потенциальных друзей на основе "косвенной связи".
### Заключение
Библиотека
Подпишись 👉🏻 @KodduuPython 🤖
networkx позволяет легко вычислить степень центральности для каждого узла.
# Вычисляем степень центральности для каждого узла
centrality = nx.degree_centrality(G)
print("Центральность пользователей:")
for user, central_value in centrality.items():
print(f"{user}: {central_value:.2f}")
Рекомендательные системы используют графы для поиска пользователей, которых стоит порекомендовать друг другу. Один из простых методов — использовать алгоритм общих друзей. Он предлагает пользователю новых друзей на основе количества общих знакомых с другими.
#### Функция для поиска рекомендаций
def recommend_friends(G, user):
# Для каждого узла считаем общих друзей, которые не связаны с текущим пользователем
potential_friends = {}
for friend in G.neighbors(user):
for friend_of_friend in G.neighbors(friend):
if friend_of_friend != user and not G.has_edge(user, friend_of_friend):
if friend_of_friend in potential_friends:
potential_friends[friend_of_friend] += 1
else:
potential_friends[friend_of_friend] = 1
# Сортируем по количеству общих друзей и возвращаем рекомендации
recommendations = sorted(potential_friends.items(), key=lambda x: x[1], reverse=True)
return [user for user, _ in recommendations]
# Рекомендуем друзей для пользователя "Alice"
recommended_friends = recommend_friends(G, "Alice")
print("Рекомендации для Alice:", recommended_friends)
Этот алгоритм выведет список пользователей, которых стоит порекомендовать
Alice как потенциальных друзей, на основе общих связей. Например, если у Alice и David есть общие друзья, то David станет для нее рекомендуемым контактом.### Применение: Поиск Кластеров (Групп)
Социальные сети часто образуют кластеры — группы людей с тесными связями внутри группы и меньшим количеством связей с пользователями за пределами группы. В
networkx можно найти такие кластеры с помощью алгоритма связных компонент или более сложных алгоритмов, таких как Girvan-Newman.
# Используем связные компоненты для поиска групп в сети
clusters = list(nx.connected_components(G))
print("Кластеры пользователей в сети:", clusters)
Этот код отобразит кластеры пользователей, показывая, какие группы людей более тесно связаны друг с другом.
### Расширенное Применение: Поиск путей для рекомендаций
Рекомендательные алгоритмы также могут использовать алгоритм кратчайших путей. Например, если у пользователя есть связь с кем-то через промежуточного друга, эта цепочка может стать рекомендацией для создания новых контактов.
# Ищем кратчайший путь между двумя пользователями
path = nx.shortest_path(G, source="Alice", target="Frank")
print("Кратчайший путь между Alice и Frank:", path)
Если между двумя пользователями можно найти путь, их можно рекомендовать друг другу, как потенциальных друзей на основе "косвенной связи".
### Заключение
Библиотека
networkx предоставляет удобные инструменты для анализа и моделирования социальных сетей и создания алгоритмов рекомендаций. Она позволяет быстро выявить влиятельных пользователей, рекомендовать новых друзей, находить кластеры и анализировать косвенные связи. С помощью этой библиотеки можно легко создавать простые модели социальных сетей и закладывать основу для сложных рекомендательных систем, применяемых на реальных платформах.Подпишись 👉🏻 @KodduuPython 🤖
Давайте создадим код для обнаружения дронов. Этот код будет учитывать размер объекта относительно размера кадра для более точного определения расстояния:
### Ключевые особенности этого кода:
1. Класс DroneDetector: Создан класс для управления процессом обнаружения дронов.
2. Метод detect_drones():
- Читает кадр из камеры.
- Преобразует кадр в оттенки серого и применяет алгоритм Canny для выделения границ.
- Находит контуры крупных объектов.
- Вычисляет отношение размера объекта к размеру кадра.
- Корректирует расстояние, учитывая размер объекта.
- Предполагает расстояние до дрона на основе знаковых значений.
3. Метод display_frame():
- Отображает видеоизображение с камеры.
- Позволяет пользователю прервать работу приложения нажатием клавиши 'q'.
4. Главная функция main():
- Инициализирует объект DroneDetector.
- Запускает бесконечный цикл обнаружения и отображения дронов.
Подпишись 👉🏻 @KodduuPython 🤖
import cv2
import numpy as np
class DroneDetector:
def __init__(self):
self.camera = cv2.VideoCapture(0)
self.target_distance = 50 # Максимальная допустимая дистанция до цели
self.known_width = 50 # Знакованный размер объекта в метрах
self.known_distance = 10 # Знакованный расстояние до объекта в метрах
def detect_drones(self):
ret, frame = self.camera.read()
if not ret:
print("Ошибка при чтении кадра")
return None
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
detected_drones = []
for contour in contours:
area = cv2.contourArea(contour)
if area > 1000: # Простое условие для определения крупных объектов
x, y, w, h = cv2.boundingRect(contour)
# Вычисление отношения размера объекта к размеру кадра
ratio = max(w, h) / min(frame.shape[2], frame.shape[1])
# Корректировка расстояния
distance = np.sqrt(x**2 + y**2) * ratio
if distance < self.target_distance:
drone_size = max(w, h)
drone_ratio = drone_size / self.known_width
# Прогнозирование расстояния до дрона
predicted_distance = self.known_distance * drone_ratio
print(f"Обнаружен потенциальный дрон на расстоянии {predicted_distance:.2f} метров")
detected_drones.append({
'distance': predicted_distance,
'size': drone_size,
'ratio': drone_ratio
})
return frame, detected_drones
def display_frame(self):
ret, frame = self.camera.read()
if ret:
cv2.imshow('Drone Camera', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
self.camera.release()
cv2.destroyAllWindows()
return frame
def main():
detector = DroneDetector()
while True:
frame, detected_drones = detector.detect_drones()
if frame is not None:
detector.display_frame()
if len(detected_drones) > 0:
print("Детектированные дроны:")
for drone in detected_drones:
print(f"- Расстояние: {drone['distance']:.2f} м, Размер: {drone['size']} пикселей, Соотношение: {drone['ratio']:.2f}")
# Здесь можно добавить дополнительную логику обработки и действий
else:
print("Не удалось получить кадр")
if __name__ == "__main__":
main()
### Ключевые особенности этого кода:
1. Класс DroneDetector: Создан класс для управления процессом обнаружения дронов.
2. Метод detect_drones():
- Читает кадр из камеры.
- Преобразует кадр в оттенки серого и применяет алгоритм Canny для выделения границ.
- Находит контуры крупных объектов.
- Вычисляет отношение размера объекта к размеру кадра.
- Корректирует расстояние, учитывая размер объекта.
- Предполагает расстояние до дрона на основе знаковых значений.
3. Метод display_frame():
- Отображает видеоизображение с камеры.
- Позволяет пользователю прервать работу приложения нажатием клавиши 'q'.
4. Главная функция main():
- Инициализирует объект DroneDetector.
- Запускает бесконечный цикл обнаружения и отображения дронов.
Подпишись 👉🏻 @KodduuPython 🤖
⚡3👀1
### Как работает обнаружение дронов:
1. Код ищет крупные объекты (с площадью более 1000 пикселей) в кадре.
2. Для каждого найденного объекта вычисляется соотношение его размера к размеру кадра.
3. Расстояние корректируется, умножая простое расстояние на это соотношение.
4. Предполагается расстояние до дрона на основе знаковых значений и соотношения размеров.
### Дополнительные возможности:
- Код предоставляет базовую структуру для дальнейшей разработки.
- Можно добавить дополнительную логику для безопасного подхода к обнаруженным дронам.
- Реализовать систему предупреждения о приближающихся дронах.
- Интегрировать систему распознавания дронов с использованием нейронных сетей для повышения точности.
Этот код предоставляет основу для обнаружения дронов с учетом их размеров относительно размера кадра. Однако, важно отметить, что полноценное решение для перехвата дронов требует комплексного подхода, включающего не только обнаружение, но и анализ характеристик дронов, их идентификацию и безопасное управление.
Подпишись 👉🏻 @KodduuPython 🤖
1. Код ищет крупные объекты (с площадью более 1000 пикселей) в кадре.
2. Для каждого найденного объекта вычисляется соотношение его размера к размеру кадра.
3. Расстояние корректируется, умножая простое расстояние на это соотношение.
4. Предполагается расстояние до дрона на основе знаковых значений и соотношения размеров.
### Дополнительные возможности:
- Код предоставляет базовую структуру для дальнейшей разработки.
- Можно добавить дополнительную логику для безопасного подхода к обнаруженным дронам.
- Реализовать систему предупреждения о приближающихся дронах.
- Интегрировать систему распознавания дронов с использованием нейронных сетей для повышения точности.
Этот код предоставляет основу для обнаружения дронов с учетом их размеров относительно размера кадра. Однако, важно отметить, что полноценное решение для перехвата дронов требует комплексного подхода, включающего не только обнаружение, но и анализ характеристик дронов, их идентификацию и безопасное управление.
Подпишись 👉🏻 @KodduuPython 🤖