2020年4月29日

Thingworx Analytics介绍之三:Time Series Data建模预测



PTC的专家说,在TTF预测方面,Time Series Data模型要比标准的模型要好。
我在做Demo的过程中,也曾尝试建立Time Series Data模型,但是碰到很多坑,因此在前两篇文章中只介绍标准模型。
后来我有了PTC服务帐号,用此帐号看到了一些新的文档,才走通了这条路。

首先介绍一下什么是Time Series Data模型。
就机器学习的概念来说,训练模型的过程就是找到最合适的匹配参数,利用这些参数和变量相结合,从而计算得到输出结果。
标准的模型在训练和计算的时候,各变量的当前值和历史值没有相关性。
而对于Time Series Data模型,计算时不仅要看变量的当前值,还要看若干个历史值,而这些值是时间相关的。
Thingworx Analytics中,有两个重要的概念:look back sizedata 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,然后通过ServiceSubscription把值同步给最终的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;
----------------------------------------------------------------------



没有评论: