R:散点图中的 Elbow/knee 点
R: Elbow/knee points in Scatterplot
我需要用 R 识别曲线中的两个肘点。该曲线不是真正的曲线,而是由三个线性函数组成。线性函数本身是未知的。我已经尝试过不同的方法,但其中 none 能够识别出正确的点。
有人知道解决方案吗?
您可以查看直线的斜率,看看它在哪里发生变化:
fake <- data.frame(x = c(1:9, 10*1:5, 50*2:5),
y = c(10:2, 0.1*10:6, 0.01*59:56))
plot(fake)
# diff compares each value to the prior row. Undefined for first row so I add NA at the start
fake$slope = c(NA, diff(fake$y)/diff(fake$x))
fake$slope_chg = c(NA, round(diff(fake$slope),5))
fake$change = ifelse(fake$slope_chg != 0, "change","")
结果
x y slope slope_chg change
1 1 10.00 NA NA <NA>
2 2 9.00 -1e+00 NA <NA>
3 3 8.00 -1e+00 0.0000
4 4 7.00 -1e+00 0.0000
5 5 6.00 -1e+00 0.0000
6 6 5.00 -1e+00 0.0000
7 7 4.00 -1e+00 0.0000
8 8 3.00 -1e+00 0.0000
9 9 2.00 -1e+00 0.0000
10 10 1.00 -1e+00 0.0000
11 20 0.90 -1e-02 0.9900 change
12 30 0.80 -1e-02 0.0000
13 40 0.70 -1e-02 0.0000
14 50 0.60 -1e-02 0.0000
15 100 0.59 -2e-04 0.0098 change
16 150 0.58 -2e-04 0.0000
17 200 0.57 -2e-04 0.0000
18 250 0.56 -2e-04 0.0000
我需要用 R 识别曲线中的两个肘点。该曲线不是真正的曲线,而是由三个线性函数组成。线性函数本身是未知的。我已经尝试过不同的方法,但其中 none 能够识别出正确的点。 有人知道解决方案吗?
您可以查看直线的斜率,看看它在哪里发生变化:
fake <- data.frame(x = c(1:9, 10*1:5, 50*2:5),
y = c(10:2, 0.1*10:6, 0.01*59:56))
plot(fake)
# diff compares each value to the prior row. Undefined for first row so I add NA at the start
fake$slope = c(NA, diff(fake$y)/diff(fake$x))
fake$slope_chg = c(NA, round(diff(fake$slope),5))
fake$change = ifelse(fake$slope_chg != 0, "change","")
结果
x y slope slope_chg change
1 1 10.00 NA NA <NA>
2 2 9.00 -1e+00 NA <NA>
3 3 8.00 -1e+00 0.0000
4 4 7.00 -1e+00 0.0000
5 5 6.00 -1e+00 0.0000
6 6 5.00 -1e+00 0.0000
7 7 4.00 -1e+00 0.0000
8 8 3.00 -1e+00 0.0000
9 9 2.00 -1e+00 0.0000
10 10 1.00 -1e+00 0.0000
11 20 0.90 -1e-02 0.9900 change
12 30 0.80 -1e-02 0.0000
13 40 0.70 -1e-02 0.0000
14 50 0.60 -1e-02 0.0000
15 100 0.59 -2e-04 0.0098 change
16 150 0.58 -2e-04 0.0000
17 200 0.57 -2e-04 0.0000
18 250 0.56 -2e-04 0.0000