일단 내가 풀게된 문제는
Use least-squares regression to fit a straight line to
Along with the slope and intercept, compute the standard error of the estimate and the correlation coefficient. Plot the data and the regression line.
이것이었다.
Linear Least Squares Regression 에 대한 간략한 설명
Linear Least-Squares Regression 의 발상은 매우 간단하다.
Linear regression 이므로
의 형태로 두면
오차 제곱의 합을 다음과 같이 나타낼 수 있다.
이 식을
로 각각 편미분 후 0이 된다고 놓고 방정식을 풀면 (이때 오차가 최소값이 되므로)
에 대한 식이 나온다.
이를 기반으로
Standard error of the estimate (표준오차)와
Correlation Coefficient (r, 상관계수) 를 구할 수 있다.
X = [0;2;4;6;9;11;12;15;17;19];
Y = [5;6;7;6;9;8;8;10;12;12];
x_avg = mean(X'); // X 행렬 요소들의 평균
y_avg = mean(Y);
n = numel(X);
a_1 = ((n*X'*Y) - sum(X')*sum(Y))/(n*sum(X'.^2) - sum(X').^2); // regression 그래프 기울기
a_0 = y_avg - a_1*x_avg; // y절편
S_r = 0;
S_t = 0;
for i = 1:n
S_r = S_r + (Y(i,1)-a_0-a_1*X(i,1)).^2; // 참값과 regression 값의 오차 제곱의 합
S_t = S_t + (Y(i,1)-y_avg).^2; // 참값과 y의 평균값 오차 제곱의 합
end
standard_error = sqrt(S_r/(n-2));
cor_coeff = sqrt((S_t-S_r)/S_t); // correlation coefficient
a_1
a_0
standard_error %#ok<*NOPTS>
cor_coeff // 값 출력
x_approx = [0:0.1:19];
y_approx = a_0+a_1.*x_approx; // 그래프에 쓰일 x,y 값 생성
plot(x_approx,y_approx) // 그래프
axis([0 20 0 14])
xlabel('x')
ylabel('y')
title('HW#2 Problem.2')
hold on
plot(X,Y,'k.')
mean() : 행렬 요소들의 평균을 반환해주는 함수
numel() : 행렬 요소들의 갯수를 반환해주는 함수
당황했을 때는
점만 찍고 plot을 했는데 그 점들을 이은 선이 나왔을 때다.
구글링 해도 쉽사리 나오지 않아서 찾은 선택지는
더 많은 구글링이었다.
plot(x,y,s) 스타일 사용법
나는 점을 찍고 싶었으므로
plot(X,Y,'k.') 를 사용하였다.
여기서 'k'는 그래프의 색을 나타내고, '.'은 점을 의미한다.
스타일을 이용하면 점선 등 여러 방법으로 plot 할 수 있다.
plot(X,Y:m:o)
이런식으로 스타일 항에는 여러가지를 붙여서 (눈부시게) 쓸 수 있다.
나머지 스타일 값들은 아래에 적어두었으니 유용하게 쓰길 바람.
선 스타일
- | 실선 |
-- | 파선 |
: | 점선 |
-. | 일점 쇄선 |
마커 (점)
'o' | 원 |
'+' | 플러스 기호 |
'*' | 별표 |
'.' | 점 |
'x' | 십자 |
'_' | 가로선 |
'|' | 세로선 |
's' | 정사각형 |
'd' | 다이아몬드 |
'^' | 위쪽 방향 삼각형 |
'v' | 아래쪽 방향 삼각형 |
'>' | 오른쪽 방향 삼각형 |
'<' | 왼쪽 방향 삼각형 |
'p' | 펜타그램 |
'h' | 헥사그램 |
색
y | 노란색 |
m | 자홍색 |
c | 녹청색 |
r | 빨간색 |
g | 녹색 |
b | 파란색 |
w | 흰색 |
k | 검은색 |
코딩 하는 것 자체는 어렵지 않았다. 단순히 수식에 값들을 대입하는 것 뿐.
하지만 행렬과 매트랩 문법이 아직 익숙하지 않아 시간이 좀 걸렸다.
코로나 덕분에 수업시간에 매트랩을 가르쳐주지 않아서 혼자 공부하고 있는데
이게 바로 기술의 맛인지 행렬의 거부감이 좀 줄어들었다.
좋은 일인 듯.