作者:京东零售 罗尚勇

异常检测(Anomaly detection)技术就像是一个隐形的守护者,悄无声息地监视着数据流,寻找着那些与正常模式不符的迹象。 在本篇文章中,将探讨基于时序流的异常检测技术,解决如何及时发现序列模式的异常、以及适应数据分布变化(概念漂移)等带来的挑战,最后并基于了部分公开数据集和风控域场景进行相关案例的应用测试。

在这里插入图片描述

一、项目背景

1、业务背景

1) 为何需要及时发现异常? 因为可以帮助企业及时干预止损,降低异常风险带来的影响。

例如,在历史价格风险事件中,当商家或平台在设置促销活动时出错,从而导致一些商品以超低价的方式进行销售,特别是一些热门高价值商品,一旦被黑灰产盯上,短短几分钟内就可能被哄抢完毕,且如果发现还不及时,造成的损失将是巨大的,而对于一些中小商家而言,导致的结果可能就是直接破产。

2) 无效预警过多,带来哪些问题? 除了耗费人力外,“ 狼来了” 效应也可能造成真正风险被掩盖,企业无法及时采取有效措施进行干预。

2、现有技术及背景

为何需要进行时序流异常检测? 基于业务背景,为了及时发现异常,降低异常风险给企业带来的损失或影响,因此检测数据流的异常也很具实际意义。

在这里插入图片描述

现有技术中,本文总结了三大类时序流异常检测相关的技术,分别选取了近些年具有代表性的先进技术方法进行对比分析(如上表格内容所示),整体的对比分析介绍如下:

1) 机器学习(Machine Learning) 。代表技术方法是由亚马逊在16年提出的RRCF(Robust Random Cut Forest),该方法是一种无监督在线异常检测算法,具有在线学习的能力,可用于时序流的异常检测,无需单独训练,能批量化的快速接入新业务场景的指标级数据,应用比较广泛;但是记忆周期较短,易产生无效预警(如下图所示)、对复杂Pattern Anomaly 检测效果不佳。

在这里插入图片描述

2) 异常检测框架(Anomaly Detection Framework) 。代表技术方法MemStream,是于2022年最新提出的一种专门针对流数据的在线异常检测框架(如下图所示-引用文献[2]),该方法无需大量训练数据,只需小量样本做数据表征的预训练,就能实时检测异常并更新内存中的正常数据趋势,对概念漂移具有较好的适应性;但为了存储历史信息以适应数据趋势变化,MemStream 需要较大的内存空间,导致存在一定应用瓶颈,同时对于未出现过的Pattern Anomaly,可能也会受到表征能力的不足而无法检测出来。

在这里插入图片描述

3) 深度学习(Deep Learning) 。代表技术方法有Anomaly Transformer(2022)、Dual-TF(2024),两种方法均是基于Transformer架构进行实现,通过自注意力机制,能够有效捕捉时序流数据中的长周期序列的上下文依赖关系,拥有强大的时序流特征捕捉能力,对复杂Pattern Anomaly 检测相对其他方法也效果更好;但实际应用的局限性较大,时序流中基于自注意力机制计算成本较高,且接入场景需要依赖大量的训练样本,同时在线学习困难,不能很好的适应概念漂移的场景。

二、技术挑战

1) 模式异常( Pattern Anomaly )。 需要第一时间捕获序列模式的异常变化,及时干预止损,降低风险带来的影响。如下图所示(引用参考文献[1])序列模式的检测相对点异常更加困难,目前使用最新先进的算法(Dual-TF 2024)进行基准数据集的测试,得到的整体基准线也偏低。
在这里插入图片描述



2) 长时记忆( long-term memory )。 需要增强时序流算法模型的记忆功能,减少无效预警。

3) 概念漂移( Concept Drift )。 需要适应数据流分布变化,减少持续错误预警。
在这里插入图片描述

通俗化来说,就是需要 “ 早发现 ”“ 能记住 ” ,还要具备 “ 持续不断学习 ” 适应力强的能力。

三、异常定义

在这里插入图片描述

什么是异常? 如本文开篇所提到的,与 “正常模式” 不符的迹象 就代表异常。 在时间序列流中,异常类型众多,常见的异常类型可如上图所示,可以观察到,将时间点的数据流,按窗口大小切分成片段化的短序列后,能更容易发现到更多的异常(如,黑色矩形框所示),且异常片段相对其他片段都是比较特殊的pattern,为了更好表征这种序列pattern的特征,通过借鉴自注意力机制的思想,本文提出了一种名为 “自隔离机制”(self-isolation)的方法。

