如何在数据集合中找到与所需行最近的相邻行?

How can I find the nearest neighboring line(s) to a desired line in a collection of data?

我需要弄清楚如何确定 "optimal" 线的最近邻居,如下面链接的简化图中所示。

*编辑 2018 年 8 月 20 日: 由于我无法在 R 中找到解决我的问题的千篇一律的解决方案,我最终制作了一个公式,使用 R 计算所需线与来自实验数据的其他每条线之间的面积。它是相似的找到最小二乘回归线,但将其带到另一个层次。最接近所需曲线的线将具有最小面积

蓝色、橙色、绿色和紫色线表示最适合约 50-100 个数据点的时间序列。所需的轮廓(红色虚线)表示最佳线性轨迹:

有没有一种可靠的方法可以通过k-最近邻来计算哪条线最接近最优线?或者我是否需要编写自己的算法来确定具有最小平方和的曲线?

预期目标:无论如何,如果我要设置 k=1,我希望算法 select 绿色时间序列。如果 k=2,我希望它 select 橙色和绿色线(并自动计算它们标记值的平均值)。

我不确定我是否需要汇总使用原始数据或为每个时间序列使用拟合线。

理想情况下,我想在这个项目中使用 R,但才刚刚开始学习 python。

希望我提供了足够的信息让事情变得容易理解。

感谢您的帮助!

好吧,我尝试了一些分享,希望能有所帮助。我创建了一些类似于您的假数据:

ts <- data.frame(ts1 =c(1,2,3,4,5,6,7,8,9),
                 ts2 =c(1,2,4,6,7,10,11,10,9.5),
                 ts3 =c(1,1.1,2,2.1,3,3.1,4,4.1,5),
                 ts4 =c(1.3,1.7,2.3,2.7,3.3,4,7,5.7,6.3),
                 time =c(1,2,3,4,5,6,7,8,9))

绘制它们:

library(ggplot2)
library(reshape2)
meltdf <- melt(ts,id="time") # ggplot loves long data, so we have to crunch them a bit
ggplot(meltdf,aes(x=time,y=value,colour=variable,group=variable)) + geom_line()

足够接近了!
现在我们必须尝试分类。使用 knn 应该是一个问题,不是算法的问题,而是我们数据给出的结果的问题。例如:

knn(train, test, cl, k = 1, l = 0, prob = FALSE, use.all = TRUE)

您必须提供一些数据进行训练,并提供一些数据进行分类:how?看起来你只能用一个 ts,ts1 训练你的 knn,然后对其他的进行分类,这不会给出一些好的结果,如此处所述。

train <- t(data.frame(knn_data[1,]))
test <- knn_data[2:4,]
label<- c('t')

knn(train = train, test = test,cl = label, k=1)
[1] t t t
Levels: t

也许 here they can help you for this, and you can start from here

但是如您所知,knn 使用欧氏距离:我们可以尝试使用它来简化它。

# here a data.frame with all the distance between ts1, source, and the other ts.
distances <- data.frame(source =c("ts1","ts1","ts1"),
                         target = c("ts2","ts3","ts4"),
                        dista = c(dist(rbind(ts$ts1, ts$ts2)),
                                      dist(rbind(ts$ts1, ts$ts3)),
                                      dist(rbind(ts$ts1, ts$ts4)))
                        )

  # now we can choose the top 1 like in this case, or the top 1.
  head(distances[order(distances$dista),],1) 

  source target    dista
3    ts1    ts3 4.672259