Main Content

ksdensity

일변량 데이터와 이변량 데이터에 대한 커널 평활화 함수 추정값

설명

예제

[f,xi] = ksdensity(x)는 벡터 또는 2열 행렬 x의 표본 데이터에 대한 확률 밀도 추정값 f를 반환합니다. 이 추정값은 정규 커널 함수를 기반으로 하며, x의 데이터 범위를 포괄하는 균일한 간격으로 배치된 점 xi에서 계산됩니다. ksdensity는 일변량 데이터에 대해서는 100개 점 또는 이변량 데이터에 대해서는 900개 점에서 밀도를 추정합니다.

ksdensity는 연속 분포된 표본에 가장 적합합니다.

예제

[f,xi] = ksdensity(x,pts)f를 계산할 점(pts)을 지정합니다. 여기서 xipts는 동일한 값을 포함합니다.

예제

[f,xi] = ksdensity(___,Name,Value)는 위에 열거된 구문에 나와 있는 입력 인수와 함께 하나 이상의 이름-값 쌍의 인수로 지정된 추가 옵션을 사용합니다. 예를 들어, 확률 밀도, 누적 확률, 생존 함수 등과 같이 ksdensity가 계산하는 함수 유형을 정의할 수 있습니다. 또는, 평활화 윈도우의 대역폭을 지정할 수 있습니다.

예제

[f,xi,bw] = ksdensity(___)는 커널 평활화 윈도우의 대역폭 bw도 반환합니다. 디폴트 대역폭은 정규 밀도에 가장 적합합니다.

예제

ksdensity(___)는 커널 평활화 함수 추정값을 플로팅합니다.

ksdensity(ax,___)gca에서 반환되는 현재 좌표축 대신 ax 핸들 좌표축을 사용하여 결과를 플로팅합니다.

예제

모두 축소

두 개의 혼합된 정규분포에서 표본 데이터 세트를 생성합니다.

rng('default')  % For reproducibility
x = [randn(30,1); 5+randn(30,1)];

추정된 밀도를 플로팅합니다.

[f,xi] = ksdensity(x); 
figure
plot(xi,f);

Figure contains an axes object. The axes object contains an object of type line.

밀도 추정값은 표본의 이봉 분포를 보여줍니다.

절반 정규분포에서 음이 아닌 표본 데이터 세트를 생성합니다.

rng('default') % For reproducibility
pd = makedist('HalfNormal','mu',0,'sigma',1);
x = random(pd,100,1);

'BoundaryCorrection' 이름-값 쌍의 인수를 사용하여 두 개의 서로 다른 경계 수정 방법인 로그 변환과 반사를 통해 pdf를 추정합니다.

pts = linspace(0,5,1000); % points to evaluate the estimator
[f1,xi1] = ksdensity(x,pts,'Support','positive');
[f2,xi2] = ksdensity(x,pts,'Support','positive','BoundaryCorrection','reflection');

추정된 두 pdf를 플로팅합니다.

plot(xi1,f1,xi2,f2)
lgd = legend('log','reflection');
title(lgd, 'Boundary Correction Method')
xl = xlim;
xlim([xl(1)-0.25 xl(2)])

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent log, reflection.

양의 지지 범위 또는 유계 지지 범위를 지정하면 ksdensity는 경계 수정 방법을 사용합니다. 디폴트 경계 수정 방법은 로그 변환입니다. ksdensity가 지지 범위를 다시 변환할 경우 커널 밀도 추정량에 1/x 항이 추가됩니다. 따라서, 추정값은 x = 0 근방에서 피크를 가집니다. 반면, 반사 방법은 경계 근처에서 원치 않는 피크를 발생시키지 않습니다.

표본 데이터를 불러옵니다.

load hospital

지정된 값 세트에서 추정된 cdf를 계산하고 플로팅합니다.

pts = (min(hospital.Weight):2:max(hospital.Weight));
figure()
ecdf(hospital.Weight)
hold on
[f,xi,bw] = ksdensity(hospital.Weight,pts,'Support','positive',...
	'Function','cdf');
plot(xi,f,'-g','LineWidth',2)
legend('empirical cdf','kernel-bw:default','Location','northwest')
xlabel('Patient weights')
ylabel('Estimated cdf')

Figure contains an axes object. The axes object with xlabel Patient weights, ylabel Estimated cdf contains 2 objects of type stair, line. These objects represent empirical cdf, kernel-bw:default.

ksdensity가 누적 분포 함수 추정값을 너무 많이 평활화하는 것처럼 보입니다. 더 작은 대역폭을 가지는 추정값이 경험적 누적 분포 함수에 더 가까운 추정값을 생성할 가능성이 있습니다.

