使用 scipy、numpy、python 等进行 sigmoidal 回归

2023-12-29

我有两个变量(x 和 y),它们彼此之间存在某种 S 型关系,并且我需要找到某种预测方程,使我能够在给定 x 的任何值的情况下预测 y 的值。我的预测方程需要显示两个变量之间的 S 形关系。因此,我不能满足于产生一条直线的线性回归方程。我需要看到两个变量图表右侧和左侧发生的斜率逐渐曲线变化。

在谷歌搜索曲线回归和 python 之后,我开始使用 numpy.polyfit,但这给了我可怕的结果,如果你运行下面的代码,你可以看到。谁能告诉我如何重写下面的代码以获得我想要的 sigmoidal 回归方程类型?

如果运行下面的代码,您可以看到它给出了一条向下的抛物线,这不是我的变量之间的关系应有的样子。相反,我的两个变量之间应该有更多的 sigmoidal 关系,但与我在下面的代码中使用的数据紧密配合。下面代码中的数据来自大样本研究,因此它们比五个数据点可能暗示的统计能力更强。我没有大样本研究的实际数据,但我有下面的方法及其标准差(我没有显示)。我更愿意只用下面列出的平均数据绘制一个简单的函数,但如果复杂性能够带来实质性的改进,代码可能会变得更复杂。

如何更改代码以显示 sigmoidal 函数的最佳拟合,最好使用 scipy、numpy 和 python?这是我的代码的当前版本,需要修复:

import numpy as np
import matplotlib.pyplot as plt

# Create numpy data arrays
x = np.array([821,576,473,377,326])
y = np.array([255,235,208,166,157])

# Use polyfit and poly1d to create the regression equation
z = np.polyfit(x, y, 3)
p = np.poly1d(z)
xp = np.linspace(100, 1600, 1500)
pxp=p(xp)

# Plot the results
plt.plot(x, y, '.', xp, pxp, '-')
plt.ylim(140,310)
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()

编辑如下:(重新提出问题)

您的回复及其速度令人印象深刻。谢谢你,乌努特布。 但是,为了产生更有效的结果,我需要重新构建我的数据值。这意味着将 x 值重新转换为最大 x 值的百分比,同时将 y 值重新转换为原始数据中 x 值的百分比。我尝试用您的代码执行此操作,并得出以下结果:

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.optimize 

# Create numpy data arrays 
'''
# Comment out original data
#x = np.array([821,576,473,377,326]) 
#y = np.array([255,235,208,166,157]) 
'''

# Re-calculate x values as a percentage of the first (maximum)
# original x value above
x = np.array([1.000,0.702,0.576,0.459,0.397])

# Recalculate y values as a percentage of their respective x values
# from original data above
y = np.array([0.311,0.408,0.440,0.440,0.482])

def sigmoid(p,x): 
    x0,y0,c,k=p 
    y = c / (1 + np.exp(-k*(x-x0))) + y0 
    return y 

def residuals(p,x,y): 
    return y - sigmoid(p,x) 

p_guess=(600,200,100,0.01) 
(p,  
 cov,  
 infodict,  
 mesg,  
 ier)=scipy.optimize.leastsq(residuals,p_guess,args=(x,y),full_output=1,warning=True)  

'''
# comment out original xp to allow for better scaling of
# new values
#xp = np.linspace(100, 1600, 1500) 
'''

xp = np.linspace(0, 1.1, 1100) 
pxp=sigmoid(p,xp) 

x0,y0,c,k=p 
print('''\ 
x0 = {x0}
y0 = {y0}
c = {c}
k = {k}
'''.format(x0=x0,y0=y0,c=c,k=k)) 

# Plot the results 
plt.plot(x, y, '.', xp, pxp, '-') 
plt.ylim(0,1) 
plt.xlabel('x') 
plt.ylabel('y') 
plt.grid(True) 
plt.show()

你能告诉我如何修复这个修改后的代码吗?
注意:通过重新转换数据,我基本上将 2d (x,y) sigmoid 绕 z 轴旋转了 180 度。此外,1.000 并不是真正的 x 值的最大值。相反,1.000 是最大测试条件下不同测试参与者的值范围的平均值。


下面第二次编辑:

谢谢你,乌班图。我仔细阅读了你的代码,并在 scipy 文档中查找了它的各个方面。由于您的名字似乎是 scipy 文档的作者,我希望您能回答以下问题:

