基于数据点创建 S 曲线

Creating an s-curve based on data points

我有一系列数据点形成一条曲线,但我没有方程式,而且在前 2 个中,我无法使用 libreoffice 或在线曲线拟合工具令人满意地计算方程式google 页的结果。

我想要曲线的方程式,理想情况下是 python 计算沿该曲线的给定 x 值的 y 值的实现,以防出现意外的箍跳。如果失败,我想要比 elif 语句列表更优雅的 python 解决方案递增 y 如果 x 足够高以使其增加一个整数,这是万不得已的丑陋解决方案 - 我的近期计划不会要求小数精度。

曲线在10处与零线相交,y每增加一个整数就需要x比前一个增加一个整数,所以y1达到x11,y2达到x13,y3达到x16等,曲线在负数的另一个方向弯曲,使得 y-1 在 x9,y-2 在 x7 等。我怀疑当我已经有了这些知识时,就找到曲线方程而言,我遗漏了一些明显的东西。

除了尝试使用 libreoffice calc 和几个在线曲线拟合网站都无济于事外,我还尝试过对 s 曲线进行切片(我已经放弃搜索术语 sigmoid 函数,因为我的所有结果都相关到神经网络或期望我的 y 值永远不会超过 +-1) 成两条对数曲线,这几乎可以工作 - 5 *(np.log(x) - 11) 令人沮丧地接近曲线的上半部分,但我最终无法使用 - 除了在 9 处越过数字线外,当我直接返回 round() 舍入 y 值时,它还产生了一些奇怪的行为,直接返回时显示负 40 秒的结果,但似乎当这些数字输入其他计算时工作正常。

如果有人能给我两个有效的对数,将 0 到 50 之间的 x 值舍入到正确的数字,这对这个项目来说已经足够了。

感谢您的耐心等待。

-编辑- 这些显然是三角数,x-10 等于每边有 y 个点的三角形中的点数,我需要的是三角数公式的倒数。感谢所有评论的人。

正如我在编辑中提到的,我试图找到的 y 是 x 的三角根。此解决方案:

def get_triangle_root(x: int) -> int:
current_value = x - 10
negative = False
if current_value < 0:
    current_value = current_value * -1
    negative = True
current_value = np.sqrt(1 + (current_value * 8))
current_value = (current_value - 1)/2
if negative == True:
    current_value = current_value * -1
current_value = int(current_value)
return current_value

目前看来工作正常。奇怪的是,当我使用 libreoffice 或 google 计算 (-1+(sqrt(1+(8*x)))/2) 时,这个 python 脚本没有得到相同的结果,我得到比实际三角根低0.5的结果。目前不重要,但我很好奇是什么原因造成的。

无论如何,感谢所有花时间给我的人。我向所有正在寻找创建 S-curves 的通用解决方案而不仅仅是适用于我的特定任务的解决方案的人道歉,但我觉得最好附上这个问题的答案以免占上风更多人的时间。

-EDIT- 更改了 python 脚本来处理负三角数,这是我在兴奋中忽略的东西。

您要查找的是一个 class 函数,称为“Sigmoid 函数”。他们有一个特点S-shape。转到 Wolfram 并尝试一些常见的 Sigmoid 函数,记住函数 f(x-a) 中的“a”将整条曲线向左或向右移动,并将值“b”附加到函数, f(x-a) + b 将使曲线上下移动。使用系数“c”,f(c*x - a) + b 在这里充当标量。这应该可以让你在短时间内到达你想去的地方。

示例:(1/(1 + C*exp(-(x + A)))) + B