평활화 윈도우의 대역폭을 반환합니다.

bw
bw = 0.1070

더 작은 대역폭을 사용하여 누적 분포 함수 추정값을 플로팅합니다.

[f,xi] = ksdensity(hospital.Weight,pts,'Support','positive',...
	'Function','cdf','Bandwidth',0.05); 
plot(xi,f,'--r','LineWidth',2)
legend('empirical cdf','kernel-bw:default','kernel-bw:0.05',...
	'Location','northwest')
hold off

Figure contains an axes object. The axes object with xlabel Patient weights, ylabel Estimated cdf contains 3 objects of type stair, line. These objects represent empirical cdf, kernel-bw:default, kernel-bw:0.05.

더 작은 대역폭을 사용한 ksdensity 추정값이 경험적 누적 분포 함수와 더 잘 일치합니다.

표본 데이터를 불러옵니다.

load hospital

균일한 간격으로 배치된 50개 점에서 계산된 추정된 cdf를 플로팅합니다.

figure()
ksdensity(hospital.Weight,'Support','positive','Function','cdf',...
'NumPoints',50)
xlabel('Patient weights')
ylabel('Estimated cdf')

Figure contains an axes object. The axes object with xlabel Patient weights, ylabel Estimated cdf contains an object of type line.

평균이 3인 지수 분포에서 표본 데이터를 생성합니다.

rng('default')  % For reproducibility
x = random('exp',3,100,1);

중도절단을 나타내는 논리형 벡터를 생성합니다. 여기서, 수명이 10보다 긴 관측값은 중도절단됩니다.

T = 10;
cens = (x>T);

추정된 밀도 함수를 계산하고 플로팅합니다.

figure
ksdensity(x,'Support','positive','Censoring',cens);

Figure contains an axes object. The axes object contains an object of type line.

생존 함수를 계산하고 플로팅합니다.

figure
ksdensity(x,'Support','positive','Censoring',cens,...
'Function','survivor');

Figure contains an axes object. The axes object contains an object of type line.

누적 위험 함수를 계산하고 플로팅합니다.

figure
ksdensity(x,'Support','positive','Censoring',cens,...
'Function','cumhazard');

Figure contains an axes object. The axes object contains an object of type line.

두 개의 혼합된 정규분포를 생성하고 지정된 확률 값 세트에서 추정된 역누적 분포 함수를 플로팅합니다.

rng('default')  % For reproducibility
x = [randn(30,1); 5+randn(30,1)];
pi = linspace(.01,.99,99);
figure
ksdensity(x,pi,'Function','icdf');

Figure contains an axes object. The axes object contains an object of type line.

두 개의 혼합된 정규분포를 생성합니다.

rng('default')  % For reproducibility
x = [randn(30,1); 5+randn(30,1)];

확률 밀도 추정값에 대한 평활화 윈도우의 대역폭을 반환합니다.

[f,xi,bw] = ksdensity(x); 
bw
bw = 1.5141

디폴트 대역폭은 정규 밀도에 가장 적합합니다.

추정된 밀도를 플로팅합니다.

figure
plot(xi,f);
xlabel('xi')
ylabel('f')
hold on

Figure contains an axes object. The axes object with xlabel xi, ylabel f contains an object of type line.

증가된 대역폭 값을 사용하여 밀도를 플로팅합니다.

[f,xi] = ksdensity(x,'Bandwidth',1.8);
plot(xi,f,'--r','LineWidth',1.5)

Figure contains an axes object. The axes object with xlabel xi, ylabel f contains 2 objects of type line.

대역폭이 클수록 밀도 추정값이 더 평활화되며, 이 경우 분포의 일부 특징이 가려질 수 있습니다.

이제, 감소된 대역폭 값을 사용하여 밀도를 플로팅합니다.

[f,xi] = ksdensity(x,'Bandwidth',0.8);
plot(xi,f,'-.k','LineWidth',1.5)
legend('bw = default','bw = 1.8','bw = 0.8')
hold off

Figure contains an axes object. The axes object with xlabel xi, ylabel f contains 3 objects of type line. These objects represent bw = default, bw = 1.8, bw = 0.8.

대역폭이 작을수록 밀도 추정값이 덜 평활화되며, 이 경우 표본의 일부 특징이 과장됩니다.

밀도를 계산할 점으로 구성된 2열 벡터를 생성합니다.

gridx1 = -0.25:.05:1.25;
gridx2 = 0:.1:15;
[x1,x2] = meshgrid(gridx1, gridx2);
x1 = x1(:);
x2 = x2(:);
xi = [x1 x2];