四、自隔离机制(self-isolation)

1、基本原理

在这里插入图片描述

离群(Outlier)?顾名思义,可以简单的理解为脱离了群体集合的意思。在统计学中,离群点主要是指在一组数据中与其他观察值存在显著不同的数据点。(比如,在一场班级考试中,大部分学生的成绩都在60\~90分之间,但是有一位学生的成绩在120分以上(满分150),此时该学生的成绩是“离群”的,并且与其他同学成绩的差距越大,其最终成绩的离群程度也越大,所以当该学生实际成绩在150分时的离群程度会更高于120分。)

自隔离机制(self - isolation)是捕捉序列{Z1​,Z2​,..,Zn​}内部元素之间相互离群程度关系的一种方法,也是序列模式的一种表征,将输入序列{Z1​,Z2​,..,Zn​}**经过编码,转换成一个长度大小为n的Embedding向量[e1​,e2​,..,en​] **,满足条件Σei​=1。基本原理如上图所示,核心思想就是将时间序列{Z1​,Z2​,..,Zn​}中元素(时间点数据Zi​)进行隔离,计算该元素与其他序列元素间的距离,用于反应它在整个序列中的离群程度,同时对序列中所有元素重复相同操作,最后进行统一标准转换,得到该序列模式表征的结果,相关内部处理逻辑如下所示:

1)序列元素间距离

Di​=Dif(ZRn∗d,Zi​)=ZRn∗d−Zi​(1)

Zi​:代表窗口序列中第i个位置点数据,大小(1*d), d代表维度大小,其中Zi​∈ZRn∗d
ZRn∗d:代表时间点的窗口序列流数据集,大小(n*d),n代表序列窗口大小,d代表维度大小。
Di​:代表与中每一个元素的距离向量。

2)相对位置距离

RPi​=n∗(n−1)2∗(range(0,n)−i)​(2)

RPi​:代表窗口序列中第i个位置的相对位置距离编码。

3)L范式距离度量和

li​=∣∣Di​+RPi​∣∣k​(3)
li​:代表Zi与ZRn∗d的整体k范式距离度量和,k = 1。

4)离群程度表征

在这里插入图片描述

2、序列模式

在这里插入图片描述

如何理解 “序列模式 ” ? 以及序列模式中的 “ 正常模式 ” 和 “ 异常模式 ” ? 想象你正在听一首歌曲,这首歌曲有一个明显的旋律(或者说是主题),它在整个歌曲中反复出现,此为正常模式,就像一首歌曲中的主旋律一样,它是可以预测和期待的。现在,假如在这首歌曲中,突然出现有一段独奏或者一个非常特别的音符,打破了原本的旋律,这个独奏或音符就是异常模式,它与正常模式不同,可能会引起你的注意或者改变你对歌曲的理解。

在时间序列流中也是类似的,正常模式就像歌曲中的主旋律,代表着数据稳定或可预测的变化,异常模式就像独奏或特殊音符,代表着数据中的不寻常或意外的变化。因此,在序列模式中, "模式"这个概念可以理解为相似的规律或特征。而基于自隔离机制的方法也是为了表征这种序列模式,如上图所示,A、B、C、D四个商品,在不考虑任何促销活动的背景下,虽然销售价格不同,但序列模式都是一致的,属于平稳序列;同时在不考虑位置编码信息的情况下,窗口大小 window = 5 时,序列模式为[0.2,0.2,0.2,0.2,0.2],窗口window = 10 时,序列模式则为[0.1,0.1,......,0.1,0.1],当商品的价格发生变化时就会打破原有的这种模式。(注:实际中由于各类促销活动的存在,每个商品序列的模式也都会有所差异,拥有自身的模式)

3、序列片段

在这里插入图片描述

