본문 바로가기
게임 제작 관련/개발환경(프로그램)

R 선형회귀, KNN회귀 모형 그리기 (lm(), FNN패키지)

by 김바보 2022. 10. 27.

linear regression: 선형 회귀

- 독립 변수와 종속 변수 사이의 관계식(함수)를 찾아 예측값을 나타냄

- 추후 새로운 데이터를 넣었을때 관계식에 따라 예측값을 알 수 있음

 

k-nearest neighbors regression: KNN회귀

-       맞추고자 하는 데이터(새로운 데이터)를 기존에 있는 데이터에서 비슷한 값들을 찾아서 Target값의 평균(mean)내는 것

-       분류되지 않은 새로운 데이터에서 가장 가까운(nearest neighbor) 이웃을 k개 만큼 찾아, 해당 분류에 맞는 것으로 편입시키는 것.

- 한마디로, 새로운 데이터를 기존에 분류된 집단 중 어디로 편입시킬 지를 구하는 것

 

 

1. 선형회귀 시각화 (lm(): linear model 함수 이용)

1-1. 분석하려는 독립, 종속변수 임의 설정

set.seed(1) #시드세팅
x = sort(rnorm(100))
y = 3+x^2 + rnorm(100)  #rnorm(100) = error term이 됨
plot(x, y, pch = 20)

x = rnorm(100)sorting(오름차순 정렬)한 값들

y = x^2 + 3 + rnorm(100)  

x^2 + 3 그래프에서 rnorm(100)을 더 함으로써 기존 그래프에서 많이 벗어나게 됨

 

 

1-2. lm()으로 선형회귀분석

fit = lm(y~x)       #lm()한 결과를 fit 안에
fit$coefficient
--------------------------
[1]	(Intercept)    x 
    3.7565367   0.1488341

#결과값은 lm()으로 선형회귀분석을 통해 나온 해당 x,y 값들의 기울기와 절편임
#3.7565367 = 절편값
#0.1488341 = 기울기

y = 반응변수(종속변수)

x = 선형변수(독립변수)

lm()의 결과물인 fit, 모형 계수를 coefficient 이름으로 갖고 있게 됨(fit$coefficient로 호출)

Intercept = 절편

 

 

1-3. 결과물 나타내기

abline(a = fit$coefficients[1], b = fit$coefficients[2], col = 'blue')
#[]는 list값의 순서 호출
#즉 fit$coefficients[1]을 a에 넣기
#파이썬이랑 다르게 [1]이 첫번째 리스트 값이다

yTrueMean = 3+ x^2      #찐 평균, 위의 abline은 평균 대표X
lines(x, yTrueMean , lty=2, col='black')

두 개의 선을 그렸는데

abline으로 그린 파란선은 lm()을 통해 선형회귀분석한 관계식이고

lines으로 그린 검은선은 해당 변수들의 진짜 평균값들을 쭉 식으로 나타낸 것이다.

 

 

 

 

 

2. KNN 시각화 (FNN패키지 이용)

if(!require(FNN)){install.packages("FNN"); library(FNN)}

2-1. 변수 임의설정

set.seed(1)
x = sort(rnorm(100))
y = 3+x^2 + rnorm(100)

 

2-2. knnx.index 사용하기

knnx.index(기존 데이터, 기준점(새 데이터), 기준점에서 제일 가까운거 k개 뽑기)

eval.point = 0                              #KNN을 실행할 기준점(새로운 데이터), 여기선 x축
plot(x, y, pch = 20)                         #x,y에 대한 그래프 그리기
abline( v = 0, col = ‘black’)                  #x=0인 수직선 추가(eval.point)
idx = c( knnx.index(x, eval.point, k = 10) )     #idx값 구하기(eval.point 기준으로)
points( x[idx], y[idx], col = ‘red’, pch = 20)    #x[idx], y[idx]에 해당하는 점 다시 찍기
abline(h = mean(y[idx]), lty = 2, col = ‘red’)   #y[idx]의 평균 선
mean(y[idx])                               # = yhat, eval.point가 달라지면 달라짐

x = 기존에 이미 분류된 데이터들

idx = KNN분석한 값(벡터)

x, y[idx] = idx에 대한 x, y (idx 안의 순서대로 x[idx]의 반환되는 순서도 결정됨.)

yhat = 구하려고 하는 Target(=idx)의 평균

k = 분류되지 않은 데이터의 이웃 데이터 갯수(다수결에 따라 분류됨)

 

2-3. eval.point가 벡터일때(기준점이 범위일때)

eval.n = 100                                #알고리즘 시행할 선의 개수
eval.point = seq(-3,3, length= eval.n)      #-3 ~ 3 범위 내에서 100개를 긋겠다
plot(x, y, pch = 20)
idx.mat = knnx.index(x, eval.point , k = 10) #matrix출력, eval.point 기준
yhat = rep(0,eval.n)                         #yhat(y의 예측값이 들어갈 object)도 eval.n 길이에 맞게 0으로 초기화
for (i in 1:eval.n) yhat[i] = mean(y[idx.mat[i,]])  #y값 평균 100개 구해야 하니깐 for 사용해서 100번 평균 구해줌
lines(eval.point , yhat, type= ‘l’, lty = 2, col = ‘red’)

x값이 -3과 3에 eval.n = 100, 즉 기준선을 100개를 그어서 각각 KNN을 시행하겠다는 것이다.

해당 붉은 line은 knnx.index를 사용해 구한 기존 변수들의 평균을 선으로 표현한 것이다.

댓글