혼합된 이변량 정규분포에서 난수를 포함하는 30×2 행렬을 생성합니다.

rng('default')  % For reproducibility
x = [0+.5*rand(20,1) 5+2.5*rand(20,1);
            .75+.25*rand(10,1) 8.75+1.25*rand(10,1)];

표본 데이터에 대한 추정된 밀도를 플로팅합니다.

figure
ksdensity(x,xi);

Figure contains an axes object. The axes object contains an object of type surface.

입력 인수

모두 축소

ksdensityf 값을 반환하는 데 사용하는 표본 데이터로, 열 벡터 또는 2열 행렬로 지정됩니다. 일변량 데이터에는 열 벡터를 사용하고, 이변량 데이터에는 2열 행렬을 사용합니다.

예: [f,xi] = ksdensity(x)

데이터형: single | double

f를 계산할 점으로, 벡터 또는 2열 행렬로 지정됩니다. 이변량 데이터에 대해 pts는 행 벡터 또는 열 벡터일 수 있습니다. 반환되는 출력값 f의 길이는 pts의 점 개수와 동일합니다.

예: pts = (0:1:25); ksdensity(x,pts);

데이터형: single | double

ksdensity가 플로팅할 Figure에 대한 axes 핸들로, 핸들로 지정됩니다.

예를 들어, h가 Figure에 대한 핸들이면 ksdensity는 다음과 같이 해당 Figure에 대해 플로팅할 수 있습니다.

예: ksdensity(h,x)

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: 'Censoring',cens,'Kernel','triangle','NumPoints',20,'Function','cdf'ksdensity가 삼각 커널 평활화 함수를 사용하고 벡터 cens에 포함된 중도절단된 데이터 정보를 고려하여 데이터의 범위를 포괄하는 균일한 간격으로 배치된 20개의 점에서 계산을 수행함으로써 cdf를 추정하는 것으로 지정합니다.

x에 포함된 점 개수의 함수인 커널 평활화 윈도우의 대역폭으로, 'Bandwidth'와 함께 스칼라 값이 쉼표로 구분되어 지정됩니다. 표본 데이터가 이변량이면 Bandwidth도 요소를 2개 가진 벡터일 수 있습니다. 디폴트 값은 정규 밀도를 추정하는 데 적합하지만[1], 더 큰 값이나 더 작은 값을 선택하여 평활화 정도를 조정할 수도 있습니다.

'BoundaryCorrection''log'(디폴트 값)로 지정하고 'Support''positive' 또는 벡터 [L U]로 지정할 경우, ksdensity는 로그 변환을 사용하여 유계 데이터를 비유계 데이터로 변환합니다. 'Bandwidth'의 값은 변환된 값의 범위에 있습니다.

예: 'Bandwidth',0.8

데이터형: single | double

경계 수정 방법으로, 'BoundaryCorrection'과 함께 'log' 또는 'reflection'이 쉼표로 구분되어 지정됩니다.

설명
'log'

ksdensity는 다음 변환 중 하나로 유계 데이터 x를 비유계 데이터로 변환합니다. 그런 다음, 밀도 추정 후에 원래 유계 범위로 다시 변환합니다.

  • 일변량 데이터에 대해 'Support','positive'를 지정할 경우 ksdensitylog(x)를 적용합니다.

  • 일변량 데이터에 대해 'Support',[L U]를 지정할 경우(여기서 LU는 숫자형 스칼라이고 L < U임), ksdensitylog((x-L)/(U–x))를 적용합니다.

  • 이변량 데이터에 대해 ksdensity는 일변량 데이터와 같은 방식으로 x의 각 열을 변환합니다.

'Bandwidth'와 값과 bw 출력값은 변환된 값 범위에 있습니다.

'reflection'

ksdensity는 경계 근처에 반사된 데이터를 추가하여 유계 데이터를 늘린 다음, 원래 지지 범위(support) 값에 대응되는 추정값을 반환합니다. 자세한 내용은 반사 방법 항목을 참조하십시오.

ksdensity'Support''unbounded'가 아닌 값으로 지정하는 경우에만 경계 수정을 적용합니다.

예: 'BoundaryCorrection','reflection'

중도절단된 항목을 나타내는 논리형 벡터로, 'Censoring'과 함께 이진 값으로 구성된 벡터가 쉼표로 구분되어 지정됩니다. 0 값은 중도절단이 없음을 나타내고, 1은 관측값이 중도절단되었음을 나타냅니다. 디폴트 값은 중도절단 없음입니다. 이 이름-값 쌍은 일변량 데이터에만 유효합니다.

