R中的smooth.spline函数允许在粗糙度(由二阶导数的积分平方定义)和拟合点(通过对残差的平方求和所定义)之间进行权衡.这种权衡是通过spar或df参数完成的.在一个极端,你获得最小方块线,另一个你得到一个非常摇摆的曲线,它与所有数据点相交(或者如果你有重复的x值,具有不同的y值,则为平均值)
我在Python中查看了scipy.interpolate.UnivariateSpline和其他样条变量,但是,他们似乎只是通过增加结的数量来进行权衡,并为允许的SS残差设置一个阈值(称为s).相比之下,R中的smooth.spline允许在所有x值处具有节点,而不必具有击中所有点的摇摆曲线 - 惩罚来自二阶导数.
Python是否具有以这种方式运行的样条拟合机制?允许所有结,但惩罚二阶导数?
给定空间中的任意点序列,您将如何在它们之间产生平滑的连续插值?
欢迎使用2D和3D解决方案.产生以任意粒度的点列表的解决方案以及为贝塞尔曲线产生控制点的解决方案也是值得赞赏的.
另外,看到一个迭代解决方案可以在接收到点时接近曲线的早期部分,这很酷,所以你可以用它绘制.
我正在寻找一种通过多个点制作直线曲线的方法.最好使用3个点,尽管我认为为了给出进入点的线的角度的上下文,可能需要更多来给出曲线的上下文.
通常,起点P1,控制点P2和终点P3,该线应从P1弯曲到P2,然后从P2到P3弯曲.
事实上,这是我希望实现的效果的完美示例:

如果我能做到这一点,我真的会永远感激!
到目前为止,在Java中,我尝试过使用QuadCurve2D.Double,Cub icCurve2D.Double以及Path2D.Double(使用带有Path2D.Double的curveTo)之类的东西,但无济于事 - 绘制的曲线甚至不接近通过指定的控制点.
这是我到目前为止尝试的方法的图像:

