高次元データに対してもロバストな外れ値検出アルゴリズムである、Angle-Based Outlier Detection法のMATLABでの実装を以下に示します。
ABOD法とはベクトル同士のなす角を利用した外れ値検出手法です。
ある点からすべての組み合わせのある二点へのベクトルのなす角のバラつきを求めています。
したがってその分散の値が小さな値であるほど、その点が外れ値であることになります。
なお、計算量が$O(dn^3)\ \ \ [d=dimension,n=number\ of\ rows]$ となっており、nの値が増えるとかかる時間が激増しますので、あまり大きなデータに対しては適用しにくい感があります。
2015-11-17追記
下記のコードに重大な誤りがある可能性がありますので、使用しないでください。申し訳ありません。
→誤りはありませんでした
abod.m
function [abof] = abod(X)
n = size(X);
d = n(2);
n = n(1);
res = zeros(n,1);
for i = 1:n
Y = X - repmat(X(i,:),n,1);
temp = Y.^2;
s = sum(temp,2);
s = repmat(s,1,d);
Y = Y./s;
Y(isnan(Y))=0;
res(i) = compAngvar(Y);
end
abof = res;
end
function [anglevar] = compAngvar(Y)
tmp = Y * Y';
s = tril(tmp,-1);
[r,c,v] = find(s);
anglevar = var(v);
end