isanomaly
構文
説明
は、tf = isanomaly(LOFObj,Tbl)LocalOutlierFactor オブジェクト LOFObj を使用して table Tbl 内の異常を検出し、Tbl の対応する行で異常が検出された場合に要素が true になる logical 配列 tf を返します。関数 lof に table を渡して LOFObj を作成した場合、この構文を使用する必要があります。
では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、tf = isanomaly(___,Name=Value) にすると、スコアが scoreThreshold=0.50.5 を超える観測値が isanomaly で異常として識別されます。
例
関数 lof を使用して、汚染されていない学習観測値用の LocalOutlierFactor オブジェクトを作成します。次に、オブジェクトおよび新規データをオブジェクト関数 isanomaly に渡して、新規性 (新規データ中の異常) を検出します。
census1994.mat に保存されている 1994 年の国勢調査データを読み込みます。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するための、米国勢調査局の人口統計データから構成されます。
load census1994census1994 には学習データ セット adultdata およびテスト データ セット adulttest が含まれています。LocalOutlierFactor オブジェクトに学習させるには、予測子データはすべて連続、またはすべて categorical のいずれかでなければなりません。adultdata および adulttest から非数値変数を削除します。
adultdata = adultdata(:,vartype("numeric")); adulttest = adulttest(:,vartype("numeric"));
adultdata 用に局所外れ値因子モデルに学習させます。adultdata には外れ値が含まれていないと仮定します。
[Mdl,tf,s] = lof(adultdata);
Mdl は LocalOutlierFactor オブジェクトです。lof は、学習データ adultdata の異常インジケーター tf および異常スコア s も返します。名前と値の引数 ContaminationFraction を 0 を超える値として指定していない場合、lof はすべての学習観測値を正常な観測値として扱います。つまり tf の値はすべて logical 0 (false) となります。この関数によりスコアのしきい値が最大のスコア値に設定されます。しきい値を表示します。
Mdl.ScoreThreshold
ans = 28.6719
学習済みの局所外れ値因子モデルを使用して、adulttest 内の異常を見つけます。
[tf_test,s_test] = isanomaly(Mdl,adulttest);
関数 isanomaly は、adulttest の異常インジケーター tf_test およびスコア s_test を返します。既定では、isanomaly はしきい値 (Mdl.ScoreThreshold) を超えるスコアをもつ観測値を異常として識別します。
異常スコア s および s_test のヒストグラムを作成します。異常スコアのしきい値に垂直線を作成します。
h1 = histogram(s,NumBins=50,Normalization="probability"); hold on h2 = histogram(s_test,h1.BinEdges,Normalization="probability"); xline(Mdl.ScoreThreshold,"r-",join(["Threshold" Mdl.ScoreThreshold])) h1.Parent.YScale = 'log'; h2.Parent.YScale = 'log'; legend("Training Data","Test Data",Location="north") hold off

テスト データ中にある異常の観測値のインデックスを表示します。
find(tf_test)
ans = 0×1 empty double column vector
テスト データの異常スコア分布は学習データの異常スコア分布と類似しているため、isanomaly は既定のしきい値でテスト データ中にある異常を検出しません。名前と値のペア ScoreThreshold を使用して、異なるしきい値を指定できます。例については、異常スコアのしきい値の指定を参照してください。
isanomaly の名前と値の引数 ScoreThreshold を使用して、異常スコアのしきい値を指定します。
census1994.mat に保存されている 1994 年の国勢調査データを読み込みます。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するための、米国勢調査局の人口統計データから構成されます。
load census1994census1994 には学習データ セット adultdata およびテスト データ セット adulttest が含まれています。
adultdata および adulttest から非数値変数を削除します。
adultdata = adultdata(:,vartype("numeric")); adulttest = adulttest(:,vartype("numeric"));
adultdata 用に局所外れ値因子モデルに学習させます。
[Mdl,tf,scores] = lof(adultdata);
スコア値のヒストグラムをプロットします。既定のスコアのしきい値の位置に垂直線を作成します。
h = histogram(scores,NumBins=50,Normalization="probability"); h.Parent.YScale = 'log'; xline(Mdl.ScoreThreshold,"r-",join(["Threshold" Mdl.ScoreThreshold]))

学習済みの局所外れ値因子モデルを使用して、テスト データ内の異常を見つけます。局所外れ値因子モデルの学習時に取得された既定のしきい値とは異なるしきい値を使用します。
まず、関数isoutlierを使用してスコアのしきい値を調べます。
[~,~,U] = isoutlier(scores)
U = 1.1567
名前と値の引数 ScoreThreshold の値を U として指定します。
[tf_test,scores_test] = isanomaly(Mdl,adulttest,ScoreThreshold=U); h = histogram(scores_test,NumBins=50,Normalization="probability"); h.Parent.YScale = 'log'; xline(U,"r-",join(["Threshold" U]))

