使用RPCA的异常值

时间:2016-12-22 19:37:43

标签: python machine-learning statistics pca outliers

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

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

from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option('prefs',{'profile.default_content_setting_values.notifications':1})
driver = webdriver.Chrome(chrome_options=chrome_options)

获得的输出:

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

推断:(我的问题)

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

1 个答案:

答案 0 :(得分:2)

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

应用固定阈值来识别相关异常值可能适用于一个数据集。但是,如果底层分布的均值和方差发生变化,则在许多数据集上使用阈值可能会产生较差的结果。

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

z =(x-μ)/σ,

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

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