条件曲线适合scipy?

时间:2017-12-19 17:44:01

标签: python scipy curve-fitting

假设我想在我关闭灯光的数据中输入一条直线。现在我不小心打开了灯,我的数据与数据点101及其后的数据有一个恒定的偏移。

我怎么能适合这个?我试图为x添加一个条件,但是我得到了错误

  

ValueError:具有多个元素的数组的真值   暧昧。使用a.any()或a.all()

请记住取消注释代码的其余部分(遇到错误)。

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

d1 = np.random.normal(0,0.1, 100)
d2 = np.random.normal(3,0.1, 100)

x = np.arange(0,200)
y = np.concatenate((d1,d2))

plt.plot(x, y)

# def line(x, a, b, offset):
#     if x < 101:
#         y = a * x + b
#     else:
#         y = (a * x + b) + offset
#     return y
# 
# popt, pcov = optimize.curve_fit(line, xdata = x, ydata = y)
# 
# plt.plot(x, line(x, *popt), color = "firebrick")
plt.show()

预期产量: enter image description here

2 个答案:

答案 0 :(得分:3)

我认为标准技巧是将布尔条件转换为整数因子:

def line(x, a, b, offset):
    return (a * x + b) + offset * (x>100)

答案 1 :(得分:2)

您收到该错误的原因是optimize通过传递line个值来调用您的array函数,而不仅仅是单个值。要解决此问题,您的line函数必须能够处理一组值。幸运的是,numpy具有帮助您的功能。

def line(x, a, b, offset):
    return np.piecewise(x, 
                        [x < 101, x >= 101],
                        [lambda x: a * x + b, lambda x: a * x + b + offset])

我应该注意到它仍然没有收敛,但这是一个不同的问题。