外れ値が含まれている標本データ セットを生成します。関数 isanomaly を使用して標本データの周りの点の異常スコアを計算し、異常スコアの等高線図を作成します。次に、適合率-再現率曲線をプロットして、学習済みの局所外れ値モデルの性能をチェックします。
ガウス型コピュラを使用して、二変量分布からランダムなデータ点を生成します。
rng("default") rho = [1,0.05;0.05,1]; n = 1000; u = copularnd("Gaussian",rho,n);
無作為に選択された 5% の観測値にノイズを追加して、それらの観測値を外れ値にします。
noise = randperm(n,0.05*n); true_tf = false(n,1); true_tf(noise) = true; u(true_tf,1) = u(true_tf,1)*5;
関数 lof を使用して局所外れ値因子モデルに学習させます。学習観測値に含まれている異常の比率を 0.05 に設定します。パフォーマンス向上のために、SearchMethod、NumNeighbors、Distance などの名前と値の引数を指定して、局所外れ値因子アルゴリズムのオプションを変更することもできます。ここでは、使用する最近傍の個数を 40 と指定します。
[LOFObj,tf,scores] = lof(u,ContaminationFraction=0.05,NumNeighbors=40);
学習済みの局所外れ値因子モデルと関数 isanomaly を使用して、学習観測値の周りの 2 次元グリッド座標の異常スコアを計算します。
l1 = linspace(min(u(:,1),[],1),max(u(:,1),[],1)); l2 = linspace(min(u(:,2),[],1),max(u(:,2),[],1)); [X1,X2] = meshgrid(l1,l2); [~,scores_grid] = isanomaly(LOFObj,[X1(:),X2(:)]); scores_grid = reshape(scores_grid,size(X1,1),size(X2,2));
学習観測値の散布図と異常スコアの等高線図を作成します。真の外れ値と lof で検出された外れ値にフラグを付けます。
idx = setdiff(1:1000,noise); scatter(u(idx,1),u(idx,2),[],[0.5 0.5 0.5],".") hold on scatter(u(noise,1),u(noise,2),"ro","filled") scatter(u(tf,1),u(tf,2),60,"kx",LineWidth=1) contour(X1,X2,scores_grid,"ShowText","on") legend(["Normal Points" "Outliers" "Detected Outliers"],Location="best") colorbar hold off

適合率-再現率曲線をプロットし、曲線の下の領域 (AUC) の値を計算して、学習済みの局所外れ値因子モデルの性能をチェックします。rocmetricsオブジェクトを作成します。rocmetrics では、既定では偽陽性率と真陽性率 (つまり再現率) が計算されます。名前と値の引数 AdditionalMetrics を指定して、適合率の値 (つまり陽性の予測値) を追加で計算します。
rocObj = rocmetrics(true_tf,scores,true,AdditionalMetrics="PositivePredictiveValue");rocmetrics の関数 plot を使用して曲線をプロットします。"y" 軸のメトリクスを適合率 (つまり陽性の予測値)、"x" 軸のメトリクスを再現率 (つまり真陽性率) として指定します。LOFObj.ScoreThreshold に対応するモデル操作点に塗りつぶされた円を表示します。関数 trapz の台形法を使用して適合率-再現率曲線の下の領域を計算し、その値を凡例に表示します。
r = plot(rocObj,YAxisMetric="PositivePredictiveValue",XAxisMetric="TruePositiveRate"); hold on idx = find(rocObj.Metrics.Threshold>=LOFObj.ScoreThreshold,1,'last'); scatter(rocObj.Metrics.TruePositiveRate(idx), ... rocObj.Metrics.PositivePredictiveValue(idx), ... [],r.Color,"filled") xyData = rmmissing([r.XData r.YData]); auc = trapz(xyData(:,1),xyData(:,2)); legend(join([r.DisplayName " (AUC = " string(auc) ")"],""),"true Model Operating Point") xlabel("Recall") ylabel("Precision") title("Precision-Recall Curve") hold off

