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 census1994
census1994
には学習データ セット 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 = 0x1 empty double column vector
テスト データの異常スコア分布は学習データの異常スコア分布と類似しているため、isanomaly
は既定のしきい値でテスト データ中にある異常を検出しません。名前と値のペア ScoreThreshold
を使用して、異なるしきい値を指定できます。例については、異常スコアのしきい値の指定を参照してください。
異常スコアのしきい値の指定
isanomaly
の名前と値の引数 ScoreThreshold
を使用して、異常スコアのしきい値を指定します。
census1994.mat
に保存されている 1994 年の国勢調査データを読み込みます。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するための、米国勢調査局の人口統計データから構成されます。
load census1994
census1994
には学習データ セット 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
入力引数
LOFObj
— 学習済みの局所外れ値因子モデル
LocalOutlierFactor
オブジェクト
学習済みの局所外れ値因子モデル。LocalOutlierFactor
オブジェクトとして指定します。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: CacheSize=5000,ScoreThreshold=0.3
は、5000 メガバイトのサイズのグラム行列を使用し、スコアが 0.3 を超える観測値を異常として識別します。
CacheSize
— メガバイト単位のグラム行列のサイズ
1000
(既定値) | 正のスカラー | "maximal"
メガバイト単位のグラム行列のサイズ。正のスカラーまたは "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
ScoreThreshold
— 異常スコアのしきい値
LOFObj.ScoreThreshold
(既定値) | 非負のスカラー
異常スコアのしきい値。非負のスカラーとして指定します。isanomaly
は、スコアがこのしきい値を超える観測値を異常として識別します。
既定値は、LOFObj
の ScoreThreshold
プロパティ値です。
例: ScoreThreshold=0.5
データ型: single
| double
出力引数
tf
— 異常インジケーター
logical 列ベクトル
異常インジケーター。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 コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)