1.)leastsq()是否调用residuals(),然后返回输入y向量与sigmoid()函数返回的y向量之间的差?如果是这样,它如何解释输入 y 向量和 sigmoid() 函数返回的 y 向量的长度差异?

2.) 看起来我可以为任何数学方程调用leastsq(),只要我通过残差函数访问该数学方程,该函数又调用数学函数。这是真的?

3.) 另外,我注意到 p_guess 与 p 具有相同数量的元素。这是否意味着 p_guess 的四个元素分别与 x0、y0、c 和 k 返回的值按顺序对应?

4.) 作为参数发送到residuals() 和sigmoid() 函数的p 与leastsq() 输出的p 是否相同,并且leastsq() 函数在返回之前在内部使用该p?

5.) p 和 p_guess 是否可以有任意数量的元素,具体取决于用作模型的方程的复杂性,只要 p 中的元素数量等于 p_guess 中的元素数量?


Using scipy.optimize.leastsq http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.leastsq.html#scipy.optimize.leastsq:

import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize

def sigmoid(p,x):
    x0,y0,c,k=p
    y = c / (1 + np.exp(-k*(x-x0))) + y0
    return y

def residuals(p,x,y):
    return y - sigmoid(p,x)

def resize(arr,lower=0.0,upper=1.0):
    arr=arr.copy()
    if lower>upper: lower,upper=upper,lower
    arr -= arr.min()
    arr *= (upper-lower)/arr.max()
    arr += lower
    return arr

# raw data
x = np.array([821,576,473,377,326],dtype='float')
y = np.array([255,235,208,166,157],dtype='float')

x=resize(-x,lower=0.3)
y=resize(y,lower=0.3)
print(x)
print(y)
p_guess=(np.median(x),np.median(y),1.0,1.0)
p, cov, infodict, mesg, ier = scipy.optimize.leastsq(
    residuals,p_guess,args=(x,y),full_output=1,warning=True)  

x0,y0,c,k=p
print('''\
x0 = {x0}
y0 = {y0}
c = {c}
k = {k}
'''.format(x0=x0,y0=y0,c=c,k=k))

xp = np.linspace(0, 1.1, 1500)
pxp=sigmoid(p,xp)

# Plot the results
plt.plot(x, y, '.', xp, pxp, '-')
plt.xlabel('x')
plt.ylabel('y',rotation='horizontal') 
plt.grid(True)
plt.show()

yields

带 sigmoid 参数

x0 = 0.826964424481
y0 = 0.151506745435
c = 0.848564826467
k = -9.54442292022

请注意,对于较新版本的 scipy(例如 0.9),还有scipy.optimize.curve_fit http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html#scipy-optimize-curve-fit比这个更容易使用的功能leastsq。使用拟合 sigmoid 的相关讨论curve_fit可以被找寻到here http://comments.gmane.org/gmane.comp.python.scientific.user/26237.

Edit: A resize添加了函数,以便可以重新缩放和移动原始数据以适应任何所需的边界框。


“你的名字似乎以作家的身份出现 scipy 文档”

免责声明:我不是 scipy 文档的作者。我只是一个用户,而且还是个新手。我所知道的很多事情leastsq来自阅读本教程 http://www.tau.ac.il/~kineret/amit/scipy_tutorial/,特拉维斯·奥利芬特撰写。

1.)leastsq()是否调用residuals(),然后返回差值 输入 y 向量和 sigmoid() 返回的 y 向量 功能?

是的!确切地。

如果是这样,它是如何解释的 输入长度的差异 y 向量和返回的 y 向量 sigmoid() 函数?

长度相同:

In [138]: x
Out[138]: array([821, 576, 473, 377, 326])

In [139]: y
Out[139]: array([255, 235, 208, 166, 157])

In [140]: p=(600,200,100,0.01)

In [141]: sigmoid(p,x)
Out[141]: 
array([ 290.11439268,  244.02863507,  221.92572521,  209.7088641 ,
        206.06539033])

Numpy 的奇妙之处之一是它允许您编写对整个数组进行操作的“向量”方程。

y = c / (1 + np.exp(-k*(x-x0))) + y0