针对时序流的异常检测,在前面第三段异常定义内容中提到了“ 序列片段 ”检测的概念,这个序列片段主要涉及“ 窗口的大小 ”和“ 时间点粒度 ”两个因素。窗口的大小,主要指窗口内包含的数据点个数,时间点粒度数据则主要指根据分钟、小时或天级别等时间维度聚合而来的数据。不同窗口大小和时间点粒度的序列片段覆盖范围不同,捕获的异常类型也会有所不同。 如上图所示,[A-D] 序列片段,覆盖范围包含了一个完整的序列周期,能捕获跨周期类的异常,而周期内的局部异常则可能被掩盖;[B-C] 序列片段,覆盖范围小很多,能捕获序列周期内的局部异常,但跨周期类的异常则不易捕获。因此,如果异常需要都捕获,就需要将两类序列片段的数据,按窗口大小一致的方法,进行多维时序流的异常检测。

在时序流中,这种异常检测流程方法的实现,一般可以通过对序列片段范围进行时间点的持续滑动,不断学习正常的序列模式,进行记忆储存的更新,当异常模式的序列片段出现时,通过对比与正常序列模式的差异,从而及时有效的发现异常。基于此,本文也提出了一种基于记忆空间(MemSpace) 的方法来实现。

4、示例(单维度)

自隔离机制的方法支持多维时序流数据的输入,为了便于理解其基本计算过程,采用了单维度的示例进行计算过程的演示,如下:

在这里插入图片描述

五、记忆空间(memSpace)

在这里插入图片描述

记忆空间(MemSpace)是由一系列的记忆模块(MemBlock)组成,每一个记忆块都有与之对应的索引(memKey),通过HashMap\<memKey, MemBlock>的方式进行存储,主要功能是最大化记录历史正常的序列模式。相关内部处理逻辑如下:

1、索引编码

在这里插入图片描述

在这里插入图片描述

2、检索器(Retriever)

1)索引树构造

基于序列模式索引数据集进行索引树(indexTree)的构建,基本算法逻辑如下:

1.初始化一个空的根节点集Nodes,基本结构Map\<int,subNodes>。

2.循环遍历索引编码,获取第i个元素,当前节点集包含元素时,则直接获取对应的节点,当不包含元素时,则新创建一个对应的节点。

3.结束遍历,完成索引树的构造及更新。

以上1\~3步骤涉及整个初始化过程,而在streaming数据流下对索引

的更新只涉及第2个步骤。

2)最近邻检索

Kt′​=Qurey(Kt​)

基于序列模式索引Kt​进行最近邻检索,找出最相近的记忆块的索引Kt′,基本算法逻辑如下:

1.初始化一个空的Kt′,Shape大小与Kt相同。

2.for循环遍历索引编码Kt,获取第i个元素ki;

3.基于索引树(IndexTree)的当前节点,匹配k距离最小的子节点Nodei;

4.基于Nodei记录节点信息ki′,写入Kt′;

5.结束遍历,输出Kt′。

3、获取记忆块

通过检索到索引

在这里插入图片描述

4、更新机制(Updater)

记忆空间(MemSpace)的主要功能是最大化记录历史正常序列模式的样本,而异常序列样本则进行剔除。以下是两种涉及样本更新的场景。

1)正常样本更新(update)

在记忆模块(memBlock)容量(cmb)有限的情况下,对正常样本基于最大相似匹配的原则进行更新,保持最大化信息记忆。主要逻辑如下:

在这里插入图片描述

2)标记样本反馈(feedback)

对于序列数据上表现出异常的点或片段,有可能不一定是实际业务场景关注的那类异常时,我们把这种异常称之为“假异常”,此时,无论是这种“假异常” 还是真实的异常,都可以与预警消费的用户人群通过交互的方式进行标注反馈,从而进行记忆空间的更新。主要逻辑如下:

在这里插入图片描述

六、评分器(Scorer)

概念漂移(concept drift),主要指同一数据源下,数据分布随时间发生变化的情况。此时,重构误差的范围也将变大,如果异常检测的模型或策略没有适应此种变化,则可能会持续判断结果为异常。除了数据流存在概念漂移的情况,不同数据源分布之间,依然存在重构误差范围不一致的问题,导致应用层受限,缺乏相对稳定阈值(threshold)的判定,即没有相对统一的标准化处理结果。 因此,此处评分器的作用就是需要对误差评分进行标准化。

1、异常水位线

为了进行标准化处理,这里涉及一种异常水位线的概念,低于水位线的正常(安全区域),高于水位线则异常(潜在风险区域),高出水位线越多,异常程度越大(风险概率越高)。 以下是数据流(Streaming)下自适应水位线的在线更新逻辑:

