Sigmoid 曲线不适用于公式 C++

Sigmoid Curve not working with formula C++

本文关键字:C++ 适用于 曲线 不适用 Sigmoid      更新时间:2023-10-16

我正在使用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); 
   } 
} 

线条几乎从图像的右下角开始,到图像右上角的轻微曲线结束。为什么会这样?

因为 0 是 S 形曲线的中心。 您的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将调整 S 形函数的斜率。

(我也怀疑您的原始代码已经切换了 SetPixel(( 参数中使用的缩放因子,所以我已经修复了它。 当 x 的范围从 0 到 bih.biWidth 时,从bih.biHeight中减去它是没有意义的......

[附加编辑:我还切换了参数,以便biWidthbiHeight分别位于x和y坐标中。 无论如何,这是绘制函数的传统方式 - 所以如果你想翻转绘图,你需要把它切换回来]

以下是您尝试执行的操作的惯用代码:

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));
    }
}