Вычисление логистической сигмоидной функции на Python
Быстрый ответ
Логистическая сигмоидная функция – это удобный способ преобразования чисел в диапазон (0, 1), что делает ее идеальным инструментом для оценки вероятностей. NumPy предлагает простой способ реализовать данную функцию в Python с помощью выражения 1 / (1 + np.exp(-x))
. Вот пример функции сигмоида на языке Python:
import numpy as np
# Итак, приступим к математике!
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# Проверим нашу функцию:
print(sigmoid(0.5)) # Результат: 0.622
Функцию sigmoid
можно использовать как с отдельными числами, так и с массивами NumPy, чтобы получить нужные вам результаты.
Точность имеет значение
Численная точность имеет первостепенное значение при работе с сигмоидной функцией, особенно при значении функции, близком к 0 или 1. Стандартная реализация через math.exp
может вызывать ошибки при обработке больших отрицательных чисел. Для более стабильных вычислений рекомендуется использовать функцию expit
из SciPy:
from scipy.special import expit
# Функция expit – это надежный альтернативный вариант сигмоиды.
print(expit(-1000)) # Результат: 0.0, даже при больших отрицательных значениях результат стабилен
Ускорение с помощью векторизации
При работе с большими объемами данных предпочтительнее использовать векторизованные операции NumPy, а не библиотеку math
, входящую в стандартный пакет 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 со лямбда-функцией:
import math
sigmoid_alt = lambda x: .5 * (math.tanh(.5 * x) + 1)
# Функция также включает гиперболический тангенс tanh!
print(sigmoid_alt(0.5))
Также можно использовать таблицы с заранее вычисленными значениями сигмоиды, особенно при значении для производительности.
Визуализация
Любые вещественные числа можно рассматривать как данные, а логистическая сигмоидная функция ведет себя как «динамический регулятор», расширяющийся для больших положительных чисел и сужающийся для отрицательных:
def sigmoid_fun(x):
return 1 / (1 + np.exp(-x)) # Эта функция напоминает "ловушку" (catcher glove)
Большие положительные значения увеличивают радиус нашей "ловушки":
x ➡️🌱🕸️➕ ➡️🍏 Вероятность возрастает
С другой стороны, если значение отрицательно или мало, то "ловушка" сужается:
x ➡️🌱🕸️➖ ➡️🍎 Вероятность уменьшается
Именно благодаря этой способности переключать значения, сигмоидная функция переводит данные в вероятностный контекст.
Нормализация
Перед применением сигмоидной функции важно нормализовать данные (то есть сместить их вокруг нуля). Это обеспечит большую эффективность вычислений и точность:
def normalize_and_apply_sigmoid(x, mean, std):
normalized_x = (x – mean) / std
return sigmoid(normalized_x) # Данные после нормализации и применения сигмоиды
Создание кривой
В зависимости от задачи, можно настроить наклон сигмоидальной кривой, используя коэффициент усиления (k
). Это позволит вам изменять форму кривой:
def custom_sigmoid(x, k=1):
# Позволим немного настроить кривую!
return 1 / (1 + np.exp(-k*x))
Реальности визуализации
С пакетом matplotlib можно визуализировать сигмоидальную кривую, что поможет вам представить её визуально и понять, как изменения условий влияют на форму:
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) позволит сравнивать поведение сигмоидных функций с различными параметрами:
# Определим "сетку" для графиков.
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. В некоторых случаях может потребоваться симметричное отображение сигмоидной функции или другие её вариации.
Полезные материалы
- numpy.exp — Руководство NumPy v1.15 — документация по экспоненциальной функции в NumPy, используемой в расчетах сигмоиды.
- sklearn.linear_model.LogisticRegression — документация scikit-learn 1.4.0 — официальная документация по логистической регрессии, где используется сигмоидная функция.
- tf.math.sigmoid | TensorFlow v2.15.0 — реализация сигмоидной функции в TensorFlow, которая используется в машинном обучении.
- scipy.special.expit — Руководство SciPy v1.12.0 — документация функции expit от SciPy, которая является аналогом сигмоиды.
- Как вычислить логистическую сигмоидную функцию в Python? – Stack Overflow — обсуждение и решения вопроса реализации сигмоиды в Python на сообществе Stack Overflow.