在这里插入图片描述

2、异常评分

基于异常水位线进行异常评分的标准化处理,采用基于tanh的激活函数进行0\~1映射,相关逻辑如下:

AnomalyScore=tanh(ω∗ℓt−1​st​​)

st​: 代表t时刻的最小重构误差评分。ω:异常评分标准化处理的映射系数(ω=0.1),当映射系数为0.1,异常水位线对应的评分在0.1左右。

在这里插入图片描述

如上表格所示,字体标红处即为标准化处理后对应的异常水位线,此时异常水位线的评分接近0.1。即评分低于0.1属于安全区域,高于0.1的属于异常区域,分值越大,异常风险概率越高。



七、解决方案

在这里插入图片描述

如何及时发现序列模式的异常、适应数据分布变化(概念漂移),并能快速接入和大批量落地应用,是时序流异常检测场景需要重点解决的问题,本文的核心逻辑就是基于自隔离机制流(Self-isolation Stream)的解决方案,如上图所示,包含了两种实现方案,第一种(Option1)是基于记忆空间(MemSpace)的自隔离机制流,第二种(Option2)是基于自编码器(AutoEncoder),由于在实际应用测试过程中,基于记忆空间的方案更轻量级,且在大批量落地应用层面更具有优势,本文将主要基于记忆空间的方案进行介绍。

在这里插入图片描述

如上是基于记忆空间的自隔离机制流解决方案,整个流程可看做是一个异常检测器(detector)的实现过程,每一个接入的指标或业务场景,都有一个与之对应的独有token,每一个token都有一个对应的异常检测器,这个异常检测器的基本流程实现步骤如下:

第一步:初始化记忆空间(MemSpace) 。获取数据流各维度均值μx和标准差σx。基于后续第二到四步过程完成初始化。如果序列数据样本不足,也可以略过,直接从第二步开始,区别生效时间较晚,需要累计一定量的序列输入。

在这里插入图片描述

第二步:时序流数据预处理、统计参数更新,并获取窗口化数据

Zt。输入相关维度的原始序列流X,相关处理步骤如下:

1)Zscore标准化处理。

在这里插入图片描述

X:原始序列流数据,大小(r * d) ,r代表数据流样本记录数,d代码维度大小,r >= n*stride + kernel\_size -1 。Z:Zscore标准化处理后序列流数据,大小(r * d)。

2)均值池化处理。

在这里插入图片描述

Z′:代表池化处理后的数据流。kernel\_size卷积核大小,stride为滑动步长。

3)获取滑动窗口数据。

在这里插入图片描述

Zt​:代表在t时刻向后滑动窗口大小为 n的时间序列,可以是单维度和多维度,大小为n * d,其中n默认设置10,d代表维度大小。

4)数据流参数动态更新。


在这里插入图片描述

zt​:代表t时刻的点数据,大小为(1 * d),和Zt的关系是Zt​=[zt−n+1​,...,zt−1​,zt​]:N代表参与计算估计的样本容量大小。μXt​​:代表t时刻时序流的均值大小。σXt​​:代表t时刻时序流的标准差大小。

第三步:**对窗口片段化数据进行序列pattern的向量化,得到Et。详细过程参考前面第四大块内容,基本过程如下所示:

在这里插入图片描述

第四步:基于Et​进行记忆空间的检索,获取记忆块内数据。详细过程参考前面第五大块内容,基本过程如下所示:

在这里插入图片描述

第五步:获取序列模式的最小误差分

。基本逻辑如下所示:

在这里插入图片描述

第六步:基于评分器(Scorer)获取标准化异常评分。评分逻辑如下所示:

在这里插入图片描述

第七步:基于更新器(Updater)进行记忆空间(MemSpace)更新。满足正常样本条件(AnomalyScore < 0.1 ) 下的更新逻辑如下所示:

在这里插入图片描述

八、应用案例

1、上下文异常

测试背景: 基于合成的正弦波sin数据进行上下文异常类型的检测。

主要维度: 正弦波单维数据,长度1050,周期大小100,异常点构造于[1035,1040] 区间段。



在这里插入图片描述



测试评估: 如上图所示,左右两边分别是基于自编码器(AutoEncoder)和记忆空间(MemSpace)技术框架的检测结果,说明在此两种方案下,基于自隔离机制的方法,均能有效捕获到此类上下文的异常。

