Сигмовидная кривая не работает с формулой C ++ - PullRequest
1 голос
/ 31 января 2012

Я использую Microsoft Visual Studio 2010.

Формула y = 1/(1+exp(-e))

В диапазоне значений, где bih.biWidth - это диапазон для итерации.

Все же, когда я пытаюсь реализовать в кодах, это не работает, почему? Могут ли какие-нибудь эксперты помочь мне, спасибо.

for(int y=0; y<bih.biHeight; y++) 
{ 
   for(int x=0; x<bih.biWidth; x++) 
   {   
      SetPixel(hdc, (double)1/((double)1+exp(double(-x)))*bih.biWidth, 
               bih.biHeight-x, red); 
   } 
} 

Линии начинаются почти в нижней правой части изображения и заканчиваются в конце небольшой кривой в верхней правой части изображения. Почему это так?

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Потому что 0 является центром сигмовидной кривой.Ваш x начинается с 0;если вы хотите, чтобы ваша кривая строилась симметрично, вам необходимо вычислить симметричный аргумент, равный 0:

for(int x=0; x<bih.biWidth; x++)
{
    double a= x - 0.5*bih.biWidth;
    SetPixel(hdc, bih.biWidth-x, 1.0/(1.0+exp(-a)) * bih.biHeight, red);
}

Масштабирование a с помощью постоянного коэффициента будет регулировать наклон сигмовидной функции.

(Я также подозреваю, что ваш исходный код переключил коэффициенты масштабирования, используемые в аргументах SetPixel (), поэтому я исправил это. Нет смысла вычитать x из bih.biHeight, когда он варьируется отОт 0 до bih.biWidth вместо ...)

[дополнительное редактирование: я дополнительно переключил аргументы, чтобы biWidth и biHeight находились в x- и y-координатах соответственно.В любом случае, это обычный способ построения функций - поэтому, если вы хотите перевернуть график, вам нужно будет переключить его обратно]

1 голос
/ 31 января 2012

Вот идиоматический код того, что вы пытаетесь сделать:

double f(double x) { return 1.0 / (1.0 + exp(-x)); }

void draw_graph(HDC hdc, BITMAPINFOHEADER bih, RECTF graph_bounds)
{
    double graph_x, graph_y = f(graph_bounds.left);
    MoveToEx(hdc, 0, bih.biHeight * (1 - (graph_y - graph_bounds.bottom) / (graph_bounds.top - graph_bounds.bottom), NULL);
    for(int x=1; x<bih.biWidth; x++) {
       graph_x = graph_bounds.left + (graph_bounds.right - graph_bounds.left) * x / bih.biWidth;
       graph_y = f(graph_x);
       LineTo(hdc, x, bih.biHeight * (1 - (graph_y - graph_bounds.bottom) / (graph_bounds.top - graph_bounds.bottom));
    }
} 
...