예: 'Censoring',censdata

데이터형: logical

추정할 함수로, 'Function'과 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.

설명
'pdf'확률 밀도 함수.
'cdf'누적 분포 함수.
'icdf'

역누적 분포 함수. ksdensityx의 값에 대한 추정된 역 cdf를 계산하고 이를 pi에 지정된 확률 값에서 계산합니다.

이 값은 일변량 데이터에만 유효합니다.

'survivor'생존 함수.
'cumhazard'

누적 위험 함수.

이 값은 일변량 데이터에만 유효합니다.

예: 'Function','icdf'

커널 평활화 유형으로, 'Kernel'과 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.

  • 'normal'(디폴트 값)

  • 'box'

  • 'triangle'

  • 'epanechnikov'

  • 사용자 지정 함수 또는 내장 함수인 커널 함수. 함수를 함수 핸들(예: @myfunction 또는 @normpdf) 또는 문자형 벡터나 string형 스칼라(예: 'myfunction' 또는 'normpdf')로 지정하십시오. 밀도가 계산된 위치와 데이터 값 간의 거리로 구성된 배열을 하나의 인수로 갖는 지정된 함수가 소프트웨어에 의해 호출됩니다. 함수는 커널 함수의 대응 값을 포함하는 같은 크기의 배열을 반환해야 합니다.

    'Function''pdf'이면 커널 함수가 밀도 값을 반환합니다. 그렇지 않은 경우 누적 확률 값을 반환합니다.

    'Function''icdf'인 경우 사용자 지정 커널을 지정하면 오류가 반환됩니다.

이변량 데이터에 대해 ksdensity는 동일한 커널을 각 차원에 적용합니다.

예: 'Kernel','box'

xi에 균일한 간격으로 배치된 점의 개수로, 'NumPoints'와 함께 스칼라 값이 쉼표로 구분되어 지정됩니다. 이 이름-값 쌍은 일변량 데이터에만 유효합니다.

예를 들어, 표본 데이터 범위 내에 균일한 간격으로 배치된 80개 점에서 지정된 함수의 커널 평활화 추정값에 대해 다음을 입력합니다.

예: 'NumPoints',80

데이터형: single | double

밀도에 대한 지지 범위로, 'support'와 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.

설명
'unbounded'디폴트 값. 밀도가 실수 수직선 전체에 놓일 수 있도록 합니다.
'positive'밀도를 양의 값으로 제한합니다.
요소를 2개 가진 벡터, [L U]밀도 지지 범위에 대해 유한한 하한과 상한을 제공합니다. 이 옵션은 일변량 표본 데이터에만 유효합니다.
2×2 행렬, [L1 L2; U1 U2]밀도 지지 범위에 대해 유한한 하한과 상한을 제공합니다. 첫 번째 행은 하한을 포함하고, 두 번째 행은 상한을 포함합니다. 이 옵션은 이변량 표본 데이터에만 유효합니다.

이변량 데이터에 대해 'Support'[0 -Inf; Inf Inf] 또는 [0 L; Inf U]로 지정된 양의 변수, 비유계 변수 또는 유계 변수의 조합일 수 있습니다.

예: 'Support','positive'

예: 'Support',[0 10]

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

커널 밀도 플롯을 생성하는 데 사용되는 함수로, 'PlotFcn'과 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.

설명
'surf'3차원 음영 곡면 플롯으로, surf를 사용하여 생성됩니다.
'contour'등고선 플롯으로, contour를 사용하여 생성됩니다.
'plot3'3차원 선 플롯으로, plot3을 사용하여 생성됩니다.
'surfc'3차원 음영 곡면 플롯 아래의 등고선 플롯으로, surfc를 사용하여 생성됩니다.

이 이름-값 쌍은 이변량 표본 데이터에만 유효합니다.

예: 'PlotFcn','contour'

표본 데이터의 가중치로, 'Weights'와 함께 길이가 size(x,1)(여기서 x는 표본 데이터임)인 벡터가 쉼표로 구분되어 지정됩니다.

예: 'Weights',xw

데이터형: single | double

출력 인수

모두 축소

추정된 함수 값으로, 길이가 xi 또는 pts의 점 개수와 동일한 벡터로 반환됩니다.

ksdensityf를 계산하는 계산 지점으로, 벡터 또는 2열 행렬로 반환됩니다. 일변량 데이터에 대해 디폴트 값은 x의 데이터 범위를 포괄하는 균일한 간격으로 배치된 100개의 점입니다. 이변량 데이터에 대해 디폴트 값은 각 차원에서 균일한 간격으로 배치된 30개 점에서 meshgrid를 사용하여 생성된, 균일한 간격으로 배치된 900개 점입니다.