这是我用来生成图像中的点和曲线的代码:
Graphics2D g = (Graphics2D) window.getGraphics();
g.setColor(Color.blue);
int d = 4;
// P0
int x0 = window.getWidth()/8;
int y0 = 250;
g.drawString("P0", x0, y0 + 4*d);
g.fillRect(x0, y0, d, d);
// P1
int x1 = (window.getWidth()/7)*2;
int y1 = 235;
g.drawString("P1", x1, y1 + 4*d);
g.fillRect(x1, y1, d, d);
// P2
int x2 = (window.getWidth()/2);
int y2 = 200;
g.drawString("P2", x2, y2 - 2*d);
g.fillRect(x2, …Run Code Online (Sandbox Code Playgroud) 简要背景:我正在开发一个基于Web的绘图应用程序,需要绘制1px厚的样条曲线,这些样条曲线通过它们的控制点.
我正在努力解决的问题是我需要在p1和p2之间绘制每个像素,就像我使用1px铅笔工具一样.因此,一次没有抗锯齿和一个像素.这需要在不使用任何线/曲线库代码的情况下手动完成,因为我的画笔系统依赖于具有像素坐标以将画笔笔尖应用于画布.
基本上,我需要将像Bresenham算法这样的一个像素步进与Catmull-Rom方程返回的坐标结合起来.我遇到了麻烦,因为Catmull-Rom点分布不均匀(所以我不能说曲线中应该有100个像素并运行方程100次).我尝试使用最大的X和Y的增量的的估计初始值和与布氏间隙充填,但由于四舍五入我仍然结束了一些"脏"的部分(即该线清楚地向上移动,并与对,但我仍然得到两个具有相同Y分量的像素,导致该行的"胖"部分).
我很肯定这已经解决了,因为几乎所有绘制样条的图形程序都必须支持我所追求的干净像素曲线.经过相当多的数学研究,我有点困惑,仍然没有解决方案.有什么建议?
编辑:这是我可能需要呈现的曲线的示例:

哪个可能有预期的结果(请注意这是一个估计):

使用Catmull-Rom样条方程,我们需要四个点来创建一个分段.P0和P3用作来自P1-> P2段的进出方向的切线.使用Catmull-Rom样条曲线时,蓝色部分随着t从0移动到1而被插值.可以复制P0和P3以确保渲染绿色部分,因此这对我来说不是问题.
为了简便起见,我需要呈现P1和P2之间的曲线上的像素,因为我在P0和P3的形式切线.我不一定需要使用Catmull-Rom样条曲线,但它们似乎是这项工作的正确工具,因为控制点必须通过.插值点的非均匀分布是我抛弃循环的原因.
EDIT2:这是我说的结果曲线很脏时的一个例子:

红色箭头指出了一些不应该有像素的位置.发生这种情况是因为计算出的坐标的X和Y分量不会以相同的速率变化.因此,当每个组件都被舍入时(因此我有一个精确的像素位置),可能是X或Y没有被碰到的情况,因为计算的坐标是,例如,(42.4999,50.98).将圆形换成地板或天花板并不能解决问题,因为它只会改变发生的位置.
我正在使用R中的mgcv包来通过以下方法将一些多项式样条拟合到某些数据:
x.gam <- gam(cts ~ s(time, bs = "ad"), data = x.dd,
family = poisson(link = "log"))
Run Code Online (Sandbox Code Playgroud)
我正在尝试提取拟合的功能形式.x.gam是一个gamObject,我一直在阅读文档,但没有找到足够的信息,以手动重建拟合函数.
x.gam$smooth 包含有关是否已放置结的信息;x.gam$coefficients 给出样条系数,但我不知道使用什么顺序多项式样条并且在代码中查找没有透露任何内容.有没有一种简洁的方法来提取结,系数和使用的基础,以便人们可以手动重建拟合?
我正在逆向工程Mathematica如何列出插值:
(* Fortunately, Mathematica WILL interpolate an arbitrary list *)
tab = Table[a[i], {i,1,100}]
f = Interpolation[tab]
(* get the coefficient of each term by setting others to zero *)
Plot[{f[42+x] /. {a[42] -> 0, a[43] ->0, a[44] -> 0, a[41] -> 1}},
{x,0,1}]
Plot[{f[42+x] /. {a[41] -> 0, a[43] ->0, a[44] -> 0, a[42] -> 1}},
{x,0,1}]
Plot[{f[42+x] /. {a[42] -> 0, a[41] ->0, a[44] -> 0, a[43] -> 1}},
{x,0,1}]
Plot[{f[42+x] /. {a[42] -> 0, a[43] ->0, a[41] …Run Code Online (Sandbox Code Playgroud) csaps()在 matlab 中根据平滑参数的特定定义进行三次样条p。这是一些matlab代码及其结果:
% x variable
age = 75:99
% y variable
diffs = [-39 -2 -167 -21 -13 32 -37 -132 -143 -91 -93 -88 -62 -112 -95 -28 -90 -40 -27 -23 -28 -11 -8 -6 1]
% 0.0005 is the parameter p, and the later specification of
% age are the desired x for prediction
csaps(age,diffs,0.0005,age)
% result (column headers removed):
-63.4604 -64.0474 -64.6171 -65.1397 -65.6111 -66.0165 -66.3114
-66.4123 -66.2229 -65.6726 -64.7244 -63.3582 -61.5676 …Run Code Online (Sandbox Code Playgroud) 我有以下型号:
coxph(Surv(fulength, mortality == 1) ~ pspline(predictor))
Run Code Online (Sandbox Code Playgroud)
其中,fulength是一个随访的持续时间(包括死亡率),预测因子是死亡率的预测因子.
上面命令的输出是这样的:
coef se(coef) se2 Chisq DF p
pspline(predictor), line 0.174 0.0563 0.0562 9.52 1.00 0.002
pspline(predictor), nonl 4.74 3.09 0.200
Run Code Online (Sandbox Code Playgroud)
如何绘制这个模型,以便在y轴上获得95%置信区间和风险比的漂亮曲线?我的目标是类似于此:

我有一组要使用 B 样条曲线平滑的点。
我的问题是如何实现 B 样条曲线来平滑这些点集?
我想使用 C++ 来实现这一点。
我正在尝试模拟Excel
插入>散布>带有平滑线条和标记的散布
Matplotlib 中的命令
scipy 函数interpolate创建了类似的效果,并提供了一些很好的示例来说明如何简单地实现此功能: 如何在 matplotlib 中绘制三次样条曲线
然而,Excel 的样条算法也能够仅通过三个点生成平滑曲线(例如 x = [0,1,2] y = [4,2,1]);并且不可能用三次样条来做到这一点。
我看过一些讨论,建议 Excel 算法使用 Catmull-Rom 样条线;但不太了解这些,也不了解它们如何适应 Matplotlib: http://answers.microsoft.com/en-us/office/forum/office_2007-excel/how-does-excel-plot-smooth-curves /c751e8ff-9f99-4ac7-a74a-fba41ac80300
是否有一种简单的方法可以修改上述示例,以使用插值库通过三个或更多点实现平滑曲线?
非常感谢