trybeetle

take it slow!!

anomaly detectionについて


Posted on July 31, 2018, 10:27 p.m.



異常値を検出する手法anomaly detactionについて記載します。
CourseraのMachine Learningコースを元にしています。


データの読み込み

まず、データを読み込みます。今回のデータは、2次元のデータで、training用データXとy、validation用データXvalとyvalを用意します。


    load('ex8data1.mat');

Gaussian Distribution

Gaussian DistributionによりPの値(Probability)を求めます。

まず、muとsigma2を求めます。


    function [mu sigma2] = estimateGaussian(X)
    [m, n] = size(X);
    mu = zeros(n, 1);
    sigma2 = zeros(n, 1);
    mu = 1/m * sum(X',2);
    sigma2 = 1/m * sum((X'- mu).^2 , 2);
    end

    [mu sigma2] = estimateGaussian(X);

続いて、上で求めたmuとsigma2を元にpの値を求めます。


    function p = multivariateGaussian(X, mu, Sigma2)
    k = length(mu);
    if (size(Sigma2, 2) == 1) || (size(Sigma2, 1) == 1)
        Sigma2 = diag(Sigma2);
    endif
    X = bsxfun(@minus, X, mu(:)');
    p = (2 * pi) ^ (- k / 2) * det(Sigma2) ^ (-0.5) * exp(-0.5 * sum(bsxfun(@times, X * pinv(Sigma2), X), 2));
    end

    p = multivariateGaussian(X, mu, sigma2);

データを等高線でグラフ化します。


    function visualizeFit(X, mu, sigma2)
    [X1,X2] = meshgrid(0:.5:35);
    Z = multivariateGaussian([X1(:) X2(:)],mu,sigma2);
    Z = reshape(Z,size(X1));
    plot(X(:, 1), X(:, 2),'bx');
    hold on;
    % Do not plot if there are infinities
    if (sum(isinf(Z)) == 0)
        contour(X1, X2, Z, 10.^(-20:3:0)');
    endif
    xlabel('Latency (ms)');
    ylabel('Throughput (mb/s)');
    hold off;
    end

    visualizeFit(X,  mu, sigma2);

異常値の検出

異常値の検出には、p < ε となる場合に異常値とみなします。正しい異常値判断をするためには、εの値が最適である必要があります。そのため、validation用dataを用い、最適なεの値を求めます。

まず、validationデータでのpの値pvalを求めます。


    pval = multivariateGaussian(Xval, mu, sigma2);

続いて、validationデータの推定値pvalとラベルyvalからF scoreを計算し、最も高いF scoreを記録したエプシロンを最適なεとします。
※Fscore = (2 * Precision * Recall) / (Precision + Recall)


    function [bestEpsilon bestF1] = selectThreshold(yval, pval)
    bestEpsilon = 0;
    bestF1 = 0;
    F1 = 0;
    stepsize = (max(pval) - min(pval)) / 1000;
    for epsilon = min(pval):stepsize:max(pval)
        cvPredictions = (pval < epsilon);
        tp = sum((cvPredictions==1)&(yval==1));
        fp = sum((cvPredictions==1)&(yval==0));
        fn = sum((cvPredictions==0)&(yval==1));
        prec = tp / (tp + fp);
        recall = tp / (tp + fn);
        F1 = (2*prec*recall) / (prec + recall);
        if F1 > bestF1
           bestF1 = F1;
           bestEpsilon = epsilon;
        endif
    endfor
    end

    [epsilon F1] = selectThreshold(yval, pval);

異常値をplot

上記で求めたεと推定値pを比較し、p < ε となるpを異常値として、先に出力したグラフの上に異常値をマーキングします。


    outliers = find(p < epsilon);
    hold on
    plot(X(outliers, 1), X(outliers, 2), 'ro', 'LineWidth', 2, 'MarkerSize', 10);
    hold off

以上です。


Category:ML
Tag: ML Octave
July 31, 2018, 10:27 p.m.

Comments