tl; dr:我想预测文件复制完成情况。考虑到开始时间和当前进度,有哪些好的方法?
首先,我知道这根本不是一个简单的问题,预测未来很难做好。对于上下文,我试图预测长文件副本的完成。
当前方法:
目前,我正在使用一个我自己提出的相当天真的公式:( ETC代表预计完成时间)
ETC = currTime + elapsedTime * (totalSize - sizeDone) / sizeDone
这是基于这样的假设:要复制的剩余文件将以迄今为止的平均复制速度进行,这可能是也可能不是一个现实的假设(在这里处理磁带存档)。
另一个想法:
我的下一个想法是记录最后 n 秒(或分钟,因为这些档案应该花费数小时)的进度记录,并且只需执行以下操作: / p>
ETC = currTime + currAvg * (totalSize - sizeDone)
这与第一种方法相反:
最后
我想起了我在大学所做的控制工程科目,其目标主要是试图让系统对突然变化做出快速反应,但不是不稳定和疯狂。
话虽如此,我能想到的另一个选择是计算上述两者的平均值,也许是通过某种加权:
我真正要求的是:
答案 0 :(得分:8)
如果您认为预测的准确性很重要,那么建立预测模型的方法如下:
我猜测你当前模型的linear combination和“最后 n 秒的平均值”对于手头的问题表现得非常好。线性组合的最佳权重可以使用linear regression(R中的单行)进行拟合。
Hastie,Tibshirani和Friedman正在研究统计学习方法的优秀资源The Elements of Statistical Learning。我不能高度推荐这本书。
最后,您的第二个想法(平均超过最后 n 秒)会尝试测量瞬时速度。一种更强大的技术可能是使用Kalman filter,其目的正是如此:
其目的是使用随时间观察的测量值,包含 噪音(随机变化)和其他不准确性,并产生价值 这往往更接近测量的真实值和 它们的相关计算值。
使用卡尔曼滤波器而不是固定的 n - 第二滑动窗口的主要优点是它具有自适应性:当测量值大幅度跳跃时,它将自动使用更长的平均窗口。恢复稳定。
答案 1 :(得分:4)
或显示事实和估算,并明确表示它只是一种估算。但我不会只显示估计值。
每个用户都知道ETC通常完全没有意义,然后很难区分有意义的ETC和无意义的ETC,特别是对于没有经验的用户。
答案 2 :(得分:3)
我已经实施了两种不同的解决方案来解决这个问题:
启动时当前传输的ETC基于历史速度值。每次转移后都会对此值进行细化。在转移过程中,我计算了历史数据和当前转移数据之间的加权平均值,这样越接近结束时,转移的实际数据的权重就越大。
不显示单个ETC,而是显示一段时间。我们的想法是从最后'n'秒或分钟计算ETC(就像你的第二个想法)。我会跟踪最佳和最差情况平均值并计算一系列可能的ETC。这在GUI中显示有点令人困惑,但可以在命令行应用程序中显示。
答案 3 :(得分:3)
这里有两件事需要考虑:
<强> 1。估计
除了统计方法之外,在消除一些噪声或峰值的同时,一种简单的方法可以很好地估计当前速度,这是采用加权方法。
你已经尝试过滑动窗口,这里的想法是采用一个相当大的滑动窗口,而不是简单的平均值,给予更多近期测量的权重,因为它们更能指示进化(有点像衍生物。)
示例:假设您有10个以前的窗口(最近的x0,最近的x9),那么您可以计算速度:
Speed = (10 * x0 + 9 * x1 + 8 * x2 + ... + x9) / (10 * window-time) / 55
如果你对可能的速度有一个很好的评估,那么你就可以获得一个好的估计时间。
<强> 2。在演示文稿
这里要记住的主要事情是你需要一个很好的用户体验,而不是一个科学的前沿。
研究表明,用户对减速的反应非常糟糕,而且加速反应非常积极。因此,一开始就应该保持良好的进度条/估计时间(保留可能的减速时间)。
获得这个的一个简单方法是使用一个百分比来完成,用于调整估计的剩余时间。例如:
real-completion = 0.4
presented-completion = real-completion * factor(real-completion)
其中factor
是factor([0..1]) = [0..1]
,factor(x) <= x
和factor(1) = 1
的地方。例如,立方函数在完成时间内产生很好的加速。其他函数可以使用指数形式1 - e^x
等......