使用 RPCA 的异常值

Ara*_*orn 7 python statistics machine-learning outliers pca

我阅读了有关使用 RPCA 查找时间序列数据的异常值的信息。我对 RPCA 的基本原理和理论有所了解。我有一个执行 RPCA 的 Python 库,并且几乎有两个矩阵作为输出(L 和 S),输入数据的低秩近似和稀疏矩阵。

输入数据:(行为一天,10 个特征为列。)

DAY 1 - 100,300,345,126,289,387,278,433,189,153  
DAY 2 - 300,647,245,426,889,987,278,133,295,153  
DAY 3 - 200,747,145,226,489,287,378,1033,295,453
Run Code Online (Sandbox Code Playgroud)

获得的输出:

L  
[[ 125.20560531  292.91525518   92.76132814  141.33797061  282.93586313
   185.71134917  199.48789246   96.04089205  192.11501055  118.68811072]  
 [ 174.72737183  408.77013914  129.45061871  197.24046765  394.84366245
   259.16456278  278.39005349  134.0273274   268.1010231   165.63205458]  
 [ 194.38951303  454.76920678  144.01774873  219.43601655  439.27557808
   288.32845493  309.71739782  149.10947628  298.27053871  184.27069609]]

S  
[[ -25.20560531    0.          252.23867186   -0.            0.
   201.28865083   78.51210754  336.95910795   -0.           34.31188928]  
 [ 125.27262817  238.22986086  115.54938129  228.75953235  494.15633755
   727.83543722   -0.           -0.           26.8989769    -0.        ]  
 [   0.          292.23079322   -0.            0.           49.72442192
    -0.           68.28260218  883.89052372    0.          268.72930391]]
Run Code Online (Sandbox Code Playgroud)

推论:(我的问题)

现在我如何推断可以归类为异常值的点。例如。通过查看数据,我们可以说 1033 看起来像一个异常值。S 矩阵中的相应条目是 883.89052372,与 S 中的其他条目相比,它更多。是否可以使用具有固定阈值来查找 S 矩阵条目与输入矩阵中相应原始值的偏差的概念来确定点是异常值吗?还是我完全理解 RPCA 的概念是错误的?TIA 为您提供帮助。

小智 2

您正确理解了稳健 PCA (RPCA) 的概念:稀疏矩阵 S 包含异常值。但是,S 通常会包含许多您自己可能不会将其归类为异常的观察值(非零值)。因此,正如您所建议的,过滤掉这些点是个好主意。

应用固定阈值来识别相关异常值可能适用于一个数据集。然而,如果基础分布的均值和方差发生变化,在许多数据集上使用阈值可能会得到较差的结果。

理想情况下,您计算异常分数,然后根据该分数对异常值进行分类。一种简单的方法(通常用于异常值检测)是查看您的数据点(潜在的异常值)是否位于假设分布的尾部。例如,如果您假设分布是高斯分布,则可以计算 Z 分数 (z):

z = (x-μ)/σ,

其中 μ 是平均值,σ 是标准差。

然后,您可以对计算出的 Z 分数应用阈值,以识别异常值。例如:如果对于给定的观测值 z > 3,则该数据点是异常值。这意味着您的观测值与平均值的标准差超过 3 个,并且位于高斯分布的 0.1% 尾部。与对非标准化值使用阈值相比,此方法对数据变化更加稳健。此外,调整对异常值进行分类的 z 值比为每个数据集查找实际比例值(在您的情况下为 883.89052372)更简单。