我正在尝试将分段定义的函数拟合到Python中的数据集。我已经搜索了很长一段时间,但是无论是否可行,我都没有找到答案。
为了让我对我正在尝试做的事情有印象,请看以下示例(对我而言不起作用)。在这里,我尝试将位移的绝对值函数(f(x)= | xp |)拟合到以p为拟合参数的数据集。
import scipy.optimize as so
import numpy as np
def fitfunc(x,p):
if x>p:
return x-p
else:
return -(x-p)
fitfunc = np.vectorize(fitfunc) #vectorize so you can use func with array
x=np.arange(1,10)
y=fitfunc(x,6)+0.1*np.random.randn(len(x))
popt, pcov = so.curve_fit(fitfunc, x, y) #fitting routine that gives error
Run Code Online (Sandbox Code Playgroud)
有什么办法可以在Python中完成这项工作吗?
在R中执行此操作的方法是:
# Fit of a absolute value function f(x)=|x-p|
f.lr <- function(x,p) {
ifelse(x>p, x-p,-(x-p))
}
x <- seq(0,10) #
y <- f.lr(x,6) + rnorm (length(x),0,2)
plot(y ~ x)
fit.lr <- nls(y ~ …Run Code Online (Sandbox Code Playgroud) 所以我想绘制这个函数

对于-1
首先我创建了分段函数
function x = pieceWise(t)
if t >= 0 & t <3
x = exp(-t);
else
x = 0;
endif
Run Code Online (Sandbox Code Playgroud)
然后调用并在这里绘制它
x = linspace(-1,5,1000);
y = pieceWise(x);
plot(x,y)
Run Code Online (Sandbox Code Playgroud)
但输出始终为0

任何提示都会非常有帮助。谢谢
运行以下代码:
import matplotlib.pyplot as plt
import numpy as np
def xon (ton, t):
if ton <= t:
return (t-ton)/5
else:
return 0
vxon = np.vectorize(xon)
t = np.linspace(0, 49, 50)
xontest = vxon(0, t)
plt.plot(t, xontest, '-')
plt.show()
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试绘制ton值时,wchich不同于零,例如:
xontest = vxon(2, t)
Run Code Online (Sandbox Code Playgroud)
该图似乎将所有xon值舍入为整数:
我的代码中有什么导致这种行为?
我需要以极其简洁的方式解释这一点,因为我没有统计学的基础知识来更简洁地解释.在SO中询问是因为我正在寻找python解决方案,但如果更合适,可能会转到stats.SE.
我有井下数据,可能有点像这样:
Rt T
0.0000 15.0000
4.0054 15.4523
25.1858 16.0761
27.9998 16.2013
35.7259 16.5914
39.0769 16.8777
45.1805 17.3545
45.6717 17.3877
48.3419 17.5307
51.5661 17.7079
64.1578 18.4177
66.8280 18.5750
111.1613 19.8261
114.2518 19.9731
121.8681 20.4074
146.0591 21.2622
148.8134 21.4117
164.6219 22.1776
176.5220 23.4835
177.9578 23.6738
180.8773 23.9973
187.1846 24.4976
210.5131 25.7585
211.4830 26.0231
230.2598 28.5495
262.3549 30.8602
266.2318 31.3067
303.3181 37.3183
329.4067 39.2858
335.0262 39.4731
337.8323 39.6756
343.1142 39.9271
352.2322 40.6634
367.8386 42.3641
380.0900 43.9158
388.5412 44.1891
390.4162 44.3563
395.6409 44.5837 …Run Code Online (Sandbox Code Playgroud) 我试图在Mathematica中绘制一个mollifier函数的导数.它区分OK功能,并可以绘制使用功能%,但我想能够通过分配导数是一个函数来绘制f[t_],然后Plot[ f[t] , {t,-1,1} ].
我不确定如何解决出现的错误.
Mathematica代码是:
Clear[moll, f]
moll[x_] :=
Piecewise[ { {E^(-1/(1 - x^2)), -1 < x < 1} , {0,x <= -1 || x >= 1} } ]; (* Standard mollifier *)
f[t_] := D[ moll[t] , t]
f[t]
Plot[%, {t, -1, 1}] (* this line works *)
Plot[f[t], {t, -1, 1}] (* this line comes up with an error *)
Run Code Online (Sandbox Code Playgroud) 我试图在MATLAB中绘制以下函数:

目标是将所有不同的条件拼接成一个图形以制作整体CDF图形.到目前为止我尝试的是以下内容:
x=linspace(0,1,20);
y=linspace(0,1,20);
Z=x.^y;
plot3(x,y,Z)
hold on
plot3(x,0,0);
plot3(0,y,0);
Run Code Online (Sandbox Code Playgroud)
我不确定如何绘制图1,x>1, y>1以及是否有一种方法可以使绘图成为这组条件的固体曲面.我已经尝试使用rand()生成器在0和之间生成20多个数字1,这表示变量可以定位的区域.但是,当它是给定区域中的线条散布时,它看起来很麻烦.我宁愿它是一个坚实的表面.
我可以使用特定的命令吗?我在一些例子中看到过Mesh()用于使图形稳固但不确定这是否适用于数据集.
我试图理解分段混合效果模型的摘要输出,并可以使用一些见解.具体来说,我想知道如何获得断点左右两侧的回归截距和斜率.根据我的理解,下面输出中给出的截距是断点左边的回归线,给出的值I(Days*(Days <6.07))是该线的斜率.但是,我不认为我(Days*(Days> = 6.07))是断点右边的斜率,也不是两个斜率的差异.
library(lme4)
sleepstudy<-as.data.frame(sleepstudy)
Run Code Online (Sandbox Code Playgroud)
我从前一个帖子中提取了断点:https://stats.stackexchange.com/questions/19772/estimating-the-break-point-in-a-broken-stick-piecewise-linear-model-with-rando
Linear mixed model fit by REML ['lmerMod']
Formula: Reaction ~ I(Days * (Days < 6.07)) + I(Days * (Days >= 6.07)) + (1 | Subject)
Data: sleepstudy
REML criterion at convergence: 1784.369
Random effects:
Groups Name Variance Std.Dev.
Subject (Intercept) 1377.6 37.12
Residual 965.7 31.08
Number of obs: 180, groups: Subject, 18
Fixed effects:
Estimate Std. Error t value
(Intercept) 252.2663 10.0545 25.090
I(Days * (Days < 6.07)) 10.0754 1.3774 …Run Code Online (Sandbox Code Playgroud) 当然v,a是Eigen::VectorXdn维的向量,我想进行以下分段操作:
vby a,即向量的分段乘法(a[1]*v[1], ..., a[n]*v[n]),和v,即矢量(v[1]*v[1], ..., v[n]*v[n]).是否Eigen提供上述操作的方法,还是需要手动实现?当然非常简单,但我希望他们尽可能快地运行.
今天我正在帮助一位朋友进行分段回归。我们试图用断点拟合分段回归,看看它是否比标准线性模型更适合数据。
我偶然发现了一个我无法理解的问题。当使用所提供的数据用单个断点拟合分段回归时,它确实适合单个断点。
然而,当您根据模型进行预测时,它会给出看起来像 2 个断点的信息。使用绘制模型时plot.segmented()不会出现此问题。
任何人都知道发生了什么以及我如何获得正确的预测(以及标准错误等)?或者我在代码中一般做错了什么?
# load packages
library(segmented)
# make data
d <- data.frame(x = c(0, 3, 13, 18, 19, 19, 26, 26, 33, 40, 49, 51, 53, 67, 70, 88
),
y = c(0, 3.56211608128595, 10.5214485148819, 3.66063708049802, 6.11000808621074,
5.51520423804034, 7.73043895812661, 7.90691392857039, 6.59626527933846,
10.4413913666936, 8.71673928545967, 9.93374157928462, 1.214860139929,
3.32428882257746, 2.65223361387063, 3.25440939462105))
# fit normal linear regression and segmented regression
lm1 <- lm(y ~ x, d)
seg_lm <- segmented(lm1, ~ x)
slope(seg_lm)
#> $x
#> Est. St.Err. t …Run Code Online (Sandbox Code Playgroud)