入力引数
学習済みの局所外れ値因子モデル。LocalOutlierFactor オブジェクトとして指定します。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。
例: CacheSize=5000,ScoreThreshold=0.3 は、5000 メガバイトのサイズのグラム行列を使用し、スコアが 0.3 を超える観測値を異常として識別します。
メガバイト単位のグラム行列のサイズ。正のスカラーまたは "maximal" として指定します。グラム行列の定義については、アルゴリズムを参照してください。関数 isanomaly では、関数 lof の名前と値の引数 Distance が "fasteuclidean" の場合にグラム行列を使用できます。
CacheSize が "maximal" の場合、isanomaly は MT 行 MX 列のサイズの中間行列全体に十分なメモリを割り当てようと試みます。ここで、MT は LOFObj の学習データの行数、MX は入力データ X または Tbl の行数です。CacheSize は、中間行列全体に対して十分な大きさである必要はありませんが、少なくとも MX 行 1 列のベクトルを保持する十分な大きさでなければなりません。そうでない場合、isanomaly は "euclidean" 距離を使用します。
Distance が "fasteuclidean" の場合、CacheSize の値が大きすぎるか "maximal" であると、利用可能なメモリを超えるグラム行列の割り当てが isanomaly で試行されることがあります。この場合、MATLAB® はエラーを生成します。
例: CacheSize="maximal"
データ型: double | char | string
異常スコアのしきい値。非負のスカラーとして指定します。isanomaly は、スコアがこのしきい値を超える観測値を異常として識別します。
既定値は、LOFObj の ScoreThreshold プロパティ値です。
例: ScoreThreshold=0.5
データ型: single | double
出力引数
異常インジケーター。logical 列ベクトルとして返されます。tf の要素は、Tbl または X の対応する行の観測値が異常であれば true、それ以外の場合は false になります。tf の長さは Tbl または X と同じです。
isanomaly は、scores がしきい値 (ScoreThreshold の値) を超える観測値を異常として識別します。
詳細
局所外れ値因子 (LOF) アルゴリズムでは、周囲の近傍に対する観測値の相対的な密度に基づいて異常を検出します。
このアルゴリズムでは、観測値の k 最近傍を探索し、観測値とその近傍の局所到達可能性密度を計算します。局所外れ値因子は、観測値とその近傍の平均密度比です。つまり、観測値 p の局所外れ値因子は次のようになります。
ここで
lrdk(·) は、観測値の局所到達可能性密度です。
Nk(p) は、観測値 p の k 最近傍を表します。名前と値の引数
IncludeTiesをtrueに指定して k 番目に小さい距離値の近傍をすべて含めるか、falseに指定して正確に k 個の近傍を含めることができます。効率性能を高めるため、lofのIncludeTiesの既定値はfalseです。[1]のアルゴリズムではすべての近傍が使用されることに注意してください。|Nk(p)| は Nk(p) 内の観測値数です。
正常な観測値の場合、局所外れ値因子の値は 1 未満かそれに近い値で、観測値の局所到達可能性密度がその近傍より高いか同等であることを示します。局所外れ値因子の値が 1 より大きい場合は、異常の可能性を示します。局所外れ値因子の値のしきい値は、lof の ContaminationFraction 引数と isanomaly の ScoreThreshold 引数で制御します。
このアルゴリズムでは、到達可能性距離に基づいて密度を測定します。観測値 o に対する観測値 p の到達可能性距離は次のように定義されます。
ここで
dk(o) は、観測値 o からその近傍までの距離の中で k 番目に短い距離です。
d(p,o) は、観測値 p と観測値 o の間の距離です。
このアルゴリズムでは、到達可能性距離を使用して、観測値 o に近い観測値の d(p,o) の統計変動を低減します。
観測値 p の局所到達可能性密度は、観測値 p からその近傍までの平均到達可能性距離の逆数です。
重複の数が近傍の数 (k) より大きい場合、密度値は無限大になる可能性があります。そのため、学習データに重複が含まれている場合、関数 lof と関数 isanomaly では加重局所外れ値因子 (WLOF) アルゴリズムが使用されます。このアルゴリズムでは、加重局所到達可能性密度 (wlrd) を使用して加重局所外れ値因子を計算します。
ここで
w(o) は、学習データに含まれている観測値 o の重複の数です。重みの値を計算した後、このアルゴリズムでは重複の各セットが 1 つの観測値として扱われます。
アルゴリズム
TblまたはXの各観測値について局所外れ値因子の値 (scores) を計算するために、isanomalyは、LocalOutlierFactorオブジェクトのXプロパティに格納されている学習観測値の中から k 最近傍を探索します。isanomalyは、Tblに含まれているNaN、''(空の文字ベクトル)、""(空の string)、<missing>、<undefined>の値とXに含まれているNaN値を欠損値と見なします。isanomalyは、欠損値のある観測値は使用しません。isanomalyは、欠損値のある観測値に異常スコアNaNおよび異常インジケーターfalse(logical 0) を割り当てます。
参照
[1] Breunig, Markus M., et al. “LOF: Identifying Density-Based Local Outliers.” Proceedings of the 2000 ACM SIGMOD International Conference on Management of Data, 2000, pp. 93–104.
バージョン履歴
R2022b で導入MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)