可能看起来它适用于浮动(确实如此),但如果你x一个 numpy 数组,以及c,k,x0,y0浮点数,则方程定义y是一个形状相同的 numpy 数组x. So sigmoid(p,x)返回一个 numpy 数组。关于它如何工作的更完整的解释在numpybook http://web.mit.edu/dvp/Public/numpybook.pdf(numpy 认真用户必读)。

2.)看起来我可以为任何数学方程调用leastsq(),只要我 通过访问该数学方程 残差函数,进而 调用数学函数。这是真的?

True. leastsq尝试最小化残差(差值)的平方和。它搜索参数空间(所有可能的值p)寻找p最小化平方和。这x and y发给residuals,是您的原始数据值。它们是固定的。他们没有改变。这是ps(sigmoid 函数中的参数)leastsq试图最小化。

3.) 另外,我注意到 p_guess 与 p 具有相同数量的元素。做 这意味着四个要素 p_guess按顺序对应, 分别与返回的值 由 x0、y0、c 和 k?

正是如此!与牛顿法一样,leastsq需要初步猜测p。您将其提供为p_guess。当你看到

scipy.optimize.leastsq(residuals,p_guess,args=(x,y))

您可以认为,作为第一遍的 lesssq 算法(实际上是 Levenburg-Marquardt 算法)的一部分,leastsq 调用residuals(p_guess,x,y)。 注意之间的视觉相似性

(residuals,p_guess,args=(x,y))

and

residuals(p_guess,x,y)

它可以帮助您记住论点的顺序和含义leastsq.

residuals, like sigmoid返回一个 numpy 数组。对数组中的值进行平方,然后求和。这是要击败的数字。p_guess然后变化​​为leastsq寻找一组最小化的值residuals(p_guess,x,y).

4.) 是作为参数发送给residuals() 的p 以及 sigmoid() 的功能与 p 相同 将由 lesssq() 输出,并且 lesssq() 函数正在使用 p 返回之前内部?

嗯,不完全是。正如你现在所知,p_guess变化为leastsq搜索p最小化的值residuals(p,x,y). The p (er, p_guess) 发送到leastsq具有相同的形状p由返回leastsq。显然,这些值应该是不同的,除非你是一个猜测者:)

5.) p 和 p_guess 可以有任意数量的元素,具体取决于 所使用方程的复杂性 作为一个模型,只要数量 p 中的元素等于数量 p_guess 中有多少个元素?

