PTC的专家说,在TTF预测方面,Time Series Data模型要比标准的模型要好。
我在做Demo的过程中,也曾尝试建立Time
Series Data模型,但是碰到很多坑,因此在前两篇文章中只介绍标准模型。
后来我有了PTC服务帐号,用此帐号看到了一些新的文档,才走通了这条路。
首先介绍一下什么是Time Series Data模型。
就机器学习的概念来说,训练模型的过程就是找到最合适的匹配参数,利用这些参数和变量相结合,从而计算得到输出结果。
标准的模型在训练和计算的时候,各变量的当前值和历史值没有相关性。
而对于Time Series Data模型,计算时不仅要看变量的当前值,还要看若干个历史值,而这些值是时间相关的。
在Thingworx Analytics中,有两个重要的概念:look back size和data sampling frequency。
Look back size就是采样步长,data sampling frequency就是采样频率,两者乘积就是采样区间。
比如look back size=4, data sampling
frequency=1 minute,那总采样区间就是4分钟。
Thingworx利用Value
Stream记录time series data,我们可以利用QueryProperyHistory得到变量在采样区间的历史值:
此外,在建模的时候,还有几个参数要注意:
-
useRedundancyFilter=true
-
useGoalHistory=false
-
lookahead=1
训练时间会比标准模型长很多。
模型发布之后,测试时不仅要输入各变量的当前值,还要输入若干个历史值,然后点击Add
Row。
在创建Analyisi Events时,注意Inputs Mapping各参数对应的Thing Property必须Logged,因为只有Logged记录才能通过Value Stream查询历史值。
此外,Results Mapping如果绑定结果到Thing Property,即使此Property已经设置Logged,结果被Analytics更新时也不会记录到Value Stream。解决办法是另建一个Property,把它绑定到Results Mapping,然后通过Service或Subscription把值同步给最终的Property,并将值记录在Value Stream。经过此处理后,预测值的所有历史记录就可以通过timeserieschart展示了。
下图是采用Time Series Data建模的预测结果和实际结果的对比:
我们可以看出,预测更加精确,并且更快地拟合。
下表是各模型的建模参数:
此外,关于Value Stream写入时事务性的保证,我也找到了解决办法:使用UpdatePropertyValues函数。
下面是参考代码:
----------------------------------------------------------------------
// Use UpdatePropertyValues to make sure to
update all attribute in the same moment
var params = {
infoTableName : "InfoTable",
dataShapeName : "NamedVTQ"
};
//
CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"),
dataShapeName:STRING):INFOTABLE(VSTestDataShape)
var tempDable =
Resources["InfoTableFunctions"].CreateInfoTableFromDataShape(params);
var time = new Date();
tempDable.AddRow({
time:
time,
name: "F1",
quality: "GOOD",
value: 71
});
tempDable.AddRow({
time:
time,
name: "F2",
quality: "GOOD",
value: 72
});
tempDable.AddRow({
time:
time,
name: "F3",
quality: "GOOD",
value: 73
});
tempDable.AddRow({
time:
time,
name: "F4",
quality: "GOOD",
value: 74
});
tempDable.AddRow({
time:
time,
name: "F5",
quality: "GOOD",
value: 75
});
me.UpdatePropertyValues({
values:
tempDable /* INFOTABLE */
});
var result = tempDable;
----------------------------------------------------------------------