2、概念漂移

测试背景: 基于22年论文《MemStream: Memory-Based Streaming Anomaly Detection》中的用于概念漂移评估的合成数据进行采样测试。

主要维度: 基于原始数据,每间隔10个位置进行采样的单一维度数据。

测试评估:



在这里插入图片描述



如上图所示,左边是MemStream论文中的实验效果,右边是基于自隔离机制(self-isolation)后的实验效果,通过对比,能直观的看出通过基于自隔离机制方法,在概念漂移测试数据的效果上更为显著。

3、周期序列检测

测试背景: 基于Mars公开数据集5中序列数据,进行长周期序列(周期性+局部)的异常检测。如下左图所示的周期性异常,主要表现为该周期相对历史周期出现了明显增大的特点,基于序列长周期依赖关系基础上产生的异常。而右图的局部异常则是基于重复该序列末尾8个点数据构造而来。


在这里插入图片描述



主要维度: 原始数据集输入的单维度时序数据+序列末尾8个点数据。

测试一

方法:基于默认序列窗口大小(d\_window = 10) 进行测试评估,测试结果如下:

在这里插入图片描述



结论:当序列窗口大小 = 10 时,只能捕获末尾片段的局部异常,而中间存在长周期性异常无法捕获。

测试二

方法:先消除周期依赖,在进行检测。 为了凸显周期异常的一种方法就是消除周期依赖,而消除依赖的一种方式就是进行池化操作,如下图所示,当对原始序列按照卷积核大小=T进行均值池化的操作后(黄线),这种周期性依赖得到了明显消除,也凸显出了异常。

在这里插入图片描述

在这里插入图片描述



结论:1、当消除周期依赖后,中间周期性异常和末尾的局部异常均有效凸显出来,但均不明显,且整体评分较低(<0.1)。2、另外,由于序列周期T未知时,对于准确获取序列周期T大小会相对复杂,且存在一定代价,不是一个可取方案。

测试三

方法:基于序列窗口大小(d\_window = 10) ,数据流窗口内间隔步长(interval > 10)间隔进行测试评估,覆盖单个周期(T = 100),测试结果如下:


在这里插入图片描述



结论:捕获到了长周期性异常,而末尾局部异常被掩盖,未能捕获到。

测试四

方法:将测试一 + 测试三聚合后的输入进行堆叠,形成多维时序的输入进行检测,测试结果如下:



在这里插入图片描述



结论:长周期性异常和短时局部异常均有效捕获。

综合测试评估: 基于自隔离机制的方法,不仅能捕获局部微小的异常,也能捕获长周期性的异常,取决于输入序列的窗口范围大小,通过基于多维时序流的方式进行检测,也可以同时捕获以上两种类型异常。

4、多维趋势检测



在这里插入图片描述



测试背景: 基于风控一站式巡检(业务健康度)场景,进行异常模式(pattern)的检测,涉及线上业务规则或模型的时序流数据。

主要维度: 1分钟请求量、1分钟命中量两个维度。

测试评估: 如上图所示,左右两边分别是基于自编码器(AutoEncoder)和记忆空间(MemSpace)技术框架的检测结果。原始序列流中,命中量随着请求量数据上升或下降趋势的变化而变化,当在末尾处,这种关联的趋势发生了明显改变,请求量出现急剧下降时,命中量却出现了明显的上升趋势变化,此时异常评分均较高,说明基于自隔离机制的方法,也能有效检测这种多维时序的趋势变化,对比历史趋势,属于异常模式(pattern)。

5、价格风险案例

案例背景: 历史价格风险案例中,A商品因每满减促销叠加多张券导致低价风险事件,累计损失50W+。

主要维度:5分钟的平均成交价、5分钟订单量、5分钟的商品毛利三个维度。

正常数据流(初始化): 基于发生价格风险事件的商品,过去一天的正常销售数据进行算法模型的初始化,总计256个样本数据,其正常数据流的序列分布如下:

在这里插入图片描述



风险事件数据流(口径:含当日+前一日)

在这里插入图片描述

算法风险评估:


在这里插入图片描述

如上图所示,灰圈处刚好超过异常水位线0.1,对应时间是在凌晨2\~3点间,而叠加券在0点时间生效,此时订单量比较小,但平均成交价已经低至12.75,说明此时已有小部分用户发现了券叠加引起商品超低价售卖的情况,最终在当日下午4点(红圈处)开始爆发。



