Main Content

classify

판별분석을 사용하여 관측값 분류하기

    설명

    예제

    참고

    판별분석 분류기 훈련과 레이블 예측에는 classify보다 fitcdiscrpredict를 권장합니다. fitcdiscr은 교차 검증 및 하이퍼파라미터 최적화를 지원하며, 새로운 예측을 하거나 사전 확률을 변경할 때마다 매번 분류기를 피팅할 필요가 없습니다.

    class = classify(sample,training,group)sample의 각 데이터 행을 training의 데이터가 속한 그룹 중 하나로 분류합니다. training의 그룹은 group으로 지정됩니다. 이 함수는 class를 반환하며, 여기에는 sample의 각 행에 할당된 그룹이 포함됩니다.

    class = classify(sample,training,group,type,prior)는 판별 함수의 type과 각 그룹에 대한 prior 확률도 지정합니다.

    예제

    [class,err,posterior,logp,coeff] = classify(___)는 위에 열거된 구문에 나와 있는 입력 인수를 조합하여 겉보기(apparent) 오차율(err), 훈련 관측값에 대한 사후 확률(posterior), 표본 관측값에 대한 비조건부 확률 밀도의 로그(logp), 경계 곡선의 계수(coeff)도 반환합니다.

    예제

    모두 축소

    fisheriris 데이터 세트를 불러옵니다. 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 함수는 versicolor 붓꽃 하나를 표본 데이터 세트에서 virginica로 잘못 분류합니다.

    2차 판별분석을 사용하여 데이터 점을 측정값 그리드(표본 데이터)에 분류합니다. 그런 다음 표본 데이터, 훈련 데이터, 결정 경계를 시각화합니다.

    fisheriris 데이터 세트를 불러옵니다. 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를 측정값 그리드를 포함하는 숫자형 행렬로 생성합니다. trainingData를 붓꽃 versicolor 종과 virginica 종의 꽃받침 길이와 너비 측정값을 포함하는 숫자형 행렬로 생성합니다.

    [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차 경계에 대한 계수 K, L, M을 가져옵니다.

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

    두 클래스를 구분하는 곡선은 다음 수식으로 정의됩니다.

    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 데이터 세트를 불러옵니다. 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));

    두 번째 클래스와 세 번째 클래스 사이의 선형 경계에 대한 계수 KL을 가져옵니다.

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

    두 번째 클래스와 세 번째 클래스를 구분하는 선은 수식 K+[x1x2]L=0으로 정의됩니다. 두 번째 클래스와 세 번째 클래스 사이의 경계선을 플로팅합니다.

    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.

    첫 번째 클래스와 두 번째 클래스 사이의 선형 경계에 대한 계수 KL을 가져옵니다.

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

    첫 번째 클래스와 두 번째 클래스를 구분하는 선을 플로팅합니다.

    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의 각 열은 하나의 변수를 나타내고, 각 행은 하나의 표본 관측값을 나타냅니다. sampletraining과 열 개수가 동일해야 합니다.

    데이터형: single | double

    훈련 데이터로, 숫자형 행렬로 지정됩니다. training의 각 열은 하나의 변수를 나타내고, 각 행은 하나의 훈련 관측값을 나타냅니다. trainingsample과 열 개수가 동일해야 하며 group과 행 개수가 동일해야 합니다.

    데이터형: single | double

    그룹 이름으로, categorical형 배열, 문자형 배열, string형 배열, 숫자형 벡터 또는 문자형 벡터로 구성된 셀형 배열로 지정됩니다. group의 각 요소는 training에서 대응하는 행이 속하는 그룹을 정의합니다. grouptraining과 행 개수가 동일해야 합니다.

    groupNaN, <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입니다.

    • S.group은 그룹 이름을 group과 같은 유형의 변수로 포함합니다.

    • S.prob는 대응하는 사전 확률로 구성된 숫자형 벡터를 포함합니다. classify 함수는 합이 1이 되도록 요소를 정규화합니다.

    priorerr의 계산을 제외하고 마할라노비스 거리에 의한 판별에 사용되지 않습니다.

    데이터형: single | double | char | string | struct

    출력 인수

    모두 축소

    표본 데이터의 예측 클래스로, categorical형 배열, 문자형 배열, string형 배열, 숫자형 벡터 또는 문자형 벡터로 구성된 셀형 배열로 반환됩니다. classgroup과 같은 유형입니다. class의 각 요소는 sample의 각 행이 할당된 그룹을 포함합니다.

    데이터형: categorical | char | string | single | double | cell

    겉보기 오차율로, 음이 아닌 숫자로 반환됩니다. errtraining 데이터를 기반으로 한 오분류 오차율의 추정값입니다. 이는 training의 잘못 분류된 관측값의 백분율로, 그룹의 prior 확률에 의해 가중치가 적용됩니다.

    데이터형: single | double

    훈련 관측값의 사후 확률로, n×k 숫자형 행렬로 반환됩니다. 여기서 n은 training의 관측값(행) 개수이고 k는 group의 그룹 개수입니다. 요소 posterior(i,j)training의 관측값 igroup의 그룹 j에 속할 사후 확률입니다. type'mahalanobis'로 지정한 경우 함수는 posterior를 계산하지 않습니다.

    데이터형: single | double

    표본 관측값에 대한 비조건부 확률 밀도의 로그로, 숫자형 벡터로 반환됩니다. sample의 관측값 i에 대해 예측되는 비조건부 확률 밀도는 다음과 같습니다.

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

    여기서

    • P(obsi|groupj)group의 그룹 j가 주어졌을 때 sample의 관측값 i의 조건부 밀도입니다.

    • P(groupj)는 그룹 j의 사전 확률입니다.

    • k는 그룹 개수입니다.

    type'mahalanobis'로 지정한 경우 함수는 logp를 계산하지 않습니다.

    데이터형: 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를 그룹 j 대신에 그룹 i로 분류합니다.

    • type'quadratic', 'diagQuadratic' 또는 'mahalanobis'로 지정하는 경우, 0 < K + x*L + x*Q*x'이면 함수는 sample의 행 x를 그룹 j 대신에 그룹 i로 분류합니다.

    대체 기능

    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 이전에 개발됨