일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 깃허브
- 자바스크립트 기본 문법
- 자바스크립트 jQuery
- 보안뉴스 요약
- 카카오프로젝트
- numpy
- 자바스크립트 node
- 랜섬웨어
- 보안뉴스 한줄요약
- 자바스크립트 element api
- 보안뉴스
- 파이썬
- oracle
- 자바스크립트 API
- php
- oracle db
- 자바스크립트 객체
- 다크웹
- 자바스크립트
- 보안뉴스요약
- 카카오프로젝트100
- 카카오프로젝트 100
- GIT
- 자바스크립트 prototype
- javascript
- ES6
- python
- Oracle SQL
- 오라클
- 보안뉴스한줄요약
- Today
- Total
FU11M00N
[ numpy ] 다중 회귀분석 본문
- 다중 회귀분석
변수가 2차원 데이터라면 아래와 같이 예를 들어 데이터를 볼 수 있습니다.
x1 = [1,2,3,4]
x2 = [2,2,4,1]
y = [ 4, 6, 10, 9 ]
이 데이터는
y = 2 * x1 + x2
이 관계를 이루고 있으며 두 개의 상관계수 2, 1로 이뤄진 관계입니다.
변수가 하나 늘어난 것만으로도 이를 한눈에 풀기는 상당히 어려워지며
여기에 상수까지 추가될 경우 직관적으로 관계를 알아채기는 쉽지 않습니다.
하지만 결국 위의 문제는 데이터의 차원이 증가했을 뿐 각각의 변숫값이 각각의 계수와 1차원적으로 결합된 형태이며 이는 기존의 회귀분석으로 충분히 해결이 가능합니다.
- 다중 변수 입력값 생성
회귀분석 라이브러리는 기본적으로 다중회귀분석을 지원하도록 설계되어 있으며
이 때문에 변수 값이 하나라도 항상 이를 배열 속에 넣어서 입력하도록 요구합니다.
변수가 하나인 회귀분석에서는 이 때문에
x1 = [1,2,3]
x:
[[1]
[2]
[3]]
형태로 reshape 하여 사용했습니다.
값이 하나 이상인 경우는 다음과 같이 구성합니다.
x1 = [1,2,3,4]
x2 = [2,2,4,1]
x :
[[1 2]
[2 2]
[3 4]
[4 1]]
이는 conatenate 나 c_ 를 사용하면 간단하게 해결이 된다. 먼저 데이터 x1과 x2를 하나의 배열로 묶어줍니다.
x1 = np.array([1,2,3,4])
x2 = np.array([2,2,4,1])
x = np.c_[x1, x2]
print(x)
이제 y 값을 추가해서 회귀분석을 실행해보도록 하겠습니다
이미 x의 값은 2차 원화 되어 있으므로 따로 reshape를 할 필요가 없습니다.
y = np.array( [ 4, 6, 10, 9 ] )
regr.fit(x,y)
아무 에러 회귀분석이 수행된 걸 볼 수 있다. 이를 찍어보면 계수 값 (coef_) 은 해당 입력에 대한 각각의 계수 2와 1의 를 배열로 갖고 있습니다.
print("coef:", regr.coef_ )
coef: [3.00065477]
- 회귀 분석 결과를 이용해 y값 유추
coef_ 값은 문제는 그래프로 쉽게 표현되던 x->y의 관계에 비해 x1,x2 -> y 의 관계는
이를 시각화시키기가 쉽지 않습니다.
하지만 x 입력에 coef를 곱한 후에 더해줌으로써 유추된 상관계수를 사용한 결괏값과 실제 y값을 비교해 볼 수 있다.
이를 위해 먼저 x와 coef를 곱해줍니다.
y_ = regr.coef_ * x
print(y_)
이 결과 [ x1 * 2, x2 * 1 ] 들의 배열이 구성됩니다.
좌측과 우측의 값을 더하면 됩니다.
이때 np.sum을 사용하도록 하겠다.
np.sum 은 각 축별로 합산 값을 구해줍니다.
## np.sum 사용법
data = np.array([[1,2], [3,4]])
np.sum(data, axis = 0 )
-> [4,6]
np.sum(data, axis = 1 )
-> [3, 7]
이제 np.sum을 이용해 위의 x를 가로축으로 합산해주면 다음과 같습니다.
print( np.sum(y_, axis = 1) )
이것은 결국 x1 * 2 + x2 * 1의 값이 되어 y 값과 같아짐을 알 수 있습니다.
스코어 역시 바로 x, y를 대입해서 얻을 수 있습니다.
print(regr.score(x,y))
오차가 없는 선형 데이터 이므로 결정계수가 1가 출력됩니다.
- 다중 회귀 분석 예제
# 다음의 데이터를 회귀 분석하여 계수값과 상수값 , 결정 개수 구하기
x1 = np.array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
x2 = np.array([0.9, 0.7, 0.2, 0.9, 0.6, 0. , 0.1, 0.6, 0.9, 0.7])
y = np.array([0.69, 0.85, 0.48, 0.75, 0.68, 0.59, 0.65, 0.87, 1.06, 1.16])
# 시작
x = np.c_[x1,x2]
regr.fit(x,y)
print(regr.coef_)
print(regr.intercept_)
print(regr.score(x,y))
2차원 시각화
x1, x2 -> y를 도표화시키기는 쉽지 않지만 (3차원 그래프를 사용해야 가능) 이미지로 표현은 가능합니다.
다음과 같은 관계를 갖는 x1, x2와 y를 생각해보겠습니다.
y = x1 + x2
이때 다음은 100개의 0~9까지의 x1과 x2의 조합을 만들어 더해줍니다.
x1, x2 = np.ogrid[:10, :10]
print(x1 + x2)
좌측 상단은 x1, x2 가 0,0 이므로 0 + 0이며 제일 우측 하단은 9 + 9로 18이 들어갑니다.
이를 이미지화시키면 다음과 같습니다.
plt.imshow(x1 + x2, cmap = 'gray')
이 원리를 이용하여 위에서 다뤘던
x1 = [1,2,3,4]
x2 = [2,2,4,1]
y = [ 4, 6, 10, 9 ]
회귀 분석한 결과인 아래와 같이 시각화 가능합니다.
coef: [2. 1.]
x1,x2 = np.ogrid[:10, :10]
plt.imshow( x1 * 2 + x2 , cmap = 'gray')
결과적으로 다음 코드는 회귀분석의 결과를 흑백 이미지로 시각화시켜줍니다.
x1,x2 = np.ogrid[:10, :10]
c = regr.coef_
plt.imshow( x1 + c[0] + x2 + c[1] + regr.intercept_ , cmap = 'gray)
# 해당 데이터 시각화 하기
x1 = np.array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
x2 = np.array([0.9, 0.7, 0.2, 0.9, 0.6, 0. , 0.1, 0.6, 0.9, 0.7])
y = np.array([ 7.3, 8.3, 10.2, 8.5, 9.8, 12. , 12.1, 11. , 10.5, 11.5])
'AI > Numpy' 카테고리의 다른 글
[ numpy ] 분류(classification) 와 회귀분석 (0) | 2021.04.12 |
---|---|
[ numpy ] 다항 회귀분석 (0) | 2021.04.05 |
[ Numpy ] 회귀분석 , 선형 회귀분석 , sklearn.linear_model , 결정계수 (0) | 2021.04.05 |
[ Numpy ] numpy 변환 (append, concatenate, c_, r_ , swap, flip) (0) | 2021.03.29 |
[ Numpy ] numpy 조건문, 배열의 비교연산 , and or ! , where (0) | 2021.03.29 |