如何使用 R 生成零度 B 样条曲线
How to generate B-spline of degree zero using R
我目前正在使用包 splines
中的 R 函数 bs
来处理 B 样条曲线,作为一个图形示例,我想提供一个图表来显示具有不同的样条曲线集之间的差异度数。
问题是 bs
只支持大于 0 的度数。
零度样条曲线只不过是节点定义的给定区域的指示函数,但我真的不知道如何生成它。
这是我到目前为止所做的
x<-seq(0,1,length.out =1000)
par(mfrow=c(3,1))
B1<-bs(x,knots = seq(0,1,length.out = 11)[-c(1,11)],Boundary.knots = c(0,1),intercept = T,degree = 1)
matplot(x,B1,type="l",lty=1,ylim = c(-0.1,1.2),xlab = "",ylab = "")
abline(v=seq(0,1,length.out = 11),lty=2)
legend("top", legend ="B-splines of order 2")
B2<-bs(x,knots = seq(0,1,length.out = 11)[-c(1,11)],Boundary.knots = c(0,1),intercept = T,degree = 2)
matplot(x,B2,type="l",lty=1,ylim = c(-0.1,1.2),xlab = "",ylab = "")
abline(v=seq(0,1,length.out = 11),lty=2)
legend("top", legend ="B-splines of order 3")
B3<-bs(x,knots = seq(0,1,length.out = 11)[-c(1,11)],Boundary.knots = c(0,1),intercept = T,degree = 3)
matplot(x,B3,type="l",lty=1,ylim = c(-0.1,1.2),xlab = "",ylab = "")
abline(v=seq(0,1,length.out = 11),lty=2)
legend("top", legend ="B-splines of order 4")
这张取自 Hastie et.al (2017) 的图片基本上是我所缺少的。
提前致谢
正如我从评论中了解到的那样,您想要一个函数,它给定一个输入向量 x
个 n 点 returns 一系列 n-1 "splines";其中 ith 样条被定义为在其他地方 x[i] < x < x[i+1]
或 0
范围内具有值 1
。
我们可以这样做:
x <- seq(0,1,length.out =10)
zero_spline = function(x, xout, n=1000) {
if (missing(xout)) xout = seq(min(x), max(x), length.out = n)
zs = data.frame()
y = numeric(length(xout))
for (i in 1:(length(x)-1L)) {
yi = y
yi[(xout > x[i]) & (xout < x[i+1])] = 1
zs = rbind(zs, data.frame(xout, yi, interval=i))
}
zs
}
zs = zero_spline(x, n=100)
library(ggplot2)
ggplot(zs, aes(xout, yi, color=factor(interval))) +
geom_line()
我目前正在使用包 splines
中的 R 函数 bs
来处理 B 样条曲线,作为一个图形示例,我想提供一个图表来显示具有不同的样条曲线集之间的差异度数。
问题是 bs
只支持大于 0 的度数。
零度样条曲线只不过是节点定义的给定区域的指示函数,但我真的不知道如何生成它。
这是我到目前为止所做的
x<-seq(0,1,length.out =1000)
par(mfrow=c(3,1))
B1<-bs(x,knots = seq(0,1,length.out = 11)[-c(1,11)],Boundary.knots = c(0,1),intercept = T,degree = 1)
matplot(x,B1,type="l",lty=1,ylim = c(-0.1,1.2),xlab = "",ylab = "")
abline(v=seq(0,1,length.out = 11),lty=2)
legend("top", legend ="B-splines of order 2")
B2<-bs(x,knots = seq(0,1,length.out = 11)[-c(1,11)],Boundary.knots = c(0,1),intercept = T,degree = 2)
matplot(x,B2,type="l",lty=1,ylim = c(-0.1,1.2),xlab = "",ylab = "")
abline(v=seq(0,1,length.out = 11),lty=2)
legend("top", legend ="B-splines of order 3")
B3<-bs(x,knots = seq(0,1,length.out = 11)[-c(1,11)],Boundary.knots = c(0,1),intercept = T,degree = 3)
matplot(x,B3,type="l",lty=1,ylim = c(-0.1,1.2),xlab = "",ylab = "")
abline(v=seq(0,1,length.out = 11),lty=2)
legend("top", legend ="B-splines of order 4")
这张取自 Hastie et.al (2017) 的图片基本上是我所缺少的。
提前致谢
正如我从评论中了解到的那样,您想要一个函数,它给定一个输入向量 x
个 n 点 returns 一系列 n-1 "splines";其中 ith 样条被定义为在其他地方 x[i] < x < x[i+1]
或 0
范围内具有值 1
。
我们可以这样做:
x <- seq(0,1,length.out =10)
zero_spline = function(x, xout, n=1000) {
if (missing(xout)) xout = seq(min(x), max(x), length.out = n)
zs = data.frame()
y = numeric(length(xout))
for (i in 1:(length(x)-1L)) {
yi = y
yi[(xout > x[i]) & (xout < x[i+1])] = 1
zs = rbind(zs, data.frame(xout, yi, interval=i))
}
zs
}
zs = zero_spline(x, n=100)
library(ggplot2)
ggplot(zs, aes(xout, yi, color=factor(interval))) +
geom_line()