标签: piecewise

分段函数拟合与R中的nls()

我试图将数据分为两部分.

这是一些示例数据:

x<-c(0.00101959664756622, 0.001929220749155, 0.00165657261751726, 
0.00182514724375389, 0.00161532360585458, 0.00126991061099209, 
0.00149545009309177, 0.000816386510029308, 0.00164402569283353, 
0.00128029006251656, 0.00206892841921455, 0.00132378793976235, 
0.000953143467154676, 0.00272964503695939, 0.00169743839571702, 
0.00286411493120396, 0.0016464862337286, 0.00155672067449593, 
0.000878271561566836, 0.00195872573138819, 0.00255412836538339, 
0.00126212428137799, 0.00106206607962734, 0.00169140916371657, 
0.000858015581562961, 0.00191955159274793, 0.00243104345247067, 
0.000871042201994687, 0.00229814264111745, 0.00226756341241083)

y<-c(1.31893118849162, 0.105150790530179, 0.412732029152914, 0.25589805483046, 
0.467147868109498, 0.983984462069833, 0.640007862668818, 1.51429617241365, 
0.439777145282391, 0.925550163462951, -0.0555942758921906, 0.870117027565708, 
1.38032147826294, -0.96757052387814, 0.346370836378525, -1.08032147826294, 
0.426215616848312, 0.55151485221263, 1.41306889485598, 0.0803478641720901, 
-0.86654892295057, 1.00422341998656, 1.26214517662281, 0.359512373951839, 
1.4835398594013, 0.154967053938309, -0.680501679226447, 1.44740598234453, 
-0.512732029152914, -0.359512373951839)
Run Code Online (Sandbox Code Playgroud)

我希望能够定义最合适的两部分线(显示的手绘示例)

情节

然后我定义了一个分段函数,它应该找到一个两部分线性函数.该定义基于两条线的梯度和它们彼此的截距,它们应该完全定义线.

# A=gradient of first line segment
# B=gradient of second line segment
# Cx=inflection point x …
Run Code Online (Sandbox Code Playgroud)

r piecewise

7
推荐指数
1
解决办法
5602
查看次数

如何使用 ggplot2 绘制“分段”包的结果?

我按照以下步骤绘制了带有一个断点的分段线性回归的结果,这是我通过segmented包完成的:

lin.mod <- lm(ChH~CL)
segmented.mod <- segmented(lin.mod, seg.Z=~CL)
data1 <- data.frame(x = CL, y = ChH)
data2 <- data.frame(x = CL, y = broken.line(segmented.mod)$fit)
ggplot(data1, aes(x = CL, y = ChH)) + 
  geom_point() +
  geom_line(data = data2, color = 'blue')
Run Code Online (Sandbox Code Playgroud)

我得到这个图,它不显示带有断点的两行!我应该如何更改代码才能获得正确的绘图?

这是我的数据集:(ChH 有 11 个缺失数据)

