我有一系列传感器(大约 4k),每个传感器将测量每个点的幅度。假设我用足够的 4k 值(N * 4k 形状)训练神经网络。机器将在一系列值中找到一个模式。如果值偏离模式(即异常),它可以检测到该点,并能够说异常在第'X'个传感器中。这可能吗.如果是这样,我应该使用什么样的神经网络?
在一组连续数据中通过模式匹配发现异常检测
在不知道数据类型和生成过程的情况下,很难给出明确的答案。一般来说,我会尝试一个将实际传感器读数作为输入并输出预期读数的网络。您可以通过将错误添加为输入的数据和正确的读数作为输出来训练该网络。它应该学会从一组实际读数中猜测正确的(非异常)读数,并且您可以通过获取实际读数和预测读数之间的差异来找到有异常的传感器。根据您预期的异常类型(误读,例如侥幸零值或最大值,或实际被测量系统的异常状态),您的训练数据应设置为包含此类异常的样本。如果存在时间相关性(例如,温度读数变化缓慢)使用 RNN 可能会有所帮助,但其尺寸在很大程度上取决于测量系统的性质。可以在输入中添加影响系统的外部因素(加热机制的状态、一天/一年中的时间等)以进行更好的预测。归根结底,反复试验是您的朋友。从一个简单的网络开始,看看它的表现如何。当您看到简单解决方案的局限性时,请选择更复杂的网络。
无需使用神经网络,只需从每个传感器中尽可能多地采样非异常读数即可。如果来自每个传感器的读数分布大致正常(检查来自每个传感器的样本的偏斜和峰度值),那么您可以计算出样本的平均值和标准偏差,对于任何未来的样本,特定的值正态概率分布的测量。
(如果您的测量没有正态分布,那么您通常可以对数据应用某种变换使其正常)。
因此,假设您已经为您的一个传感器测量了几千个典型样本,确认分布是正态的,并计算了这些样本的平均值和标准偏差。您现在可以计算新样本“x”在正态曲线上的位置:
def gaussian(x, mean, std):
# check for very small standard deviations
if(2 * std ** 2 == 0):
return 0.0
return (1.0/(math.sqrt(2*math.pi) * std)) * math.exp(-((x-mean)**2)/(2*std**2))
此时,您可以决定该分布上的特定测量值是否太低以至于异常,并通知用户。
现在,您可能已经意识到,确切地计算出一个值应该被视为异常的程度可能很棘手,而且您是对的。解决方案是查看您是否可以获得一些真正的异常数据并使用它来设置阈值。显然,如果您有 4000 个独立传感器,这可能是一项相当艰巨的工作……
如果您想了解有关异常检测的更多信息,那么我建议您查看Andrew Ng 的介绍性讲座系列。