Main Content

lof

異常検出用の局所外れ値因子モデルの作成

R2022b 以降

    説明

    関数 lof は、外れ値の検出と新規性の検出のための局所外れ値因子モデルの作成に使用します。

    • 外れ値検出 (学習データ中の異常を検出) — lof の出力引数 tf を使用して、学習データ中の異常を検出します。

    • 新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) — 汚染されていない学習データ (外れ値がないデータ) を lof に渡して LocalOutlierFactor オブジェクトを作成します。そのオブジェクトと新規データをオブジェクト関数 isanomaly に渡して、新規のデータの異常を検出します。

    LOFObj = lof(Tbl) は、table Tbl の予測子データに対する LocalOutlierFactor オブジェクトを返します。

    LOFObj = lof(X) は、行列 X の予測子データを使用します。

    LOFObj = lof(___,Name=Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、ContaminationFraction=0.1 は、学習データの 10% を異常として処理するように関数に指示します。

    [LOFObj,tf] = lof(___) は、Tbl または X の対応する行で異常が検出された場合に要素が true になる logical 配列 tf も返します。

    [LOFObj,tf,scores] = lof(___) は、Tbl または X の各観測値についての異常スコア (局所外れ値因子の値) も返します。1 未満かそれに近いスコア値は正常な観測値を示し、1 より大きい値は異常の可能性を示します。

    すべて折りたたむ

    関数 lof を使用して、外れ値 (学習データ中の異常) を検出します。

    標本データ セット NYCHousing2015 を読み込みます。

    load NYCHousing2015

    データ セットには、2015 年のニューヨーク市における不動産の売上に関する情報を持つ 10 の変数が含まれます。データ セットの概要を表示します。

    summary(NYCHousing2015)
    Variables:
    
        BOROUGH: 91446x1 double
    
            Values:
    
                Min          1    
                Median       3    
                Max          5    
    
        NEIGHBORHOOD: 91446x1 cell array of character vectors
    
        BUILDINGCLASSCATEGORY: 91446x1 cell array of character vectors
    
        RESIDENTIALUNITS: 91446x1 double
    
            Values:
    
                Min            0  
                Median         1  
                Max         8759  
    
        COMMERCIALUNITS: 91446x1 double
    
            Values:
    
                Min           0   
                Median        0   
                Max         612   
    
        LANDSQUAREFEET: 91446x1 double
    
            Values:
    
                Min                0
                Median          1700
                Max       2.9306e+07
    
        GROSSSQUAREFEET: 91446x1 double
    
            Values:
    
                Min                0
                Median          1056
                Max       8.9422e+06
    
        YEARBUILT: 91446x1 double
    
            Values:
    
                Min            0  
                Median      1939  
                Max         2016  
    
        SALEPRICE: 91446x1 double
    
            Values:
    
                Min                0
                Median    3.3333e+05
                Max       4.1111e+09
    
        SALEDATE: 91446x1 datetime
    
            Values:
    
                Min       01-Jan-2015
                Median    09-Jul-2015
                Max       31-Dec-2015
    

    NYCHousing2015 から非数値変数を削除します。変数 BOROUGH のデータ型は double ですが、これは不動産の所在地の区を示すカテゴリカル変数です。変数 BOROUGH も削除します。

    NYCHousing2015 = NYCHousing2015(:,vartype("numeric"));
    NYCHousing2015.BOROUGH = [];

    NYCHousing2015 用に局所外れ値因子モデルに学習させます。学習観測値に含まれている異常の比率を 0.01 と指定します。

    [Mdl,tf,scores] = lof(NYCHousing2015,ContaminationFraction=0.01);

    MdlLocalOutlierFactor オブジェクトです。lof は、学習データ NYCHousing2015 の異常インジケーター (tf) および異常スコア (scores) も返します。

    スコア値のヒストグラムをプロットします。指定した比率に対応するスコアのしきい値に垂直線を作成します。

    h = histogram(scores,NumBins=50);
    h.Parent.YScale = 'log';
    xline(Mdl.ScoreThreshold,"r-",["Threshold" Mdl.ScoreThreshold]) 

    Figure contains an axes object. The axes object contains 2 objects of type histogram, constantline.

    異なる汚染の比率 (たとえば 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);

    MdlLocalOutlierFactor オブジェクトです。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

    Figure contains an axes object. The axes object contains 3 objects of type histogram, constantline. These objects represent Training Data, Test Data.

    テスト データ中にある異常の観測値のインデックスを表示します。

    find(tf_test)
    ans =
    
      0x1 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" の場合、lofMXMX 列のサイズの中間行列全体に十分なメモリを割り当てようと試みます。ここで、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 はすべての学習観測値を正常な観測値として扱い、スコアのしきい値 (LOFObjScoreThreshold プロパティの値) を scores の最大値に設定します。

    • ContaminationFraction の値が範囲 (0,1] にある場合、lof は指定された比率の学習観測値が異常として検出されるようにしきい値を決定します。

    例: ContaminationFraction=0.1

    データ型: single | double

    共分散行列。関数によるマハラノビス距離の計算時の共分散行列を表すスカラー値の正定値行列として指定します。この引数は、Distance"mahalanobis" である場合のみ有効です。

    既定値は、関数によって重複する値および欠損値を含む行が除外された後の予測子データ (Tbl または X) から計算された共分散行列です。

    データ型: 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) を指定します。IncludeTiestrue である場合、すべての近傍が含まれます。それ以外の場合、正確に k 個の近傍が含まれます。

    例: IncludeTies=true

    データ型: logical

    局所外れ値因子の値を計算するために探索する予測子データ (Tbl または X) 内の最近傍の個数。正の整数値を指定します。

    既定値は min(20,n-1) です。n は予測子データに含まれている一意の行の数です。

    例: NumNeighbors=3

    データ型: single | double

    この プロパティ は読み取り専用です。

    予測子変数名。一意な名前の string 配列または一意な文字ベクトルの cell 配列として指定します。PredictorNames の機能は、予測子データの提供方法によって決まります。

    • Tbl を指定した場合、PredictorNames を使用して使用する予測子変数を指定できます。つまり、lof は、PredictorNames の予測子変数のみを使用します。

      • PredictorNamesTbl.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" — この方法では、網羅的探索アルゴリズムを使用して最近傍を探索します。

      • 予測子データ (Tbl または X) の局所外れ値因子の値を計算する場合、関数 lof は、予測子データ内のすべての点から予測子データ内の各点までの距離の値を計算することにより、最近傍を探索します。

      • 関数 isanomaly を使用して新しいデータ Xnew の局所外れ値因子の値を計算する場合、この関数は、予測子データ (Tbl または X) 内のすべての点から Xnew 内の各点までの距離の値を計算することにより、最近傍を探索します。

    予測子データの列数が 10 以下で、データがスパースではなく、距離計量 (Distance) が Kd 木アルゴリズムに対して有効である場合、既定値は "kdtree" です。それ以外の場合、既定値は "exhaustive" です。

    出力引数

    すべて折りたたむ

    学習済みの局所外れ値因子モデル。LocalOutlierFactor オブジェクトとして返されます。

    オブジェクト関数 isanomalyLOFObj を使用して、新規のデータの異常を見つけることができます。

    異常インジケーター。logical 列ベクトルとして返されます。tf の要素は、Tbl または X の対応する行の観測値が異常であれば logical 1 (true)、それ以外の場合は logical 0 (false) になります。tf の長さは Tbl または X と同じです。

    lof は、scores がしきい値 (LOFObjScoreThreshold プロパティの値) を超える観測値を異常として識別します。関数は、指定された比率 (名前と値の引数 ContaminationFraction) の学習観測値が異常として検出されるようにしきい値を決定します。

    異常スコア (局所外れ値因子の値)。非負の値の数値列ベクトルとして返されます。scores の長さは Tbl または X と同じで、scores の各要素に Tbl または X の対応する行の観測値に対する異常スコアが格納されます。1 未満かそれに近いスコア値は正常な観測値を示し、1 より大きい値は異常の可能性を示します。

    詳細

    すべて折りたたむ

    局所外れ値因子

    局所外れ値因子 (LOF) アルゴリズムでは、周囲の近傍に対する観測値の相対的な密度に基づいて異常を検出します。

    このアルゴリズムでは、観測値の k 最近傍を探索し、観測値とその近傍の局所到達可能性密度を計算します。局所外れ値因子は、観測値とその近傍の平均密度比です。つまり、観測値 p の局所外れ値因子は次のようになります。

    LOFk(p)=1|Nk(p)|oNk(p)lrdk(o)lrdk(p),

    ここで

    • lrdk(·) は、観測値の局所到達可能性密度です。

    • Nk(p) は、観測値 p の k 最近傍を表します。名前と値の引数 IncludeTiestrue に指定して k 番目に小さい距離値の近傍をすべて含めるか、false に指定して正確に k 個の近傍を含めることができます。効率性能を高めるため、lofIncludeTies の既定値は false です。[1]のアルゴリズムではすべての近傍が使用されることに注意してください。

    • |Nk(p)|Nk(p) 内の観測値数です。

    正常な観測値の場合、局所外れ値因子の値は 1 未満かそれに近い値で、観測値の局所到達可能性密度がその近傍より高いか同等であることを示します。局所外れ値因子の値が 1 より大きい場合は、異常の可能性を示します。局所外れ値因子の値のしきい値は、lofContaminationFraction 引数と isanomalyScoreThreshold 引数で制御します。

    このアルゴリズムでは、到達可能性距離に基づいて密度を測定します。観測値 o に対する観測値 p の到達可能性距離は次のように定義されます。

    d˜k(p,o)=max(dk(o),d(p,o)),

    ここで

    • dk(o) は、観測値 o からその近傍までの距離の中で k 番目に短い距離です。

    • d(p,o) は、観測値 p と観測値 o の間の距離です。

    このアルゴリズムでは、到達可能性距離を使用して、観測値 o に近い観測値の d(p,o) の統計変動を低減します。

    観測値 p の局所到達可能性密度は、観測値 p からその近傍までの平均到達可能性距離の逆数です。

    lrdk(p)=1/oNk(p)d˜k(p,o)|Nk(p)|.

    重複の数が近傍の数 (k) より大きい場合、密度値は無限大になる可能性があります。そのため、学習データに重複が含まれている場合、関数 lof と関数 isanomaly では加重局所外れ値因子 (WLOF) アルゴリズムが使用されます。このアルゴリズムでは、加重局所到達可能性密度 (wlrd) を使用して加重局所外れ値因子を計算します。

    WLOFk(p)=1oNk(p)w(o)oNk(p)wlrdk(o)wlrdk(p),

    ここで

    wlrdk(p)=1/oNk(p)w(o)d˜k(p,o)oNk(p)w(o),

    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 の間のさまざまな距離は次のように定義されます。

    • 連続 (数値) 変数の距離計量

      • ユークリッド距離

        dst2=(xsyt)(xsyt).

        ユークリッド距離はミンコフスキー距離の特殊なケース、p = 2 の場合です。

        ユークリッド距離を指定するには、Distance パラメーターを 'euclidean' に設定します。

      • 高速ユークリッド距離はユークリッド距離と同じですが、観測値 n における変数の数が 10 個を超える場合に通常は時間の短縮になるアルゴリズムを使用します。アルゴリズムを参照してください。

      • マハラノビス距離

        dst2=(xsyt)C1(xsyt),

        ここで、C は共分散行列です。

        マハラノビス距離を指定するには、Distance パラメーターを 'mahalanobis' に設定します。

      • 市街地距離

        dst=j=1n|xsjytj|.

        市街地距離はミンコフスキー距離の特殊なケース、p = 1 の場合です。

        市街地距離を指定するには、Distance パラメーターを 'cityblock' に設定します。

      • ミンコフスキー距離

        dst=j=1n|xsjytj|pp.

        p = 1 という特殊なケースでは、ミンコフスキー距離は市街地距離を与えます。p = 2 という特殊なケースでは、ミンコフスキー距離はユークリッド距離を与えます。p = ∞ という特殊なケースでは、ミンコフスキー距離はチェビシェフ距離を与えます。

        ミンコフスキー距離を指定するには、Distance パラメーターを 'minkowski' に設定します。

      • チェビシェフ距離

        dst=maxj{|xsjytj|}.

        チェビシェフ距離はミンコフスキー距離の特殊なケース、p = ∞ の場合です。

        チェビシェフ距離を指定するには、Distance パラメーターを 'chebychev' に設定します。

      • コサイン距離

        dst=(1xsyt(xsxs)(ytyt)).

        コサイン距離を指定するには、Distance パラメーターを 'cosine' に設定します。

      • 相関距離

        dst=1(xsx¯s)(yty¯t)(xsx¯s)(xsx¯s)(yty¯t)(yty¯t),

        ここで

        x¯s=1njxsj

        および

        y¯t=1njytj.

        相関距離を指定するには、Distance パラメーターを 'correlation' に設定します。

      • スピアマン距離は、1 から一連の値として扱われる観測値間の標本スピアマン順位相関係数を引きます。

        dst=1(rsr¯s)(rtr¯t)(rsr¯s)(rsr¯s)(rtr¯t)(rtr¯t),

        ここで

        • rsj は、tiedrank により計算される、x1j、x2j、...xmx,j から取得された xsj の順位です。

        • rtj は、tiedrank により計算される、y1j、y2j、...ymy,j から取得された ytj の順位です。

        • rs および rt は、xs および yt の座標単位の順位ベクトルです。つまり、rs = (rs1, rs2, ... rsn) および rt = (rt1, rt2, ... rtn) です。

        • r¯s=1njrsj=(n+1)2.

        • r¯t=1njrtj=(n+1)2.

        スピアマン距離を指定するには、Distance パラメーターを 'spearman' に設定します。

    • カテゴリカル変数の距離計量

      • ハミング距離は、一致しない座標の比率です。

        dst=(#(xsjytj)/n).

        ハミング距離を指定するには、Distance パラメーターを 'hamming' に設定します。

      • Jaccard 距離は、1 からジャカード係数 (異なる非ゼロ座標の比率) を引きます。

        dst=#[(xsjytj)((xsj0)(ytj0))]#[(xsj0)(ytj0)].

        Jaccard 距離を指定するには、Distance パラメーターを 'jaccard' に設定します。

    アルゴリズム

    すべて折りたたむ

    欠損値

    lof は、Tbl に含まれている NaN'' (空の文字ベクトル)、"" (空の string)、<missing><undefined> の値と X に含まれている NaN 値を欠損値と見なします。

    • lof は、欠損値のある観測値は使用しません。

    • lof は、欠損値のある観測値に異常スコア NaN および異常インジケーター false (logical 0) を割り当てます。

    高速ユークリッド距離アルゴリズム

    "fasteuclidean" Distance では、計算時間の短縮のために追加のメモリを使用してユークリッド距離が計算されます。このアルゴリズムは、Albanie の[2]などで "ユークリッド距離行列トリック" として提唱されているものです。内部テストでは、このアルゴリズムによって予測子の数が 10 個を超える場合に時間の短縮になることが確認されています。"fasteuclidean" 距離ではスパース データはサポートされません。

    このアルゴリズムでは、xi と xj のすべての点間の距離の行列 D を求めるために (xi のそれぞれに n 個の変数を格納)、次の方程式の最後の行を使用して距離を計算します。

    Di,j2=xixj2=(xixj)T(xixj)=xi22xiTxj+xj2.

    方程式の最後の行にある行列 xiTxj"グラム行列" と呼ばれます。正方化と加算によって平方距離を計算する代わりに、グラム行列を計算して使用すると、一連の平方距離の計算は高速になりますが、数値的安定性は少し低くなります。詳細については、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://www.robots.ox.ac.uk/%7Ealbanie/notes/Euclidean_distance_trick.pdf.

    バージョン履歴

    R2022b で導入

    すべて展開する