CL <- c(9.26, 9.38, 9.41, 9.44, 9.52, 9.58, 9.74, 9.91, 10.03, 10.22, 
10.23, 10.4, 10.92, 11.15, 11.38, 11.77, 11.79, 12, 12.45, 12.5, 
12.54, 12.79, 12.98, 13.04, 13.04, 13.54, 14.26, 14.33, 14.4, 
14.56, 14.77, …
Run Code Online (Sandbox Code Playgroud)

plot r linear-regression ggplot2 piecewise

6
推荐指数
1
解决办法
4499
查看次数

如何生成随机凸分段线性函数

我想生成一个玩具示例来说明 中的凸分段线性函数python,但我无法找出实现此目的的最佳方法。我想做的是指示行数并随机生成函数。

凸分段线性函数定义为:

1

例如,如果我想要四条线性线,那么我想生成如下所示的内容。

在此输入图像描述

因为有四行。我需要生成四个递增的随机整数来确定 x 轴的间隔。

import random 
import numpy as np
random.seed(1)

x_points = np.array(random.sample(range(1, 20), 4))
x_points.sort()
x_points = np.append(0, x_points)

x_points
[0 3 4 5 9]

Run Code Online (Sandbox Code Playgroud)

我现在可以使用前两点并创建一个随机线性函数,但我不知道应该如何继续以保持凸性。请注意,如果函数图形上任意两点之间的线段不位于两点之间的图形下方,则该函数称为凸函数。

python random numpy piecewise

6
推荐指数
1
解决办法
437
查看次数

如何在R中定义分段函数

我想用R定义一个分段函数,但是,我的R代码出错了.任何建议都是受欢迎的.

x<-seq(-5, 5, by=0.01)
  for (x in -5:5){
  if (-0.326 < x < 0.652) fx<- 0.632
  else if (-1.793<x<-1.304) fx<- 0.454  
  else if (1.630<x<2.119) fx<-0.227  
  else fx<- 0 }
Run Code Online (Sandbox Code Playgroud)

r function piecewise

5
推荐指数
3
解决办法
2万
查看次数

how to specify a range in numpy.piecewise (2 conditions per range)

I am trying to construct a piecewise function for some digital signal processing, but I cannot get numpy.piecewise to allow me to specify a range.

Here is what I want to input:

t = np.arange(-10,10,1)
x = lambda x: x**3
fx = np.piecewise(t, [t < -1 and t>-2, t <= 0 and t>-1, t>=0 and t<1,t>1 and t<2], [x(t + 2), x(-t),x(t),-x(2-t)])
plot(t,fx)
Run Code Online (Sandbox Code Playgroud)

However, I get the error: "ValueError: The truth value of an array with more than one element …

python numpy piecewise

5
推荐指数
2
解决办法
1722
查看次数

Numpy Arrays上的分段函数

什么是在Numpy数组上应用分段函数的有效(速度)方法?

比方说,例如,分段函数就像

For (1) :  x<=2 f(x) = 2*x + x^2
    (2) :  x>2  f(x) = -(x^2 + 2)
Run Code Online (Sandbox Code Playgroud)

这就是我做的.

data = np.random.random_integers(5, size=(5,6))
print data
np.piecewise(data, [data <= 2, data > 2],
             [lambda x: 2*x + pow(2, x),
              lambda x: -(pow(x, 2) + 2)])

data = 
[[4 2 1 1 5 3]
 [4 3 3 5 4 5]
 [3 2 4 2 5 3]
 [2 5 4 3 1 4]
 [5 3 3 5 5 5]]
output = 
array([[-18, …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy scipy piecewise

5
推荐指数
1
解决办法
2675
查看次数

逐行回归,在断点处连接一条直线和一条水平线

我想用一个断点进行分段线性回归,其中回归线的后半部分有slope = 0.有一些如何进行分段线性回归的例子,例如这里.我遇到的问题是我不清楚如何将模型的一半的斜率修正为0.

我试过了

lhs <- function(x) ifelse(x < k, k-x, 0)
rhs <- function(x) ifelse(x < k, 0, x-k)
fit <- lm(y ~ lhs(x) + rhs(x)) 
Run Code Online (Sandbox Code Playgroud)

k断点在哪里,但右边的段不是平面/水平段.

我想将第二段的斜率约束为0.我试过:

fit <- lm(y ~ x * (x < k) + x * (x > k))
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何让下半场得到零斜率.

任何帮助是极大的赞赏.


我自己的解决方案

由于下面的评论,我有一个解决方案.这是我用来优化然后绘制拟合的代码:

x <- c(1, 2, 3, 1, 2, 1, 6, 1, 2, 3, 2, 1, 4, 3, 1)
y <- c(0.041754212, 0.083491254, 0.193129615, 0.104249201, 0.17280516, 
0.154342335, 0.303370501, 0.025503008, …
Run Code Online (Sandbox Code Playgroud)

regression r linear-regression piecewise lm

5
推荐指数
2
解决办法
1299
查看次数

使用二次多项式和直线在断点处平滑连接的分段回归

我想用一个断点拟合分段线性回归xt,这样x < xt我们就得到二次多项式,并且x >= xt我们有一条直线.两个部分应该顺利连接,连续性高达一阶导数xt.这是它的外观图片:

分段回归

我将我的分段回归函数参数化为:

回归函数

其中a,b,cxt要被估计的参数.

我想在调整的R平方方面将该模型与整个范围内的二次多项式回归进行比较.

这是我的数据:

y <- c(1, 0.59, 0.15, 0.078, 0.02, 0.0047, 0.0019, 1, 0.56, 0.13, 
0.025, 0.0051, 0.0016, 0.00091, 1, 0.61, 0.12, 0.026, 0.0067, 
0.00085, 4e-04)

x <- c(0, 5.53, 12.92, 16.61, 20.3, 23.07, 24.92, 0, 5.53, 12.92, 
16.61, 20.3, 23.07, 24.92, 0, 5.53, 12.92, 16.61, 20.3, 23.07, 
24.92)
Run Code Online (Sandbox Code Playgroud)

散点图

我的尝试如下,一个已知的xt:

z <- pmax(0, x - xt) …
Run Code Online (Sandbox Code Playgroud)

regression r linear-regression piecewise lm

5
推荐指数
2
解决办法
1334
查看次数

如何将样条拟合转换为分段函数?

假设我有

import numpy as np
from scipy.interpolate import UnivariateSpline

# "true" data; I don't know this function
x = np.linspace(0, 100, 1000)
d = np.sin(x * 0.5) + 2 + np.cos(x * 0.1)

# sample data; that's what I actually measured
x_sample = x[::20]
d_sample = d[::20]

# fit spline
s = UnivariateSpline(x_sample, d_sample, k=3, s=0.005)

plt.plot(x, d)
plt.plot(x_sample, d_sample, 'o')
plt.plot(x, s(x))
plt.show()
Run Code Online (Sandbox Code Playgroud)

我得到

在此处输入图片说明

我现在想要的是所有橙色点之间的功能,所以像

knots = s.get_knots()
f0 = <some expression> for knots[0] <= x < knots[1]
f1 …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy piecewise

5
推荐指数
1
解决办法
464
查看次数

求解并绘制分段 ODE

我有一个函数d\xcf\x86/dt = \xce\xb3 - F(\xcf\x86)(其中F(\xcf\x86)-- a 是2\xcf\x80周期函数)和该函数的图形F(\xcf\x86)

\n

我需要创建一个程序,输出 6 个\xcf\x86(t)不同值\xce\xb3( \xce\xb3 = 0.10.50.951.0525)和 的图t\xe2\x88\x88[0,100]

\n

这是函数的定义F(\xcf\x86)

\n
      -\xcf\x86/a - \xcf\x80/a,    if \xcf\x86 \xe2\x88\x88 [-\xcf\x80, -\xcf\x80 + a]\n      -1,            if \xcf\x86 \xe2\x88\x88 [-\xcf\x80 + a, - a] \nF(\xcf\x86) = \xcf\x86/a,          if \xcf\x86 \xe2\x88\x88 [- a, a]\n       1,            if \xcf\x86 \xe2\x88\x88 [a, \xcf\x80 - …
Run Code Online (Sandbox Code Playgroud)

matlab plot ode piecewise periodicity

5
推荐指数
1
解决办法
321
查看次数