在这里插入图片描述



红圈处****序列模式的异常达到最高,此时进行干预,该商品累计损失在2500以内,而实际亏损额达到50W+,涉及订单量2W+。详细数据如下表所示:



在这里插入图片描述



很多传统的异常检测方法,基本都是基于全局的角度出发,都是处在亏损高点时最异常,缺乏了基于时序流的上下文信息,同时也反应了本技术方案能够更早的发现时序流中序列模式的异常变化情况

6、实验评估

基于24年论文《Breaking the Time-Frequency Granularity Discrepancy in Time-Series Anomaly Detection》中提供5种异常类型的公开数据集进行F1的实验效果评估测试,相关评估结果如下:

在这里插入图片描述



如上,5种异常类型测试数据集,可区分为2大类,其中Global、Contextual为点异常(point),Shapelet、Seasonnal和Trend为模式异常(Pattern),可以看出基于自隔离机制(Self-Isolation)的方法,在5类数据集上的评估结果均达到了不错的效果,其中3个模式类异常(Pattern)基准数据集的baseline得到大幅提升,也再次说明了基于自隔离机制的方法在序列模式异常检测领域上的有效性和突破。

实验过程中序列片段的可视化检测结果如下:

在这里插入图片描述

九、经验总结

本文提出的一种基于自隔离机制(self-isolation)+ 记忆空间(memSpace)的时序流异常检测技术解决方案,在模式异常(Pattern Anomaly)、长时记忆(long-term memory)、概念漂移(Concept Drift)方面的实验都表现出了不错的效果。

其中自隔离机制(self-isolation)属于时间序列模式的一种表征方法,能及时捕获序列模式的异常变化,大大提升了序列Pattern异常模式检测的效果,具备早期检测的能力,同时天然适应一些概念漂移的场景;记忆空间提供了序列模式长时记忆的功能,单个场景可储存序列模式较少,属于轻量级,且整体框架简单,易实现,具备高可用性的特点,能大批量支持不同时序流场景的异常检测需求。目前在风控一站式业务巡检的测试中,整体无效预警量减少70% 以上。



十、未来展望

风控安全作为企业最坚固的一道防线,没有强有力的技术支撑,是很难做到稳如磐石。而异常检测(Anomaly detection)技术作为其中的一项关键技术,为及时感知、降低和规避企业风险,起到了重要性的作用。 未来也可以借助一些平台化的能力,进行指标级、或场景化异常检测需求的快速接入,最大化异常检测技术 “隐形守护者”的作用。



结束语:本文属于校企合作的产物,是基于川大学子论文方法思想上进行的创新性探索和思考,目前技术方案在企业的实际应用中也还存在较多提升空间,欢迎对异常检测(Anomaly detection)或对本篇文章技术感兴趣同事一起交流,提升和完善技术方案,发挥其最大的应用价值。



参考文献:

[1] Nam, Y., Yoon, S., Shin, Y., Bae, M., Song, H., Lee, J. G., & Lee, B. S. (2024). Breaking the Time-Frequency Granularity Discrepancy in Time-Series Anomaly Detection. In WWW 2024 - Proceedings of the ACM Web Conference (pp. 4204-4215).

[2] MemStream: Memory-Based Streaming Anomaly Detection. Siddharth Bhatia, Arjit Jain, Shivin Srivastava,Kenji Kawaguchi, Bryan Hooi. The Web Conference (formerly WWW), 2022.

[3] Xu J. Anomaly transformer: Time series anomaly detection with association discrepancy[J]. arxiv preprint arxiv:2110.02642, 2021.

[4] Sudipto Guha, Nina Mishra,Gourav Roy, and Okke Schrijvers. "Robust random cut forest based anomaly detection on streams." In International Conference on Machine Learning, pp. 2712-2721. 2016

[5] Liu, F. T., Ting, K. M., Zhou,Z.-H., 2012. Isolation-based anomaly detection. ACM Transactions on Knowledge Discovery from Data (TKDD) 6 (1), 3.


京东云开发者
3.4k 声望5.4k 粉丝

京东云开发者(Developer of JD Technology)是京东云旗下为AI、云计算、IoT等相关领域开发者提供技术分享交流的平台。