lof
構文
説明
関数 lof
は、外れ値の検出と新規性の検出のための局所外れ値因子モデルの作成に使用します。
外れ値検出 (学習データ中の異常を検出) —
lof
の出力引数tf
を使用して、学習データ中の異常を検出します。新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) — 汚染されていない学習データ (外れ値がないデータ) を
lof
に渡してLocalOutlierFactor
オブジェクトを作成します。そのオブジェクトと新規データをオブジェクト関数isanomaly
に渡して、新規のデータの異常を検出します。
は、table LOFObj
= lof(Tbl
)Tbl
の予測子データに対する LocalOutlierFactor
オブジェクトを返します。
では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、LOFObj
= lof(___,Name=Value
)
は、学習データの 10% を異常として処理するように関数に指示します。ContaminationFraction
=0.1
例
関数 lof
を使用して、外れ値 (学習データ中の異常) を検出します。
標本データ セット NYCHousing2015
を読み込みます。
load NYCHousing2015
データ セットには、2015 年のニューヨーク市における不動産の売上に関する情報を持つ 10 の変数が含まれます。データ セットの概要を表示します。
summary(NYCHousing2015)
NYCHousing2015: 91446×10 table Variables: BOROUGH: double NEIGHBORHOOD: cell array of character vectors BUILDINGCLASSCATEGORY: cell array of character vectors RESIDENTIALUNITS: double COMMERCIALUNITS: double LANDSQUAREFEET: double GROSSSQUAREFEET: double YEARBUILT: double SALEPRICE: double SALEDATE: datetime Statistics for applicable variables: NumMissing Min Median Max Mean Std BOROUGH 0 1 3 5 2.8431 1.3343 NEIGHBORHOOD 0 BUILDINGCLASSCATEGORY 0 RESIDENTIALUNITS 0 0 1 8759 2.1789 32.2738 COMMERCIALUNITS 0 0 0 612 0.2201 3.2991 LANDSQUAREFEET 0 0 1700 29305534 2.8752e+03 1.0118e+05 GROSSSQUAREFEET 0 0 1056 8942176 4.6598e+03 4.3098e+04 YEARBUILT 0 0 1939 2016 1.7951e+03 526.9998 SALEPRICE 0 0 333333 4.1111e+09 1.2364e+06 2.0130e+07 SALEDATE 0 01-Jan-2015 09-Jul-2015 31-Dec-2015 07-Jul-2015 2470:47:17
NYCHousing2015
から非数値変数を削除します。変数 BOROUGH
のデータ型は double ですが、これは不動産の所在地の区を示すカテゴリカル変数です。変数 BOROUGH
も削除します。
NYCHousing2015 = NYCHousing2015(:,vartype("numeric"));
NYCHousing2015.BOROUGH = [];
NYCHousing2015
用に局所外れ値因子モデルに学習させます。学習観測値に含まれている異常の比率を 0.01 と指定します。
[Mdl,tf,scores] = lof(NYCHousing2015,ContaminationFraction=0.01);
Mdl
は LocalOutlierFactor
オブジェクトです。lof
は、学習データ NYCHousing2015
の異常インジケーター (tf
) および異常スコア (scores
) も返します。
スコア値のヒストグラムをプロットします。指定した比率に対応するスコアのしきい値に垂直線を作成します。
h = histogram(scores,NumBins=50); h.Parent.YScale = 'log'; xline(Mdl.ScoreThreshold,"r-",["Threshold" Mdl.ScoreThreshold])
異なる汚染の比率 (たとえば 0.05) で異常を識別する場合は、新しい局所外れ値因子モデルに学習させることができます。
[newMdl,newtf,scores] = lof(NYCHousing2015,ContaminationFraction=0.05);
汚染の比率を変更すると異常インジケーターのみが変更され、異常スコアは影響を受けないことに注意してください。したがって、lof
を使用して異常スコアを再度計算しない場合、既存のスコア値で新しい異常インジケーターを取得できます。
学習データ中の異常の比率を 0.05 に変更します。
newContaminationFraction = 0.05;
関数quantile
を使用して、新しいスコアのしきい値を求めます。
newScoreThreshold = quantile(scores,1-newContaminationFraction)
newScoreThreshold = 6.7493
新しい異常インジケーターを取得します。
newtf = scores > newScoreThreshold;
関数 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 = 0×1 empty double column vector
テスト データの異常スコア分布は学習データの異常スコア分布と類似しているため、isanomaly
は既定のしきい値でテスト データ中にある異常を検出しません。名前と値のペア ScoreThreshold
を使用して、異なるしきい値を指定できます。例については、異常スコアのしきい値の指定を参照してください。
入力引数
予測子データ。table として指定します。Tbl
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
予測子データは、すべて連続、またはすべて categorical のいずれかでなければなりません。Tbl
を指定した場合、関数 lof
は、その変数が logical ベクトル、順序付けのない categorical ベクトル、文字配列、string 配列または文字ベクトルの cell 配列のいずれかである場合に、変数を categorical であると見なします。Tbl
に連続値と categorical 値の両方が含まれている場合、Tbl
のすべての予測子を categorical として特定するには、CategoricalPredictors
を "all"
として指定する必要があります。
Tbl
内の変数のサブセットを使用するには、名前と値の引数 PredictorNames
を使用して変数を指定します。
データ型: table
予測子データ。数値行列として指定します。X
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。
予測子データは、すべて連続、またはすべて categorical のいずれかでなければなりません。X
を指定した場合、関数 lof
はすべての予測子が連続的であると見なします。X
のすべての予測子を categorical として特定するには、CategoricalPredictors
を "all"
として指定します。
名前と値の引数 PredictorNames
を使用して X
内の予測子変数に名前を割り当てることができます。
データ型: single
| double
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: SearchMethod=exhaustive,Distance=minkowski
は、ミンコフスキー距離を指定して網羅的探索アルゴリズムを使用します。
Kd 木の葉ノードにおけるデータ点の最大数。正の整数値として指定します。この引数は、SearchMethod
が "kdtree"
である場合のみ有効です。
例: BucketSize=40
データ型: single
| double
メガバイト単位のグラム行列のサイズ。正のスカラーまたは "maximal"
として指定します。グラム行列の定義については、アルゴリズムを参照してください。関数 lof
では、名前と値の引数 Distance
が "fasteuclidean"
の場合にグラム行列を使用できます。
CacheSize
が "maximal"
の場合、lof
は MX
行 MX
列のサイズの中間行列全体に十分なメモリを割り当てようと試みます。ここで、MX
は入力データ X
または Tbl
の行数です。CacheSize
は、中間行列全体に対して十分な大きさである必要はありませんが、少なくとも MX
行 1 列のベクトルを保持する十分な大きさでなければなりません。そうでない場合、lof
は "euclidean"
距離を使用します。
Distance
が "fasteuclidean"
の場合、CacheSize
の値が大きすぎるか "maximal"
であると、利用可能なメモリを超えるグラム行列の割り当てが lof
で試行されることがあります。この場合、MATLAB® はエラーを生成します。
例: CacheSize="maximal"
データ型: double
| char
| string
カテゴリカル予測子フラグ。次のいずれかを指定します。
"all"
— すべての予測子がカテゴリカルです。既定では、lof
は名前と値の引数Distance
にハミング距離 ("hamming"
) を使用します。[]
— カテゴリカル予測子はありません。つまり、すべての予測子が連続的 (数値) です。この場合、Distance
の既定値は"euclidean"
です。
lof
の予測子データは、すべて連続、またはすべて categorical のいずれかでなければなりません。
予測子データが table (
Tbl
) 内にある場合、lof
は、その変数が logical ベクトル、順序付けのない categorical ベクトル、文字配列、string 配列または文字ベクトルの cell 配列のいずれかである場合に、変数を categorical であると見なします。Tbl
に連続値と categorical 値の両方が含まれている場合、Tbl
のすべての予測子を categorical として特定するには、CategoricalPredictors
を"all"
として指定する必要があります。予測子データが行列 (
X
) である場合、lof
はすべての予測子が連続的であると見なします。X
のすべての予測子を categorical として特定するには、CategoricalPredictors
を"all"
として指定します。
lof
は、正の整数値を各カテゴリに割り当てることにより、カテゴリカル変数を数値変数として符号化します。カテゴリカル予測子を使用する場合、必ず適切な距離計量 (Distance
) を使用するようにしてください。
例: CategoricalPredictors="all"
学習データに含まれている異常の比率。範囲 [0,1]
の数値スカラーとして指定します。
ContaminationFraction
の値が 0 (既定) の場合、lof
はすべての学習観測値を正常な観測値として扱い、スコアのしきい値 (LOFObj
のScoreThreshold
プロパティの値) をscores
の最大値に設定します。ContaminationFraction
の値が範囲 (0
,1
] にある場合、lof
は指定された比率の学習観測値が異常として検出されるようにしきい値を決定します。
例: ContaminationFraction=0.1
データ型: single
| double
距離計量。文字ベクトルまたは string スカラーを指定します。
すべての予測子変数が連続 (数値) 変数である場合、次の距離計量のうちの 1 つを指定できます。
値 説明 "euclidean"
ユークリッド距離
"fasteuclidean"
データ点における要素の数が 10 個を超える場合に通常は時間の短縮になるアルゴリズムを使用したユークリッド距離。アルゴリズムを参照してください。
"fasteuclidean"
は"exhaustive"
SearchMethod
にのみ適用されます。"mahalanobis"
マハラノビス距離 — 名前と値の引数
Cov
を使用して、マハラノビス距離の共分散行列を指定できます。"minkowski"
ミンコフスキー距離 — 名前と値の引数
Exponent
を使用して、ミンコフスキー距離の指数を指定できます。"chebychev"
チェビシェフ距離 (最大座標差)
"cityblock"
市街地距離
"correlation"
1 から、観測値間の標本相関を減算 (値の系列として処理)
"cosine"
1 から、ベクトルとして扱われる観測間の夾角の余弦を減算
"spearman"
1 から観測値間の標本スピアマン順位相関係数を減算 (値の系列として処理)
メモ
これらの距離計量のうちの 1 つをカテゴリカル予測子に対して指定している場合、ソフトウェアは、各カテゴリカル予測子を距離計算用の数値変数として扱います。各カテゴリは正の整数で表されます。
Distance
の値は学習済みモデルのCategoricalPredictors
プロパティに影響しません。すべての予測子変数がカテゴリカル変数である場合、次の距離計量のうちの 1 つを指定できます。
値 説明 "hamming"
ハミング距離 (異なる座標の比率)
"jaccard"
1 からジャカード係数 (異なる非ゼロ座標の比率) を減算
メモ
これらの距離計量のうちの 1 つを連続 (数値) 予測子に対して指定している場合、ソフトウェアは、各連続予測子を距離計算用のカテゴリカル変数として扱います。このオプションでは
CategoricalPredictors
の値は変更されません。
すべての予測子変数が連続変数であれば、既定値は "euclidean"
です。すべての予測子変数がカテゴリカル変数であれば、既定値は "hamming"
です。
Kd 木アルゴリズム (
) を使用する場合、SearchMethod
="kdtree"Distance
は "euclidean"
、"cityblock"
、"minkowski"
または "chebychev"
にする必要があります。
さまざまな距離計量の詳細については、距離計量を参照してください。
例: Distance="jaccard"
データ型: char
| string
ミンコフスキー距離指数。正のスカラー値として指定します。この引数は、Distance
が "minkowski"
である場合のみ有効です。
例: Exponent=3
データ型: single
| double
k 番目に小さい距離値の近傍をすべて含めるかどうかを示す同順位使用フラグ。logical 0
(false
) または 1
(true
) を指定します。IncludeTies
が true
である場合、すべての近傍が含まれます。それ以外の場合、正確に k 個の近傍が含まれます。
例: IncludeTies=true
データ型: logical
この プロパティ は読み取り専用です。
予測子変数名。一意な名前の string 配列または一意な文字ベクトルの cell 配列として指定します。PredictorNames
の機能は、予測子データの提供方法によって決まります。
Tbl
を指定した場合、PredictorNames
を使用して使用する予測子変数を指定できます。つまり、lof
は、PredictorNames
の予測子変数のみを使用します。PredictorNames
はTbl.Properties.VariableNames
のサブセットである必要があります。既定では、
Tbl
のすべての予測子変数の名前がPredictorNames
に格納されます。
X
を指定した場合、PredictorNames
を使用してX
内の予測子変数に名前を割り当てることができます。PredictorNames
内の名前の順序は、X
の列の順序に一致しなければなりません。つまり、PredictorNames{1}
はX(:,1)
の名前、PredictorNames{2}
はX(:,2)
の名前であり、他も同様です。また、size(X,2)
とnumel(PredictorNames)
は等しくなければなりません。既定では
PredictorNames
は{"x1","x2",...}
です。
データ型: string
| cell
最近傍探索法。"kdtree"
または "exhaustive"
を指定します。
"kdtree"
— この方法では、Kd 木アルゴリズムを使用して最近傍を探索します。このオプションは、距離計量 (Distance
) が次のいずれかである場合に有効です。"euclidean"
— ユークリッド距離"cityblock"
— 市街地距離"minkowski"
— ミンコフスキー距離"chebychev"
— チェビシェフ距離
"exhaustive"
— この方法では、網羅的探索アルゴリズムを使用して最近傍を探索します。
予測子データの列数が 10 以下で、データがスパースではなく、距離計量 (Distance
) が Kd 木アルゴリズムに対して有効である場合、既定値は "kdtree"
です。それ以外の場合、既定値は "exhaustive"
です。
出力引数
学習済みの局所外れ値因子モデル。LocalOutlierFactor
オブジェクトとして返されます。
オブジェクト関数 isanomaly
で LOFObj
を使用して、新規のデータの異常を見つけることができます。
異常インジケーター。logical 列ベクトルとして返されます。tf
の要素は、Tbl
または X
の対応する行の観測値が異常であれば logical 1
(true
)、それ以外の場合は logical 0
(false
) になります。tf
の長さは Tbl
または X
と同じです。
lof
は、scores
がしきい値 (LOFObj
の ScoreThreshold
プロパティの値) を超える観測値を異常として識別します。関数は、指定された比率 (名前と値の引数 ContaminationFraction
) の学習観測値が異常として検出されるようにしきい値を決定します。
詳細
局所外れ値因子 (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 つの観測値として扱われます。
距離計量は、2 つの観測値の間の距離を定義する関数です。lof
は、連続変数とカテゴリカル変数用のさまざまな距離計量をサポートします。
mx 行 n 列のデータ行列 X (mx 個の 1 行 n 列の行ベクトル x1、x2、...、xmx として扱われる) と、my 行 n 列のデータ行列 Y (my 個の 1 行 n 列の行ベクトル y1、y2、...、ymy として扱われる) が与えられた場合、ベクトル xs と yt の間のさまざまな距離は次のように定義されます。
連続 (数値) 変数の距離計量
ユークリッド距離
ユークリッド距離はミンコフスキー距離の特殊なケース、p = 2 の場合です。
高速ユークリッド距離はユークリッド距離と同じですが、観測値 n における変数の数が 10 個を超える場合に通常は時間の短縮になるアルゴリズムを使用します。アルゴリズムを参照してください。
マハラノビス距離
ここで、C は共分散行列です。
市街地距離
市街地距離はミンコフスキー距離の特殊なケース、p = 1 の場合です。
ミンコフスキー距離
p = 1 という特殊なケースでは、ミンコフスキー距離は市街地距離を与えます。p = 2 という特殊なケースでは、ミンコフスキー距離はユークリッド距離を与えます。p = ∞ という特殊なケースでは、ミンコフスキー距離はチェビシェフ距離を与えます。
チェビシェフ距離
チェビシェフ距離はミンコフスキー距離の特殊なケース、p = ∞ の場合です。
コサイン距離
相関距離
ここで
および
スピアマン距離は、1 から一連の値として扱われる観測値間の標本スピアマン順位相関係数を引きます。
ここで
カテゴリカル変数の距離計量
ハミング距離
ハミング距離は、一致しない座標の比率です。
Jaccard 距離は、1 からジャカード係数 (異なる非ゼロ座標の比率) を引きます。
アルゴリズム
"fasteuclidean"
Distance
では、計算時間の短縮のために追加のメモリを使用してユークリッド距離が計算されます。このアルゴリズムは、Albanie の[2]などで "ユークリッド距離行列トリック" として提唱されているものです。内部テストでは、このアルゴリズムによって予測子の数が 10 個を超える場合に時間の短縮になることが確認されています。"fasteuclidean"
距離ではスパース データはサポートされません。
このアルゴリズムでは、xi と xj のすべての点間の距離の行列 D を求めるために (xi のそれぞれに n 個の変数を格納)、次の方程式の最後の行を使用して距離を計算します。
方程式の最後の行にある行列 は "グラム行列" と呼ばれます。正方化と加算によって平方距離を計算する代わりに、グラム行列を計算して使用すると、一連の平方距離の計算は高速になりますが、数値的安定性は少し低くなります。詳細については、Albanie の[2]を参照してください。
グラム行列を格納するためにソフトウェアで既定で使用されるキャッシュのサイズは 1e3
メガバイトです。キャッシュ サイズは名前と値の引数 CacheSize
を使用して設定できます。CacheSize
の値が大きすぎるか "maximal"
である場合、利用可能なメモリを超えるグラム行列の割り当てが lof
で試行されることがあります。この場合、MATLAB はエラーを生成します。
参照
[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.
[2] Albanie, Samuel. Euclidean Distance Matrix Trick. June, 2019. Available at https://samuelalbanie.com/files/Euclidean_distance_trick.pdf.
バージョン履歴
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)