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를 사용해 구한 기존 변수들의 평균을 선으로 표현한 것이다.
'게임 제작 관련 > 개발환경(프로그램)' 카테고리의 다른 글
R 포맷 변경법(reshape2 패키지), wide format <-> long format (1) | 2022.12.01 |
---|---|
R plot함수 (0) | 2022.10.27 |
R 시각화(그래프 그리기) 전 준비 (0) | 2022.10.27 |
Python Turtle 모듈 응용(디지털 시계 만들기) (1) | 2022.10.14 |
Python format함수(문자열 출력 방법) (0) | 2022.10.14 |
댓글