상세 컨텐츠

본문 제목

<Python> : : Linear Regression python modeling 2가지 방법 (Scikit-learn vs python modeling )

프로그래밍

by 스터디올 2022. 8. 2. 22:34

본문

반응형

<Python model>에 앞서 어떻게 구현할 것인가에 대한 수학적인 해석이다. 

 

1. Linear Regression 이라는 것은 선형 회귀라고 표현한다. 이는 수많은 데이터를 대표할 만한 선을 찾는 거라고 생각하면 된다. 그렇다면 대표할 만한 선은 어떻게 찾을까?

 

2. 수많은 data들을 각각 (x, y) 좌표 형식으로 표현 가능하다고 하자. 그렇다면 대표할 만한 선은 

a_0  + a_1*x = y  로 표현 할 수 있을 것이다.   다만 data는 실제 data라고 한다면 온전히 선으로 표현되지 많은 않고 error 즉 오차가 존재할 것이다. 그렇다면 나는 아래와 같이 modeling을 할 수 있다. 

 

a_0  + a_1*x + e = y (여기서 e는 error를 의미한다.)

 

3. 자 modeling을 했다면 가장 적합한 a_0, a_1을 찾는 것이 목표가 될 것이다. 모든 data의 error의 합이 최소가 되도록 많드는 a_0와 a_1이 우리가 찾는 적합한 a_0와 a_1일 것이다. 

식을 변형하면 아래와 같다. 

∑e = ∑(y - a_0  - a_1*x)

error는 절대값으로 계산을 해야 최소 오차를 구할 수 있기때문에 양변에 제곱을 해서 생각하자 . 

∑e^2 = ∑(y - a_0 - a_1*x)^2

해당 식을 변수 a_0 와 a_1로 미분을 해서 식을 정리하면 아래와 같다. S는 e^2을 임의로 저렇게 표현하였다. 

두 식을 정리하면 

총 n 개의 data라고 했을때 a_0 와 a_1은 아래와 같다. 

자 이게 얼핏 보기에 매우 복잡해 보인다. 하지만 우리가 x_i 와 y_i 의 data set을 가지고 있으므로 각각의 곱의 합 / 제곱의 합 / 합의 제곱 / 평균 등을 알기 때문에 충분히 python으로 구현 할 수 있다. 그렇다면 지금부터  random data set을 만들어 비교해보는 code를 살펴보자. 

 

1. random set 을 만들어 확인해 본다. 

rnstate = np.random.RandomState(1)
x = 10 * rnstate.rand(50)
y = 2 * x - 5 + rnstate.randn(50)
plt.scatter(x, y)
plt.show()

2. 위에서 구했던 수식을 통해 a_1 과 a_0를 구한다.

#1 
xy = x*y
sum_xy = np.sum(xy)
#2 
sum_x = np.sum(x)
sum_y = np.sum(y)

#3
sum_x_2 = np.sum(x**2)

a_1 = (50 * sum_xy - sum_x*sum_y) / (50*sum_x_2 - sum_x**2)
a_0 = np.mean(y) - a_1 * np.mean(x)

print(a_1, a_0)

우리가 위에서 randomize 했을때 결과와 거의 비슷하게 구해진것을 확인할 수 있다. 

 

3. 그래프로 비교해보자. 

scikit-learn을 통해 modeling하는 것은 글이 너무 길어져 다음 글에 마져 작성해야 겠다. 

반응형

관련글 더보기

댓글 영역