是的。我没有进行压力测试leastsq对于非常大量的参数,但它是一个非常强大的工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 scipy、numpy、python 等进行 sigmoidal 回归 的相关文章

  • 为什么需要在 Python 方法中显式使用“self”参数? [复制]

    这个问题在这里已经有答案了 当在 Python 中的类上定义方法时 它看起来像这样 class MyClass object def init self x y self x x self y y 但在其他一些语言中 例如 C 您可以使用
  • scipy.optimize on pandas dataframe

    我试图搜索它 但结果很差 有人可以向我解释一下如何在 Pandas DataFrame 上执行 optimize minimize 以便最小化 DataFrame 中的类别和结果列之间的错误 考虑这个例子 import pandas as
  • Matplotlib 图例,跨列添加项目而不是向下添加项目

    对于下面的简单绘图 有没有办法让 matplotlib 填充图例 以便它从左到右填充行 而不是第一列然后第二列 gt gt gt from pylab import gt gt gt x arange 2 pi 2 pi 0 1 gt gt
  • 将 Python Pandas DataFrame 写入 Word 文档

    我正在努力创建一个使用 Pandas DataFrames 的 Python 生成的报告 目前我正在使用DataFrame to string 方法 但是 这会作为字符串写入文件 有没有办法让我实现这一目标 同时将其保留为表格 以便我可以使
  • 无法在 virtualenv 中安装 libxml2

    我有一个问题libxml2蟒蛇模块 我正在尝试将其安装在python3 虚拟环境使用以下命令 pip install libxml2 python3 但它显示以下错误 Collecting libxml2 python3 Using cac
  • 查找正在导入哪些 python 模块

    从应用程序中使用的特定包中查找所有 python 模块的简单方法是什么 sys modules是将模块名称映射到模块的字典 您可以检查其键以查看导入的模块 See http docs python org library sys html
  • 使用pathlib获取主目录

    翻看新的pathlib在 Python 3 4 中 我注意到没有任何简单的方法来获取用户的主目录 我能想到的获取用户主目录的唯一方法是使用旧的os path像这样的库 import pathlib from os import path p
  • 为什么 re.findall 在查找字符串中的三元组项时不具体。 Python

    所以我有四行代码 seq ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA OR 0 re findall r ATG 9 TAA TAG TGA seq 首先让我解释一下我正在尝试做什么 如果这令人困惑
  • 设置高亮大括号的 vim 颜色主题

    如何更改突出显示大括号的 vim 配色方案 我希望实际编辑 vim 主题文件以使更改永久生效 问候 克雷格 匹配括号的自动高亮颜色称为MatchParen 您可以通过执行以下操作来更改 vimrc 中的颜色 highlight MatchP
  • 查找与另一列 Pandas 中的唯一值关联的列中的值的交集

    如果我有一个像这样的数据框 非常小的例子 col1 col2 0 a 1 1 a 2 2 b 1 3 b 2 4 b 4 5 c 1 6 c 2 7 c 3 我想要所有的交集col2当价值观与其独特性相关时col1值 因此在这种情况下 交集
  • 高级描述熊猫

    有没有像 pandas 那样更高级的功能 通常我会继续这样 r pd DataFrame np random randn 1000 columns A r describe 我会得到一份很好的总结 就像这样 A count 1000 000
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • python Recipe:列出最接近等于值的项[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 考虑像这样的列表 0 3 7 10 12 15 19 21 我想获得最接近任何值的最近的最小数字 所以如果我通过4 我会得到3 如果我
  • Seaborn 中没有线性拟合的散点图

    我想知道是否有办法关闭seaborn中的线性拟合lmplot或者是否有一个等效函数可以生成散点图 当然 我也可以使用 matplotlib 但是 我发现 seaborn 中的语法和美学非常吸引人 例如 我想绘制以下情节 import sea
  • 如何按 pandas 中的值对系列进行分组?

    我现在有一只熊猫Series与数据类型Timestamp 我想按日期对其进行分组 并且每组中有许多行具有不同的时间 看似显而易见的方法类似于 grouped s groupby lambda x x date 然而 熊猫的groupby按索
  • UnicodeDecodeError:部署到 Heroku 时,“utf-8”编解码器无法解码位置 0 中的字节 0xff

    我尝试在heroku上部署我的简单django项目 但我不明白如何解决这个问题 这是git push heroku master remote Traceback most recent call last remote File tmp
  • 没有名为“turtle”的模块

    我正在学习并尝试用Python3制作贪吃蛇游戏 我正在进口海龟 我正在使用 Linux mint 19 PyCharm python37 python3 tk Traceback most recent call last File hom
  • 如何同时接受int和float类型的输入?

    我正在制作一个货币转换器 如何让 python 同时接受整数和浮点数 我就是这样做的 def aud brl amount From to ER 0 42108 if amount int if From strip aud and to
  • 基于值的 matplotlib 条形图颜色

    有没有一种方法可以根据条形图的值对条形图的条形进行着色 例如 values below 0 5 red values between 0 5 to 0 green values between 0 to 08 blue etc 我找到了一些

随机推荐

  • 使用 UpdatePanel 从内容页面更新 MasterPage 上的标签,无需完整回发

    对于这种情况有解决方案吗 我有一个内容页面 其中包含一个 UpdatePanel 和一个组合框 当组合框值更改时 我想更改主页中的标签 所以 对我来说主要的问题是我不想在每个组合框值发生变化时进行完整的回发 有什么技巧可以克服完全回发吗 提
  • 如何在 Backbone.js 中正确使用 HTML5 PushState?

    我正在使用 coenraets 员工名录 http coenraets org directory 作为我的 Backbone 应用程序的起点 我想做的第一件事是更改路由以使用 HTML5 PushState 而不是 hash hash b
  • 运行 Xcode 控制台 [重复]

    这个问题在这里已经有答案了 我想用 Instruments 运行我的 iphone 应用程序来检查内存使用情况 但我也希望能够在运行时看到我的控制台输出 目前没有办法做到这一点吗 您似乎只能在 XCode 本身中启动 Instruments
  • Java程序运行一段时间后变慢

    我有一个java程序 它是一个典型的机器学习算法 通过一些方程更新一些参数的值 for int iter 0 iter lt 1000 iter 1 Create many temporary variables and do some c
  • 用于重载 UI 的 Vaadin 替代方案

    目前我正在基于以下内容编写Web应用程序Vaadin http vaadin com 我对学习周期以及简单的 UI 设计方式感到非常满意 Vaadin 的总体优点是 面向 Java 用户的 本机 UI 编程 组件层次结构 事件侦听器 拖放
  • 将选择设置为范围

    有人可以暗示我在这里可能做错了什么吗 现在我正在有效地尝试执行 Ctrl A 命令来对 vba 中的数据块进行全选 然后我希望将该选择保存为一个范围 以便稍后使用 Dim rngAdData As Range Range A1 Select
  • flutter dart JsonSerialized 带有继承类

    我有以下两个类 其中一个类是从另一个类扩展的 如下所示 JsonSerializable nullable true class Response final String responseCode final String respons
  • qemu-x86_64:无法打开“/lib64/ld-linux-x86-64.so.2”:没有这样的文件或目录

    我在 M1 MacOS 上有一个 Rancher Desktop docker 当我尝试在 dockerfile 下构建时 我收到如下错误 这是我尝试构建图像的命令docker build t te grafana dashboards t
  • 启用 Java 允许过期证书

    是否有任何命令行标志可以使 Java 允许过期的证书 现在 由于证书已过期 我收到以下异常 Caused by java security cert CertificateExpiredException NotAfter PAST DAT
  • 在 WPF 中将整数转换为颜色

    如何在WPF中将整数转换为颜色 例如 我想将 16711935 转换为颜色 如何在 Windows 窗体 WPF 中执行如下操作 myControl Background Color FromArgb myColorInt Use the
  • 在指针列表中查找一个项目

    我试图了解如何使用 std find 在 C 中的指针列表中查找项目 如果我有例如 std list
  • UIPickerView 禁用行选择

    我想禁用我的某些行的选择UIPickerView 就像在倒计时器中一样 您尝试选择 0 它不会让您选择 并且会滑回到 1 或者您如何限制倒数计时器中的日期Date Picker 如何禁用 a 中的行UIPickerView In UIPic
  • Symfony 如何删除文件

    为什么我不能在 Symfony 中使用 unlink 我已经尝试过这个 unlink Applications XAMPP xamppfiles htdocs symfonydev web account assets data suppl
  • 在 xaml 上设置 GroupStyle 内部样式

    我正在尝试为 ContextMenu 设置默认样式 并且我想在样式内设置默认 GroupStyle ContextMenu 像这样的事情
  • Qt C++ 在 GUI 线程之外显示图像(Boost 线程)

    我正在开发一个C 库 使用VS2015通过Qt实现其接口 在图书馆方面 3增强线程连续加载 3 个文件夹中的图像 我正在尝试以 3 种不同的方式显示这些图像QLabel 或同等学历QWidgets 所以线程体由这个功能组成 特别是通过利用设
  • Windows 上的 Makefile 干净

    我现在正在学习如何使用 makefile 我制作了以下 makefile 我在 Windows 上使用 Visual Studio 命令行编译器 CC cl CFLAG EHsc test database exe composer obj
  • 如何从 LocalDate 和 LocalDateTime 中提取纪元?

    如何提取纪元值Long来自实例LocalDateTime or LocalDate 我试过了 以下 但它给了我其他结果 LocalDateTime time LocalDateTime parse 04 02 2014 19 51 01 D
  • CSS:动画与过渡

    我了解如何执行 CSS3过渡 https developer mozilla org en US docs Web CSS CSS Transitions Using CSS transitions and 动画 https develop
  • Rails 3 自动添加 X-UA-Compatible 标头?

    如果您使用 IE8 Rails 3 会自动添加标头吗 我看到 X UA Compatible 的元标记设置为 IE 8 0000 它扰乱了我的观点之一 我似乎找不到其他任何可以做到这一点的东西 所以我想我应该问这里的大脑 谢谢 鲁普里克特
  • 使用 scipy、numpy、python 等进行 sigmoidal 回归

    我有两个变量 x 和 y 它们彼此之间存在某种 S 型关系 并且我需要找到某种预测方程 使我能够在给定 x 的任何值的情况下预测 y 的值 我的预测方程需要显示两个变量之间的 S 形关系 因此 我不能满足于产生一条直线的线性回归方程 我需要