Вычисление логистической сигмоидной функции на Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Логистическая сигмоидная функция – это удобный способ преобразования чисел в диапазон (0, 1), что делает ее идеальным инструментом для оценки вероятностей. NumPy предлагает простой способ реализовать данную функцию в Python с помощью выражения 1 / (1 + np.exp(-x)). Вот пример функции сигмоида на языке Python:

Python
Скопировать код
import numpy as np 
# Итак, приступим к математике!
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
# Проверим нашу функцию:
print(sigmoid(0.5))  # Результат: 0.622

Функцию sigmoid можно использовать как с отдельными числами, так и с массивами NumPy, чтобы получить нужные вам результаты.

Кинга Идем в IT: пошаговый план для смены профессии

Точность имеет значение

Численная точность имеет первостепенное значение при работе с сигмоидной функцией, особенно при значении функции, близком к 0 или 1. Стандартная реализация через math.exp может вызывать ошибки при обработке больших отрицательных чисел. Для более стабильных вычислений рекомендуется использовать функцию expit из SciPy:

Python
Скопировать код
from scipy.special import expit
# Функция expit – это надежный альтернативный вариант сигмоиды.
print(expit(-1000))  # Результат: 0.0, даже при больших отрицательных значениях результат стабилен

Ускорение с помощью векторизации

При работе с большими объемами данных предпочтительнее использовать векторизованные операции NumPy, а не библиотеку math, входящую в стандартный пакет Python. Это обеспечивает значительное улучшение производительности:

Python
Скопировать код
def sigmoid_array(x):
    # NumPy с эффективностью справляется с обработкой больших массивов данных!
    return 1 / (1 + np.exp(-np.array(x)))

# Проверим нашу функцию на большом массиве данных:
large_data = np.array([-3, -1, 0, 1, 3])
print(sigmoid_array(large_data))

Достойные альтернативы

Если вам нужен более сложный математический подход, вы можете использовать tanh со лямбда-функцией:

Python
Скопировать код
import math

sigmoid_alt = lambda x: .5 * (math.tanh(.5 * x) + 1)
# Функция также включает гиперболический тангенс tanh!
print(sigmoid_alt(0.5))

Также можно использовать таблицы с заранее вычисленными значениями сигмоиды, особенно при значении для производительности.

Визуализация

Любые вещественные числа можно рассматривать как данные, а логистическая сигмоидная функция ведет себя как «динамический регулятор», расширяющийся для больших положительных чисел и сужающийся для отрицательных:

Python
Скопировать код
def sigmoid_fun(x):
    return 1 / (1 + np.exp(-x))  # Эта функция напоминает "ловушку" (catcher glove)

Большие положительные значения увеличивают радиус нашей "ловушки":

Markdown
Скопировать код
x ➡️🌱🕸️➕ ➡️🍏 Вероятность возрастает

С другой стороны, если значение отрицательно или мало, то "ловушка" сужается:

Markdown
Скопировать код
x ➡️🌱🕸️➖ ➡️🍎 Вероятность уменьшается

Именно благодаря этой способности переключать значения, сигмоидная функция переводит данные в вероятностный контекст.

Нормализация

Перед применением сигмоидной функции важно нормализовать данные (то есть сместить их вокруг нуля). Это обеспечит большую эффективность вычислений и точность:

Python
Скопировать код
def normalize_and_apply_sigmoid(x, mean, std):
    normalized_x = (x – mean) / std
    return sigmoid(normalized_x)  # Данные после нормализации и применения сигмоиды

Создание кривой

В зависимости от задачи, можно настроить наклон сигмоидальной кривой, используя коэффициент усиления (k). Это позволит вам изменять форму кривой:

Python
Скопировать код
def custom_sigmoid(x, k=1):
    # Позволим немного настроить кривую!
    return 1 / (1 + np.exp(-k*x))

Реальности визуализации

С пакетом matplotlib можно визуализировать сигмоидальную кривую, что поможет вам представить её визуально и понять, как изменения условий влияют на форму:

Python
Скопировать код
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 10, 100)
# Что скажет ваша художественная душа? 🎨
plt.plot(x, sigmoid(x), label='Сигмоидная функция')
plt.xlabel('x')
plt.ylabel('sigmoid(x)')
plt.title('Визуализация сигмоидной функции')
plt.legend()
plt.grid(True)
plt.show()

Меняйте параметры сигмоидной функции на ваших графиках, чтобы наблюдать за их влиянием.

Оптимизация и сравнение

Алгоритмы оптимизации, такие как logaddexp.reduce, могут существенно сократить время вычисления при работе с большими объёмами данных. Визуализация сетки из 4 графиков (2x2) позволит сравнивать поведение сигмоидных функций с различными параметрами:

Python
Скопировать код
# Определим "сетку" для графиков.
fig, ax = plt.subplots(2, 2)
k_values = [0\.5, 1, 2, 5]
for i, ax in enumerate(ax.flatten()):
    ax.plot(x, custom_sigmoid(x, k=k_values[i]), label=f'k={k_values[i]}')
    ax.set_title(f'Наклон сигмоиды с k={k_values[i]}')
    ax.label_outer()
    ax.legend()
fig.tight_layout()
plt.show()

Зеркальное отражение относительно оси абсцисс

Понимание влияния положительных и отрицательных значений x на сигмоиду важно. При положительной бесконечности значение функции стремится к 1, а при отрицательной – к 0. В некоторых случаях может потребоваться симметричное отображение сигмоидной функции или другие её вариации.

Полезные материалы

  1. numpy.exp — Руководство NumPy v1.15 — документация по экспоненциальной функции в NumPy, используемой в расчетах сигмоиды.
  2. sklearn.linear_model.LogisticRegression — документация scikit-learn 1.4.0официальная документация по логистической регрессии, где используется сигмоидная функция.
  3. tf.math.sigmoid | TensorFlow v2.15.0 — реализация сигмоидной функции в TensorFlow, которая используется в машинном обучении.
  4. scipy.special.expit — Руководство SciPy v1.12.0 — документация функции expit от SciPy, которая является аналогом сигмоиды.
  5. Как вычислить логистическую сигмоидную функцию в Python? – Stack Overflow — обсуждение и решения вопроса реализации сигмоиды в Python на сообществе Stack Overflow.