我在一个矩形空间内有一组点。X 坐标的比例是以 0 为中心的。
#original points
x <- scale(runif(10000, min= 0, max= 1000), scale=FALSE)
y <- runif(10000, min= 0, max= 750)
plot(x, y, pch='.')
我想把这些点缩放成一条抛物线 这样,在X坐标附近的点的X值就会变成 y= 0
比x值接近于 y= 750
,本质上是扭曲了图像。
#SC = scale
SC <- 0
x_scale = x * (y + SC)
y_scale = y * (y + SC)
plot(x_scale,y_scale, pch='.')
然而,有时候,我并不想要一个完整的抛物线。我希望有一点缓冲区。
SC <- 200
x_scale_200 = x * (y + SC)
y_scale_200 = y * (y + SC)
plot(x_scale_200, y_scale_200, pch='.')
就像... SC
接近于无穷大,绘制的空间接近于原来的矩形。
SC <- 10000
x_scale_10k = x * (y + SC)
y_scale_10k = y * (y + SC)
plot(x_scale_10k, y_scale_10k, pch='.')
我想创建一个变量 T
规模 SC
从0到1,我基本上不知道翘曲程度是如何变化的。SC
越来越大。
在我看来,一个函数指定 T = 0
将导致一条抛物线,其中 T = 1
会导致一个矩形。我可以直接乘以 T
乘以10,000,然后使用这个(只是做了一个假设,即结果足够接近于一个矩形),然而,这两者之间的差异 T = 0
和 T = 0.1
将远远大于 T = 0.9
和 T = 1.0
. 我想 T
以线性缩放'翘曲'的程度。只是有点不明白,(线性缩放)的数学关系是什么?T
到翘曲可能是以及如何在这里编码。
我考虑过把这个贴在数学论坛上,但觉得还是适合放在stackoverflow上。
虽然我最初从未解决过这个问题(事实证明我不需要),但我只是碰巧遇到了这个问题(4年后),答案对我来说似乎很明显。
一个解决方案是使用logit函数来转换输入(在这种情况下,需要使用0.5到1,而不是0到1,但这也可以缩放。由于R不喜欢Inf(logit(1)的结果),所以必须从1中减去一个小值,然后将其缩放为1000(根据一些摆弄选择),以从抛物线缩放为矩形。
sc_fun <- function(x)
{
if (x == 1)
{
x1 <- x - 0.0000000000001
} else {
x1 <- x
}
SC <- boot::logit(x1) * 1000
return(SC)
}
SC <- sc_fun(0.5)
x_scale_fun = x * (y + SC)
y_scale_fun = y * (y + SC)
plot(x_scale_fun, y_scale_fun, pch='.')
SC <- sc_fun(1)
x_scale_fun = x * (y + SC)
y_scale_fun = y * (y + SC)
plot(x_scale_fun, y_scale_fun, pch='.')