【问题标题】:OHCL Time Series - Anomaly Detection with Multivariate Gaussian DistributionOHCL 时间序列 - 多元高斯分布的异常检测
【发布时间】:2013-03-31 18:32:19
【问题描述】:

我有一些股票价格的 OHLC 时间序列:

library(quantmod)
library(mnormt)
library(MASS)

download.file("http://dl.dropbox.com/u/25747565/941.RData", destfile="test.RData")
load("test.RData")
chartSeries(p)

从图中可以看出,有两个向下的尖峰,很可能是由于某种数据错误。我想使用多元高斯来检测包含这两个违规数据点的行。

> x[122,]
 941.Open  941.High   941.Low 941.Close 
    85.60     86.65      5.36     86.20 
> x[136,]
 941.Open  941.High   941.Low 941.Close 
    84.15     85.60     54.20     85.45 

这是我的代码来拟合分布并计算每个数据点的概率:

x <- coredata(p[,1:4])
mu <- apply(x, 2, mean)
sigma <- cov.rob(x)$cov
prob <- apply(x, 1, dmnorm, mean = mu, varcov = sigma, log = TRUE)

但是,此代码引发以下错误:

Error in pd.solve(varcov, log.det = TRUE) : x appears to be not symmetric

当我使用标准的cov()函数计算协方差矩阵时没有出现这个错误,而只是使用了Robust协方差矩阵函数。协方差矩阵本身对我来说看起来很温和,所以我不确定发生了什么。我想使用协方差矩阵的稳健估计的原因是因为标准协方差矩阵给出了一些误报,因为我在训练集中包含了异常。

谁能告诉我:

a) 如何解决这个问题

b) 如果这种方法甚至有意义

谢谢!

附:我考虑在 Cross Validated 上发布此内容,但认为 SO 更合适,因为这似乎是一个“编程”问题。

【问题讨论】:

    标签: r gaussian


    【解决方案1】:

    你走对了。我不知道如何解决这个错误,但我可以建议你如何找到新点的索引。

    1. 您的训练数据可能存在少量异常,否则交叉验证和测试结果会受到影响
    2. 在 MATLAB 中计算均值和协方差 作为

         mu=mean(traindata);
         sigma=cov(traindata);
      
    3. 根据您的要求设置 epsilon

      count=0;
        Actual=[];
        for j=1:size(cv,1)
          p=mvnpdf(cv(j,:),mu,sigma);
            if p<eplison
              count=count+1;
              Actual=[Actual;j];
                 fprintf('j=%d \t p=%e\n',j,p);
           end
      end
      
    4. 如果结果不满意则调整阈值

    5. 使用 F-1 分数评估模型(如果 F-1 分数为 1,您做对了)
    6. 将模型应用于测试数据
    7. 完成!

    【讨论】:

      猜你喜欢
      • 2021-02-19
      • 1970-01-01
      • 2015-07-23
      • 2019-10-13
      • 2022-01-11
      • 2018-06-17
      • 2020-09-04
      • 2018-07-11
      • 2017-11-24
      相关资源
      最近更新 更多