평활화 윈도우의 대역폭으로, 스칼라 값으로 반환됩니다.

'BoundaryCorrection''log'(디폴트 값)로 지정하고 'Support''positive' 또는 벡터 [L U]로 지정할 경우, ksdensity는 로그 변환을 사용하여 유계 데이터를 비유계 데이터로 변환합니다. bw의 값은 변환된 값의 범위에 있습니다.

세부 정보

모두 축소

커널 분포

커널 분포는 확률 변수의 확률 밀도 함수(pdf)에 대한 비모수적 표현입니다. 모수 분포가 데이터를 올바르게 설명할 수 없거나 사용자가 데이터 분포와 관련하여 가정을 하지 않으려는 경우 커널 분포를 사용할 수 있습니다. 커널 분포는 결과로 생성되는 밀도 곡선의 매끄러운 정도를 제어하는 평활화 함수와 대역폭 값으로 정의됩니다.

커널 밀도 추정량은 확률 변수에 대한 추정된 pdf입니다. x의 실수 값에 대해 커널 밀도 추정량 공식은 다음과 같이 주어집니다.

f^h(x)=1nhi=1nK(xxih),

여기서 x1, x2, …, xn은 알 수 없는 분포의 임의 표본이고, n은 표본 크기이며, K(·)는 커널 평활화 함수이고, h는 대역폭입니다.

x의 실수 값에 대한 누적 분포 함수(cdf)의 커널 추정량은 다음과 같이 주어집니다.

F^h(x)=xf^h(t)dt=1ni=1nG(xxih),

여기서 G(x)=xK(t)dt입니다.

자세한 내용은 커널 분포 항목을 참조하십시오.

반사 방법

반사 방법은 확률 변수가 유계 지지 범위를 가질 때 커널 밀도 추정량을 정확히 구하는 경계 수정 방법입니다. 'BoundaryCorrection','reflection'을 지정할 경우, ksdensity는 반사 방법을 사용합니다. 이 방법은 경계 근처에 반사된 데이터를 추가하여 유계 데이터를 늘리고 pdf를 추정합니다. 그런 다음, ksdensity는 원래 지지 범위에 대한 추정된 pdf의 적분이 1이 되도록, 적절한 정규화를 통해 원래 지지 범위에 대응되는 추정된 pdf를 반환합니다.

'Support',[L U]를 추가로 지정할 경우, ksdensity는 다음과 같이 커널 추정량을 구합니다.

  • 'Function''pdf'일 경우 커널 밀도 추정량은 다음과 같습니다.

    L ≤ x ≤ U에 대해 f^h(x)=1nhi=1n[K(xxih)+K(xxih)+K(xxi+h)].

    여기서 xi=2Lxi, xi+=2Uxi, xii번째 표본 데이터입니다.

  • 'Function''cdf'일 경우 cdf에 대한 커널 추정량은 다음과 같습니다.

    L ≤ x ≤ U에 대해 F^h(x)=1ni=1n[G(xxih)+G(xxih)+G(xxi+h)]1ni=1n[G(Lxih)+G(Lxih)+G(Lxi+h)].

  • 역 cdf, 생존 함수 또는 누적 위험 함수에 대한 커널 추정량을 구하기 위해('Function''icdf', 'survivor' 또는 'cumhazrd'인 경우), ksdensityf^h(x)F^h(x)를 모두 사용합니다.

'Support''positive' 또는 [0 inf]로 추가로 지정할 경우, ksdensity는 위의 방정식에서 [L U][0 inf]로 바꾸어 커널 추정량을 구합니다.

대체 기능

MATLAB® kde 함수도 일변량 데이터에 대한 pdf 또는 cdf를 추정하는 데 사용할 수 있습니다. ksdensity 함수와 달리, kde는 경계 수정 방법 또는 데이터 중도절단을 지원하지 않습니다.

참고 문헌

[1] Bowman, A. W., and A. Azzalini. Applied Smoothing Techniques for Data Analysis. New York: Oxford University Press Inc., 1997.

[2] Hill, P. D. “Kernel estimation of a distribution function.” Communications in Statistics - Theory and Methods. Vol 14, Issue. 3, 1985, pp. 605-620.

[3] Jones, M. C. “Simple boundary correction for kernel density estimation.” Statistics and Computing. Vol. 3, Issue 3, 1993, pp. 135-146.

[4] Silverman, B. W. Density Estimation for Statistics and Data Analysis. Chapman & Hall/CRC, 1986.

확장 기능

버전 내역

R2006a 이전에 개발됨