Как получить сигмовидную функцию от 0 до 1 для вероятности правильного ответа?

Я пытаюсь смоделировать некоторые данные, где ответ может быть либо правильным (1), либо неправильным (0). Таким образом, я пытаюсь найти распределение, в котором есть четыре условия (в данном случае степени окружности).

Таким образом, ось x равна пи/2, пи, пи1,5, 2пи. Я нормализовал это от 0 до 1, чтобы упростить задачу. На оси y я хотел бы, чтобы вероятность ответа была правильной, поэтому 0-1 или 0-100 и т. д. Я пытаюсь создать/построить сигмовидную функцию так, чтобы вероятность была выше, когда условие ближе к 1, и ниже, когда состояние близко к 0.

Кажется, я не могу сгенерировать сигмоид между 0 и 1, он просто дает мне прямую линию, если я не установлю x = np.linspace (-10,10,10). Как я могу это сделать? Код, который у меня сейчас есть, приведен ниже. Благодарю вас!

Изначально я собирался использовать бета-распределение, так как оно лучше подходит (поскольку это градусы по кругу), но, похоже, не может привести его к нужной мне форме. Любая помощь будет принята с благодарностью!

def sigmoid(x,x0=0,k=0.5):
            return (1 / (1 + np.exp(-x)))
x = np.linspace(0,1,10)

person sallicap    schedule 08.07.2020    source источник
comment
Ну, сигмоид 0 для отрицательной бесконечности и 1 для положительной бесконечности. Таким образом, идея состоит в том, чтобы на самом деле никогда не рачь 0 и 1.   -  person Willem Van Onsem    schedule 08.07.2020
comment
А, вижу спасибо! Не могли бы вы тогда предложить нормализовать мои 4 условия, чтобы они соответствовали от -10 до +10, или это плохая практика?   -  person sallicap    schedule 08.07.2020


Ответы (1)


Поскольку вы довольны нормализацией до диапазона [0,1], рассмотрите возможность нормализации до [-1,1]

import numpy as np
import matplotlib.pyplot as plt

def norm(x):
    # normalise x to range [-1,1]
    nom = (x - x.min()) * 2.0
    denom = x.max() - x.min()
    return  nom/denom - 1.0

def sigmoid(x, k=0.1):
    # sigmoid function
    # use k to adjust the slope
    s = 1 / (1 + np.exp(-x / k)) 
    return s

# un-normalised data
x = np.linspace(-4,+4,100)
# normalise the data
x = norm(x) 

plt.plot(x, sigmoid(x))
plt.show()

Сигмовидная функция активации

person Homer    schedule 08.07.2020
comment
Благодарю вас! Как можно изменить эту функцию, чтобы изменить крутизну склона и где по оси x он «начинается»? Извините, я не изучал это :) - person sallicap; 08.07.2020
comment
Не беспокойтесь :) - Я отредактировал вопрос (см. сегмент кода), чтобы ответить на ваш комментарий. Просто для ясности; диаграмма была построена с k = 0,1, которое я указал в качестве значения по умолчанию для сигмовидной функции. - person Homer; 08.07.2020