近年来,物联网(IoT)和人工智能(AI)相关的技术取得了巨大的发展,逐渐成为了引领智能时代的重要动力。调研发现,物联网的核心理念是通过连接设备和传感器,实现物理世界与数字世界的无缝交互。而AI作为物联网的重要驱动力,通过分析和理解大量的数据,赋予物联网设备智能和决策能力。通过行业间的交叉融合,能够驱动不同场景的快速落地(工业4.0、元宇宙、智慧医疗以及智能城市等),最终为人们提供更好的生活体验,给企业带来潜在的经济效益。
在前期的推文中,我们在物联网和AI算法两个方面都进行了大量的工作,例如:Etwin数字孪生平台、MATLAB程序在设备端部署实例、基于深度学习的航空发动机剩余寿命预测以及基于嵌入式端的人脸识别算法等,相关的深度学习算法实现了人脸识别,工业设备寿命预测以及传感器采集数据的在线交互等,但是仔细查看会发现,以往的工作更多是将 AI 算法部署到边缘端,没有将物联网和AI算法集成到一起,因此,本推文算是不同领域交叉融合的一个实例,具体内容如下所示:
附:对于混合现实等应用场景,需要物联网和 AI 进行深度融合,不仅需要对数据进行分析处理,还涉及到图像识别,可视化等部分,还是相当具有挑战性。
我们参考tdengine官方给出的例程,在此基础上进行了优化改进,最终能够适配到自己的物联网平台,整个流程主要包含:1.环境搭建;2. 算法原理解析以及源代码修改;3. 转换为互联网行业通用的http请求,具体如下所示:
git clone https://gitee.com/mayuanliang/td-forecasting.git //可以更改为自己仓库;我将官方的代码fork了一份
cd td-forecasting/
ls // forecast.py LICENSE mockdata.py README.md requirements.txt reviewpad.yml
conda create -n tdDemo python=3.10 //安装conda;
conda activate tdDemo
sudo apt install python3-pyqt5
python3 -m pip install -r requirements.txt //等待大约5min,看服务器配置高低,可能有差异
重要部分:版本一致性(python数据库连接插件和tdengine数据库版本);当前需要搭配的tdengine数据库版本为:3.0.6.0;
pip3 install flask
整个过程中有几个关键点:1.tdengine的版本适应性问题,可以寻求官方的帮助;2.最好使用conda搭建环境,不容易出bug;后续分别运行python3 mockdata.py 给数据库插入调试数据;后续运行 forecast.py 对tdengine数据库中的数据进行预测,将结果打印到屏幕上,具体结果如图2所示:
了解算法背后的原理也是非常关键的一个环节,可以帮助我们依据具体问题对代码进行优化改进,例程中主要使用了两种算法:1. LinearRegression:这个非常简单,网上大把的教程,在此不进行赘述,本质属于最小二乘法和矩阵方程的数值求解;2. GBDT:全名叫梯度提升决策树,是一种迭代的决策树算法,将决策树与集成思想进行了有效的结合,它通过构造一组弱的学习器(树),并把多颗决策树的结果累加起来作为最终的预测输出。
有兴趣可以详细看下代码的原理,我这里尽量弱化数学这块的公式。其中,预测模型函数 F 可以表述为:
第t轮的第i个样本的损失函数的负梯度为:
训练目标为:
我们查看了mlforecast库的原始代码,其核心思想跟深度学习非常接近,主要包含两个函数,具体为:1. MLForecast.fit:能够依据现有数据进行预训练;2. MLForecast.predict:依据已训练的模型对未来进行预测。
首先,我们需要获取tdengine数据库中的数据,具体用的程序代码为:
df = pd.read_sql(
text("select _wstart as ds, avg(num) as y from power.meters interval(1w)"),
conn,
)
其次,我们需要对模型进行训练及预测,具体使用的代码为:
forecast = mlforecast.MLForecast(
models=[LinearRegression(), lgb.LGBMRegressor()],
freq="W",
lags=[52],
target_transforms=[Differences([52])],
)
forecast.fit(df)
predicts = forecast.predict(52)
附1:differences表示对原始数据进行预处理,例如:原始数据具有明显的时间趋势时(天,月,季度以及年等),可以通过差分对预测结果进行优化。其中Differences([52])表示一阶差分,偏移长度为52;
附2:lags 参数用于创建滞后特征的偏移值(lag features)。滞后特征是在时间序列预测中使用过去观测值来预测未来值的常见方法之一。
附3:freq 参数表示时间序列数据的频率。它可以采用以下几种取值:1. 整数:表示观测的固定频率。例如,如果时间序列数据以每天为单位观测,可以将 freq 设置为 1,表示每天一个观测;2. 字符串:表示时间序列数据的频率字符串。常见的频率字符串包括:"D":每天观测"W":每周观测"M":每月观测"Q":每季度观测"A":每年观测。3.None:表示未指定频率。如果不需要显式地设置时间序列数据的频率,可以将 freq 参数设置为 None。
MLForecast(
models: Union[
sklearn.base.BaseEstimator,
List[sklearn.base.BaseEstimator],
Dict[str, sklearn.base.BaseEstimator]
],
freq: Union[int, str, pandas._libs.tslibs.offsets.BaseOffset, NoneType] = None,
lags: Optional[Iterable[int]] = None,
lag_transforms: Optional[Dict[int, List[Union[Callable, Tuple[Callable, Any]]]]] = None,
date_features: Optional[Iterable[Union[str, Callable]]] = None,
differences: Optional[Iterable[int]] = None,
num_threads: int = 1,
target_transforms: Optional[List[mlforecast.target_transforms.BaseTargetTransform]] = None
)
1. 防火墙相关操作:(打开6000端口),具体过程不在赘述;
sudo apt update
2. 数据格式相关操作:将预测的结果转换为列表的形式;
predicts.values.tolist()
3. 参考资料:
mlforecast - MLForecast (nixtla.github.io)
mlforecast - Quick start (local) (nixtla.github.io)
mlforecast/mlforecast/target_transforms.py at main · Nixtla/mlforecast · GitHub
GBDT(梯度提升决策树)——来由、原理和python实现 - 知乎 (zhihu.com)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。