Main Content

classify

判別分析を使用した観測値の分類

    説明

    メモ

    判別分析分類器の学習とラベルの予測には、classify よりも fitcdiscrpredict が推奨されます。fitcdiscr は交差検証とハイパーパラメーター最適化をサポートし、新しい予測または事前確率の変更を行うたびに分類器を当てはめる必要はありません。

    class = classify(sample,training,group) は、sample 内のデータの各行を training 内のデータが属するグループのいずれかに分類します。training のグループは group で指定します。この関数は、sample の各行について割り当てられたグループが格納された class を返します。

    class = classify(sample,training,group,type,prior) は、判別関数のタイプ type、および各グループの事前確率 prior も指定します。

    [class,err,posterior,logp,coeff] = classify(___) は、前の構文におけるいずれかの入力引数の組み合わせを使用して、見かけの誤差率 (err)、学習観測値の事後確率 (posterior)、標本観測値の条件なし確率密度の対数 (logp)、および境界曲線の係数 (coeff) も返します。

    すべて折りたたむ

    fisheriris データ セットを読み込みます。アヤメの種類が含まれる文字ベクトルの cell 配列 group を作成します。

    load fisheriris
    group = species;

    行列 meas には、150 本のアヤメについての 4 つの花弁の測定値が格納されています。group のグループ情報を使用して、観測値を階層的に学習セット (trainingData) と標本セット (sampleData) に無作為に分割します。sampleData に 40% のホールドアウト標本を指定します。

    rng('default') % For reproducibility
    cv = cvpartition(group,'HoldOut',0.40);
    trainInds = training(cv);
    sampleInds = test(cv);
    trainingData = meas(trainInds,:);
    sampleData = meas(sampleInds,:);

    線形判別分析を使用して sampleData を分類し、group の真のラベルと class の予測ラベルから混同チャートを作成します。

    class = classify(sampleData,trainingData,group(trainInds));
    cm = confusionchart(group(sampleInds),class);

    Figure contains an object of type ConfusionMatrixChart.

    関数 classify は、標本データ セット内の 1 つの versicolor 種のアヤメを virginica として誤分類します。

    2 次判別分析を使用して、測定値の格子点 (標本データ) のデータ点を分類します。その後、標本データ、学習データ、および判定境界を可視化します。

    fisheriris データ セットを読み込みます。アヤメの種類が含まれる文字ベクトルの cell 配列 group を作成します。

    load fisheriris
    group = species(51:end);

    versicolor 種と virginica 種のアヤメについてのがく片の長さ (SL) と幅 (SW) の測定値をプロットします。

    SL = meas(51:end,1);
    SW = meas(51:end,2);
    h1 = gscatter(SL,SW,group,'rb','v^',[],'off');
    h1(1).LineWidth = 2;
    h1(2).LineWidth = 2;
    legend('Fisher versicolor','Fisher virginica','Location','NW')
    xlabel('Sepal Length')
    ylabel('Sepal Width')

    Figure contains an axes object. The axes object with xlabel Sepal Length, ylabel Sepal Width contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Fisher versicolor, Fisher virginica.

    測定値の格子点を格納する数値行列 sampleData を作成します。versicolor 種と virginica 種のアヤメについてのがく片の長さと幅の測定値を格納する数値行列 trainingData を作成します。

    [X,Y] = meshgrid(linspace(4.5,8),linspace(2,4));
    X = X(:); Y = Y(:);
    sampleData = [X Y];
    trainingData = [SL SW];

    2 次判別分析を使用して sampleData を分類します。

    [C,err,posterior,logp,coeff] = classify(sampleData,trainingData,group,'quadratic');

    2 つのクラスの間で 2 次境界の係数 KL、および M を取得します。

    K = coeff(1,2).const;
    L = coeff(1,2).linear; 
    Q = coeff(1,2).quadratic;

    2 つのクラスを分離する曲線は次の方程式で定義されます。

    K+[x1x2]L+[x1x2]Q[x1x2]=0

    判別分類を可視化します。

    hold on
    h2 = gscatter(X,Y,C,'rb','.',1,'off');
    f = @(x,y) K + L(1)*x + L(2)*y + Q(1,1)*x.*x + (Q(1,2)+Q(2,1))*x.*y + Q(2,2)*y.*y;
    h3 = fimplicit(f,[4.5 8 2 4]);
    h3.Color = 'm';
    h3.LineWidth = 2;
    h3.DisplayName = 'Decision Boundary';
    hold off
    axis tight
    xlabel('Sepal Length')
    ylabel('Sepal Width')
    title('Classification with Fisher Training Data')

    Figure contains an axes object. The axes object with title Classification with Fisher Training Data, xlabel Sepal Length, ylabel Sepal Width contains 5 objects of type line, implicitfunctionline. One or more of the lines displays its values using only markers These objects represent Fisher versicolor, Fisher virginica, Decision Boundary.

    データ セットを標本データと学習データに分割し、線形判別分析を使用して標本データを分類します。その後、判定境界を可視化します。

    fisheriris データ セットを読み込みます。アヤメの種類が含まれる文字ベクトルの cell 配列 group を作成します。花弁の長さと幅の測定値を格納する数値ベクトル PLPW をそれぞれ作成します。

    load fisheriris
    group = species;
    PL = meas(:,3);
    PW = meas(:,4);

    setosa 種、versicolor 種、および virginica 種のアヤメについてのがく片の長さ (PL) と幅 (PW) の測定値をプロットします。

    h1 = gscatter(PL,PW,species,'krb','ov^',[],'off');
    legend('Setosa','Versicolor','Virginica','Location','best')
    xlabel('Petal Length')
    ylabel('Petal Width')

    Figure contains an axes object. The axes object with xlabel Petal Length, ylabel Petal Width contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Setosa, Versicolor, Virginica.

    group のグループ情報を使用して、観測値を階層的に学習セット (trainingData) と標本セット (sampleData) に無作為に分割します。sampleData に 10% のホールドアウト標本を指定します。

    rng('default') % For reproducibility
    cv = cvpartition(group,'HoldOut',0.10);
    trainInds = training(cv);
    sampleInds = test(cv);
    trainingData = [PL(trainInds) PW(trainInds)];
    sampleData = [PL(sampleInds) PW(sampleInds)];

    線形判別分析を使用して sampleData を分類します。

    [class,err,posterior,logp,coeff] = classify(sampleData,trainingData,group(trainInds));

    2 番目と 3 番目のクラスの間で線形境界の係数 K および L を取得します。

    K = coeff(2,3).const;  
    L = coeff(2,3).linear;

    2 番目と 3 番目のクラスを分離する直線は方程式 K+[x1x2]L=0 で定義されます。2 番目と 3 番目のクラスの間の境界線をプロットします。

    f = @(x1,x2) K + L(1)*x1 + L(2)*x2;
    hold on
    h2 = fimplicit(f,[.9 7.1 0 2.5]);
    h2.Color = 'r';
    h2.DisplayName = 'Boundary between Versicolor & Virginica';

    Figure contains an axes object. The axes object with xlabel Petal Length, ylabel Petal Width contains 4 objects of type line, implicitfunctionline. One or more of the lines displays its values using only markers These objects represent Setosa, Versicolor, Virginica, Boundary between Versicolor & Virginica.

    1 番目と 2 番目のクラスの間で線形境界の係数 K および L を取得します。

    K = coeff(1,2).const;
    L = coeff(1,2).linear;

    1 番目と 2 番目のクラスを分離する直線をプロットします。

    f = @(x1,x2) K + L(1)*x1 + L(2)*x2;
    h3 = fimplicit(f,[.9 7.1 0 2.5]);
    hold off
    h3.Color = 'k';
    h3.DisplayName = 'Boundary between Versicolor & Setosa';
    axis tight
    title('Linear Classification with Fisher Training Data')

    Figure contains an axes object. The axes object with title Linear Classification with Fisher Training Data, xlabel Petal Length, ylabel Petal Width contains 5 objects of type line, implicitfunctionline. One or more of the lines displays its values using only markers These objects represent Setosa, Versicolor, Virginica, Boundary between Versicolor & Virginica, Boundary between Versicolor & Setosa.

    入力引数

    すべて折りたたむ

    標本データ。数値行列として指定します。sample の各列が 1 つの変数を表し、各行が 1 つの標本観測値を表します。sampletraining と同じ列数でなければなりません。

    データ型: single | double

    学習データ。数値行列として指定します。training の各列が 1 つの変数を表し、各行が 1 つの学習観測値を表します。trainingsample と同じ列数、group と同じ行数でなければなりません。

    データ型: single | double

    グループ名。categorical 配列、文字配列、string 配列、数値ベクトル、または文字ベクトルの cell 配列として指定します。group の各要素によって、training の対応する行が属するグループが定義されます。grouptraining と同じ行数でなければなりません。

    group 内の NaN<undefined>、空の文字ベクトル ('')、空の string ("")、および <missing> の値は、欠損値を示します。classify は、欠損グループ名に対応する training データの行全体を削除します。

    データ型: categorical | char | string | single | double | cell

    判別タイプ。次の表のいずれかの値として指定します。

    説明
    'linear'各グループに対して、プールされた共分散の推定値で、多変量正規密度を当てはめます。このオプションでは、尤度比を使用して標本観測値がグループに割り当てられます。
    'quadratic'グループで階層化された共分散推定値で多変量正規密度を当てはめます。このオプションでは、尤度比を使用して標本観測値がグループに割り当てられます。
    'diagLinear''linear' に類似していますが、対角線の共分散行列推定値を使用します。この対角性のオプションは、単純ベイズ分類器の具体例です。グループ ラベルが与えられた場合、変数が条件的に独立しているものと仮定されるからです。
    'diagQuadratic''quadratic' に類似していますが、対角線の共分散行列推定値を使用します。この対角性のオプションは、単純ベイズ分類器の具体例です。グループ ラベルが与えられた場合、変数が条件的に独立しているものと仮定されるからです。
    'mahalanobis'階層化された共分散推定値と共に、マハラノビス距離を使用します。

    各グループの事前確率。次の表のいずれかの値として指定します。既定では、事前確率はいずれも 1/K (K はグループ数) となります。

    説明
    数値ベクトル各要素はグループの事前確率です。要素の順序は group に従います。classify は、合計が 1 になるように要素を正規化します。
    'empirical'グループの事前確率は、group のグループの相対的頻度です。
    構造体

    構造体 S には 2 つのフィールドがあります。

    • S.group には、group と同じ型の変数としてグループ名が格納されます。

    • S.prob には、対応する事前確率の数値ベクトルが格納されます。classify は、合計が 1 になるように要素を正規化します。

    prior は、err の計算を除き、マハラノビス距離による判別には使用されません。

    データ型: single | double | char | string | struct

    出力引数

    すべて折りたたむ

    標本データの予測クラス。categorical 配列、文字配列、string 配列、数値ベクトル、または文字ベクトルの cell 配列として返されます。classgroup と同じ型になります。class の各要素に、sample の各行が割り当てられたグループが格納されます。

    データ型: categorical | char | string | single | double | cell

    見かけの誤差率。非負の数値として返されます。err は、training データに基づく誤分類誤差率の推定値です。これは、誤分類され、グループの prior の確率で重み付けされた training の観測値の比率です。

    データ型: single | double

    学習観測値の事後確率。n 行 k 列の数値行列として返されます。n は training 内の観測値 (行) の個数、k は group 内のグループの個数です。要素 posterior(i,j) は、training 内の観測値 igroup 内のグループ j に属する事後確率です。posterior は、type として 'mahalanobis' を指定した場合は計算されません。

    データ型: single | double

    標本観測値の条件なし確率密度の対数。数値ベクトルとして返されます。sample 内の観測値 i に対する予測される条件なし確率密度は次のようになります。

    P(obsi)=j=1kP(obsi | groupj)P(groupj),

    ここで、

    • P(obsi|groupj) は、sample 内の観測値 igroup 内のグループ j における条件付き密度です。

    • P(groupj) は、グループ j の事前確率です。

    • k は、グループの数です。

    logp は、type として 'mahalanobis' を指定した場合は計算されません。

    データ型: single | double

    グループのペア間の境界曲線の係数。k 行 k 列の構造体として返されます。k は group 内のグループの個数です。要素 coeff(i,j) に、グループ ij の間の境界の係数が格納されます。次の表は、coeff のフィールドとその値の一覧です。

    フィールド名
    typetype で指定された判別関数のタイプ
    name1グループ i の名前
    name2グループ j の名前
    const境界方程式の定数項 (K)
    linear境界方程式の線形係数 (L)
    quadratic境界方程式の 2 次係数の行列 (Q)。このフィールドは、type として 'linear' または 'diagLinear' を指定した場合は構造体に含まれません。
    • type として 'linear' または 'diagLinear' を指定した場合、0 < K + x*L であれば、sample の行 x はグループ i (グループ j でなく) に分類されます。

    • type として 'quadratic''diagQuadratic'、または 'mahalanobis' を指定した場合、0 < K + x*L + x*Q*x' であれば、sample の行 x はグループ i (グループ j でなく) に分類されます。

    代替機能

    関数 fitcdiscr は判別分析も実行します。関数 fitcdiscr を使用して分類器に学習をさせ、関数 predict を使用して新しいデータのラベルを予測することができます。関数 fitcdiscr は交差検証とハイパーパラメーター最適化をサポートします。新しい予測または事前確率の変更を行うたびに分類器を当てはめる必要はありません。

    参照

    [1] Krzanowski, Wojtek. J. Principles of Multivariate Analysis: A User's Perspective. NY: Oxford University Press, 1988.

    [2] Seber, George A. F. Multivariate Observations. NJ: John Wiley & Sons, Inc., 1984.

    バージョン履歴

    R2006a より前に導入