繁体   English   中英

似乎无法让 Scipy curve_fit Sigmoid 在 Python 中工作

[英]Can't seem to get Scipy curve_fit Sigmoid to work in Python

有一些关于这个的帖子,通常答案是有一个很好的初步猜测和界限。 我已经玩了一段时间,找不到产生任何曲线的配置。

import numpy as np
array1 = np.array(column1).astype(float)
array2 = np.array(column2).astype(float)
print(array1)
print(array2)

Output: [18.7327 9.3784 6.6293 20.8361 11.2603 19.3706 5.4302 10.1293 13.7516 8.0567 16.8688 4.969 3.94 19.4793 11.7527 13.2811 13.338 0.5944 7.4406 11.2338 6.2283 3.4818 10.1056 16.2689 22.442 18.7345 5.2605 5.6405 12.7186 18.2497 5.4315 14.2651 16.7544 12.9192 13.5955 10.9256 5.7798 8.4485 8.5229 11.879 6.5271 10.3376 7.781 31.4558 8.0236 2.3527 10.8926 16.1995 11.1924 25.8071 13.9692 20.7791 10.3045 12.2833 7.4066 15.9807 11.4462 15.1504 5.9021 19.1184]

[83.85 52.45 41.2 92.59 62.65 86.77 30.63 53.78 73.34 48.55 82.53 28.3 23.87 90.99 62.95 68.82 71.06 20.74 45.25 60.65 39.07 21.93 53.35 79.61 93.27 85.88 28.95 32.73 65.89 83.51 30.74 75.22 79.8 67.43 71.12 58.41 35.83 49.61 50.72 63.49 40.67 55.75 46.49 96.22 47.62 21.8 56.23 76.97 59.07 94.67 74.9 92.52 55.61 63.51 41.34 76.8 62.81 75.99 36.34 85.96]

import pylab
from scipy.optimize import curve_fit

def sigmoid(x, a, b):
     y = 1 / (1 + np.exp(-b*(x-a)))
     return y

popt, pcov = curve_fit(sigmoid, array1, array2, p0 = [5,20], method='dogbox', bounds=([0, 20],[40, 100]))
print(popt)

x = np.linspace(0, 35, 50)
y = sigmoid(x, *popt)

pylab.plot(array1, array2, 'o', label='data')
pylab.plot(x,y, label='fit')
pylab.ylim(0, 100)
pylab.legend(loc='best')
pylab.show()

输出:图表

如您所见,它根本没有做任何事情。 非常感谢任何帮助以获得粗略的 sigmoid 曲线。 不需要非常准确。

非常感谢。

在您的情况下,问题不是一个好的初始猜测,而是一个不合适的模型。 请注意您的 sigmoid 如何不能大于 1,但您的数据在 ~10 - 100 的范围内。

xs = np.linspace(0, 15)
as_ = np.linspace(0, 5, num=10)
bs_ = np.linspace(0, 5, num=10)
for a in as_:
    for b in bs_:
        plt.plot(xs, sigmoid(xs, a, b))

在此处输入图像描述

因此,您要么必须修改模型以接受缩放参数,要么将数据缩小到模型可以适应的范围。 这是两个解决方案:

前言

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import pandas as pd

array1 = np.array([18.7327,9.3784,6.6293,20.8361,11.2603,19.3706,5.4302,10.1293,13.7516,8.0567,16.8688,4.969,3.94,19.4793,11.7527,13.2811,13.338,0.5944,7.4406,11.2338,6.2283,3.4818,10.1056,16.2689,22.442,18.7345,5.2605,5.6405,12.7186,18.2497,5.4315,14.2651,16.7544,12.9192,13.5955,10.9256,5.7798,8.4485,8.5229,11.879,6.5271,10.3376,7.781,31.4558,8.0236,2.3527,10.8926,16.1995,11.1924,25.8071,13.9692,20.7791,10.3045,12.2833,7.4066,15.9807,11.4462,15.1504,5.9021,19.1184])
array2 = np.array([83.85,52.45,41.2,92.59,62.65,86.77,30.63,53.78,73.34,48.55,82.53,28.3,23.87,90.99,62.95,68.82,71.06,20.74,45.25,60.65,39.07,21.93,53.35,79.61,93.27,85.88,28.95,32.73,65.89,83.51,30.74,75.22,79.8,67.43,71.12,58.41,35.83,49.61,50.72,63.49,40.67,55.75,46.49,96.22,47.62,21.8,56.23,76.97,59.07,94.67,74.9,92.52,55.61,63.51,41.34,76.8,62.81,75.99,36.34,85.96])
df = pd.DataFrame({'x':array1, 'y':array2})
df = df.sort_values('x')

缩放数据以匹配参数

def sigmoid(x, a, b):
    y = 1 / (1 + np.exp(-b*(x-a)))
    return y

popt, pcov = curve_fit(sigmoid, df['x'], df['y'] / df['y'].max(), p0 = [5,20], method='dogbox', bounds=([0, 0],[40, 100]))

plt.plot(df['x'], df['y'] / df['y'].max(), label='data')
plt.plot(df['x'], sigmoid(df['x'], *popt))

流行音乐是 [ popt [8.56754823 0.20609918]

在此处输入图像描述

向函数添加新参数

def sigmoid2(x, a, b, scale):
    y = scale / (1 + np.exp(-b*(x-a)))
    return y

popt, pcov = curve_fit(sigmoid2, df['x'], df['y'], p0 = [5,20, 100], method='dogbox', bounds=([0, 0, 0],[40, 100, 1E5]))

plt.plot(df['x'], df['y'], label='data')
plt.plot(df['x'], sigmoid2(df['x'], *popt))

poptarray([ 8.81708442, 0.19749557, 98.357044 ])

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM