당신은 주제를 찾고 있습니까 “비선형 회귀분석 예제 – SPSS를 활용한 회귀분석 – (12) 비선형 회귀분석(Nonlinear Regression Analysis)“? 다음 카테고리의 웹사이트 ppa.charoenmotorcycles.com 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.charoenmotorcycles.com/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 통계파랑 이(가) 작성한 기사에는 조회수 1,015회 및 좋아요 4개 개의 좋아요가 있습니다.
비선형 회귀분석 예제 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 SPSS를 활용한 회귀분석 – (12) 비선형 회귀분석(Nonlinear Regression Analysis) – 비선형 회귀분석 예제 주제에 대한 세부정보를 참조하세요
비선형 회귀분석(Nonlinear Regression Analysis)
두 변수가 1차함수가 아닌 다른 관계에 있을 때
다음과 같은 함수를 추정할 때 주로 사용됩니다.
y = β0*(1-e^(-β1*x))
y = β0*x1^(β1)*x2^(β2)*e^ε
y = β0 + β1*exp^(β2*x) + ε
y = (β0*x)/(β1+x)
독립변수와 종속변수의 관계가
독립변수(x)의 개수가 아니라
모수(β)에 의존하는 형태입니다.
– 오픈카톡 상담 문의 –
https://open.kakao.com/me/statparang
– 통계분석 수행방법 참고 포스팅 –
https://blog.naver.com/statstorm/221620106755
– SPSS/AMOS/SAS/STATA/R/PYTHON 과외문의 –
https://blog.naver.com/statstorm/222116340085
비선형 회귀분석 예제 주제에 대한 자세한 내용은 여기를 참조하세요.
5.8 비선형 회귀 | Forecasting: Principles and Practice – OTexts
이 예제에서는 x=t x = t 로 두고 조각별 선형 추세를 시계열에 맞춥니다. 이런 방식으로 구성한 조각별 선형 관계는 회귀 스플라인(regression splines)의 특수한 경우 …
Source: otexts.com
Date Published: 8/25/2021
View: 1850
비선형 회귀분석 – IBM
비선형 회귀분석은 종속변수와 독립변수 세트 간의 비선형 관계 모형을 탐색하는 방법 … 회귀분석 프로시저)을 사용하여 추정할 수 있다는 것은 유의하십시오. 예제.
Source: www.ibm.com
Date Published: 1/22/2021
View: 2483
(12) 비선형 회귀분석(Nonlinear Regression Analysis) 모든 답변
비선형 회귀분석 예제 주제에 대한 자세한 내용은 여기를 참조하세요. 5.8 비선형 회귀 | Forecasting: Principles and Practice – OTexts. 이 예제에서는 …
Source: you.covadoc.vn
Date Published: 5/6/2021
View: 2408
【통계학】 17강. 비선형 회귀분석 – 정빈이의 공부방
비선형 회귀분석(non-linear regression model) 추천글 : 【통계학】 통계학 목차 1. 이차회귀모델 [본문] 2. … ③ 예제. ○ 문제 상황 …
Source: nate9389.tistory.com
Date Published: 11/15/2022
View: 9859
[머신러닝] 파이썬 단순 선형 회귀분석 & 비선형 회귀분석 예제 …
[머신러닝] 파이썬 단순 선형 회귀분석 & 비선형 회귀분석 예제 소스코드. cuffti 2021. 8. 20. 23:02. ※ 전체 소스코드는 글 최하단에 있습니다.Source: sightsee.tistory.com
Date Published: 6/7/2022
View: 9231
3. 선형 & 비선형 Modeling – Must Learning with R
Linear Regression(선형 회귀분석)과 Non – Linear Regression(비선형 회귀분석)을 잠깐 다루고 가겠습니다. 사람들이 회귀분석을 돌릴 때, …
Source: wikidocs.net
Date Published: 9/21/2021
View: 7413
SPSS 비선형 회귀분석 알아보기 – 네이버 블로그
오늘은 SPSS에서 고난이도중의 하나인 비선형 회귀분석 알아도보록 하겠습니다. 거의 모든 논문통계분석에서는 선형모형으로 사용이 되니깐 정말 …
Source: m.blog.naver.com
Date Published: 7/26/2022
View: 7834
[AL] Regression – 단순/다중/비선형 회귀 분석
Title : [AL] Regression – 단순/다중/비선형 회귀 분석 — Reference : acorn, googling — Key word : 단순 회귀 분석 다중 회귀 분석 simple …
Source: dbrang.tistory.com
Date Published: 10/5/2022
View: 7034
주제와 관련된 이미지 비선형 회귀분석 예제
주제와 관련된 더 많은 사진을 참조하십시오 SPSS를 활용한 회귀분석 – (12) 비선형 회귀분석(Nonlinear Regression Analysis). 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 비선형 회귀분석 예제
- Author: 통계파랑
- Views: 조회수 1,015회
- Likes: 좋아요 4개
- Date Published: 2021. 2. 12.
- Video Url link: https://www.youtube.com/watch?v=OIFRZQHYGHw
Forecasting: Principles and Practice
5.8 비선형 회귀
지금까지 이 장에서 선형 관계를 가정하는 것이 종종 적절하긴 했지만, 비선형 형태가 더 적당한 경우가 많이 있습니다. 이 절에서는 내용을 좀 더 쉽게 설명하기 위해, 단 하나의 예측변수(predictor variable) \(x\)만 있다고 가정합니다.
비선형적인 관계를 모델링하는 가장 단순한 방법은 회귀 모델을 추정하기 전에 목표 예상변수(forecast variable) \(y\)와 예측변수(predictor variable) \(x\)를 변환하는 것입니다(또는 \(y\)나 \(x\) 중의 하나를). 여기에서 비선형적인 함수 형태를 얻긴 하지만, 모델은 매개변수에 대해 여전히 선형적입니다. 가장 흔히 사용하는 변환은 (자연) 로그입니다(3.2 절을 보시길 바랍니다).
로그-로그 함수 형태는 다음과 같습니다. \[ \log y=\beta_0+\beta_1 \log x +\varepsilon. \] 이 모델에서, 기울기 \(\beta_1\)는 탄력성으로 해석할 수 있고, \(\beta_1\)은 \(x\)가 \(1\%\) 증가할 때 \(y\)의 평균 백분율 변화입니다. 다른 유용한 형태들도 적을 수 있습니다. 로그-선형 형태는 목표 예상변수(forecast variable)만 변환하여 적고 선형-로그 형태는 예측변수(predictor variable)를 변환하여 얻습니다.
변수를 로그 변환하기 위해서는, 모든 관측된 값이 0보다 커야한다는 것을 떠올려봅시다. 변수 \(x\)가 0인 값을 가지고 있는 경우에는 \(\log(x+1)\)와 같은 변환을 사용합니다. 즉, 변수 값에 1을 더하여 로그를 취합니다. 이렇게 하여 0 때문에 생기는 문제를 피하고 로그를 취하는 것과 비슷한 효과를 냅니다. 이 경우도 변환된 눈금에서 0이 남아있는 원래의 눈금에서의 0 값 때문에 생기는 부작용을 가지고 있습니다.
단순하게 데이터를 변환하는 것이 적절하지 않을 경우가 있기에 더욱 일반적으로 적는 것이 필요할 수 있습니다. 그러면 사용할 모델은 다음과 같습니다. \[ y=f(x) +\varepsilon \] 여기에서 \(f\)는 비선형 함수입니다. 표준 (선형) 회귀에서, \(f(x)=\beta_{0} + \beta_{1} x\)입니다. 따라나오는 비선형 회귀 형태에서는 \(f\)를 단순히 로그나 다른 변환에 비해 더욱 유연한 \(x\)에 관한 비선형 함수로 둡니다.
가장 단순하게 적는 방법 중의 하나는 \(f\)를 조각별 선형(piecewise linear)으로 만드는 것입니다. 즉, \(f\)의 기울기가 변할 수 있는 점을 도입합니다. 이러한 점을 “매듭(knots)”으로 부릅니다. \(x_{1,t}=x\)로 두고 변수 \(x_{2,t}\)을 도입하여 다음과 같이 적을 수 있습니다. \[\begin{align*} x_{2,t} = (x-c)_+ &= \left\{ \begin{array}{ll} 0 & x < c\\ (x-c) & x \ge c \end{array}\right. \end{align*}\] 기호 \((x-c)_+\)는 양수일 때 \(x-c\) 값을 의미하고 이외에는 0입니다. 이렇게 하여 \(c\) 점에서 기울기가 구부러지도록합니다. 위의 형태에서 추가적인 변수를 더하여 관계식에서 구부러진 부분을 더 넣을 수 있습니다. 이 예제에서는 \(x=t\)로 두고 조각별 선형 추세를 시계열에 맞춥니다. 이런 방식으로 구성한 조각별 선형 관계는 회귀 스플라인(regression splines)의 특수한 경우입니다. 일반적으로, 선형 회귀 스플라인은 아래 관계식을 이용하여 얻습니다. \[ x_{1}= x \quad x_{2} = (x-c_{1})_+ \quad\dots\quad x_{k} = (x-c_{k-1})_+ \] 여기에서 \(c_{1},\dots,c_{k-1}\)은 매듭(선이 휠 수 있는 점)입니다. 매듭(knot)의 수(\(k-1\))를 고르는 것과 어디에 두어야 하는 지는 어려울 수 있고 약간 임의적일 수 있습니다. 자동으로 매듭을 고르는 알고리즘 몇몇을 몇몇 소프트웨어에서 사용할 수 있습니다만, 아직까지 널리 사용되는 것은 아닙니다. 조각별 선 대신 단계적 3차식으로 더 매끄러운 결과를 얻습니다. 이 경우는 제한조건이 걸려있어서 연속적이고(서로 연결되어있는) 매끄럽습니다(따라서 조각별 선형 스플라인에서 나타나는 갑작스런 방향 변화가 없습니다.) 일반적으로 3차(cubic) 회귀 스플라인은 다음과 같이 적습니다. \[ x_{1}= x \quad x_{2}=x^2 \quad x_3=x^3 \quad x_4 = (x-c_{1})_+ \quad\dots\quad x_{k} = (x-c_{k-3})_+. \] 3차 스플라인이 보통 데이터에 더 잘 맞는 결과를 냅니다. 하지만, \(x\)가 과거 데이터의 범위를 넘어갈 때 \(y\) 값 예측값을 신뢰할 수 없게 됩니다.
비선형 회귀분석
비선형 회귀분석은 종속변수와 독립변수 세트 간의 비선형 관계 모형을 탐색하는 방법입니다. 기존의 선형 회귀분석(선형 모형 추정에만 제한됨)과 달리 비선형 회귀분석에서는 종속변수와 독립변수 간의 임의적 관계를 통해 모형을 추정할 수 있습니다. 이 방법에서는 반복 추정 알고리즘을 사용합니다. 이 프로시저는 Y = A + BX**2 형식의 단순 다항에서는 필요하지 않습니다. W = X**2를 정의하여 단순 선형 모형인 Y = A + BW를 구할 수 있으며 이 모형은 기존의 방법(예: 선형 회귀분석 프로시저)을 사용하여 추정할 수 있다는 것은 유의하십시오.
예제. 시간을 기준으로 인구를 추정할 수 있습니까? 산점도를 통해서 보면 인구와 시간 간에는 강한 관계가 있는 것처럼 보이지만 이러한 관계는 비선형이기 때문에 비선형 회귀분석 프로시저의 특별한 추정 방법이 요구됩니다. 로지스틱 인구 증가 모형과 같은 적절한 방정식을 세워 이 모형에 적합한 추정값을 구함으로써 실제 측정되지 않은 시간에 따른 인구를 추정할 수 있습니다.
통계. 각 반복에 대해 모수 추정값과 잔차 제곱합 통계를 구합니다. 각 모형에 대해 회귀 제곱합, 잔차, 비수정 총계와 수정 합계, 모수 추정값, 근사 표준 오차, 모수 추정값의 근사 상관 행렬 통계를 구합니다.
비선형 회귀분석 데이터 고려 사항
데이터. 종속변수와 독립변수는 양적변수이어야 합니다. 범주형 변수(예: 종교, 전공, 거주 지역)는 이분형(더미) 변수나 다른 유형의 대비변수로 코딩 변경되어야 합니다.
가정. 종속변수와 독립변수 간의 관계를 정확하게 설명하는 함수를 지정한 경우에만 결과가 유효합니다. 또한 적합한 시작값을 선택하는 것도 매우 중요합니다. 모형의 올바른 함수 형식을 선택한 경우라도 시작값을 잘못 선택하면 모형이 수렴되지 않거나 전체 최적 해법을 얻지 못하고 부분 최적 해법을 얻게 됩니다.
관련 프로시저. 비선형 모형에 맨 처음 나타나는 모든 모형을 선형 모형으로 전환할 수 있으며 선형 회귀분석 프로시저를 사용하여 분석할 수 있습니다. 적절한 모형을 잘 모르는 경우에는 곡선 추정 프로시저를 사용하면 데이터에 유용한 함수 관계식을 확인할 수 있습니다.
비선형 회귀분석 구하기
이 기능을 사용하려면 SPSS® Statistics Standard Edition 또는 회귀분석 옵션 설치가 필요합니다.
메뉴에서 다음을 선택합니다. 분석 > 회귀분석 > 비선형… 활성 데이터 세트의 변수 목록에서 숫자 종속변수를 하나 선택합니다. 모형 표현식을 작성하려면 모형 필드에 표현식을 입력하거나 구성요소(변수, 모수, 함수)를 붙여넣습니다. 모수 를 클릭하여 모형의 모수를 확인합니다.
세그먼트 모형(다른 도메인 부분에서 서로 다른 형식을 취하는 모형)은 단일 모형문 내에서 조건 논리를 사용하여 지정해야 합니다.
이 프로시저는 NLR 명령 구문을 붙여넣습니다.
비선형 회귀분석 예제 | Spss를 활용한 회귀분석 – (12) 비선형 회귀분석(Nonlinear Regression Analysis) 모든 답변
We are using cookies to give you the best experience on our website.
You can find out more about which cookies we are using or switch them off in settings.
【통계학】 17강. 비선형 회귀분석
17강. 비선형 회귀분석(non-linear regression model)
추천글 : 【통계학】 통계학 목차
1. 이차회귀모델(quadratic regression model)
⑴ 수식화
⑵ 계수 결정
① 다중선형회귀모델 이용 : X i 와 X i 2를 서로 다른 변수로 간주하고 해석
② X i 와 X i 2는 완전 다중공선성(perfect multi-collinearity)이 없으므로 가능
⑶ 선형성 테스트(linearity test)
⑷ 변화량의 신뢰구간
① 효과(effect) : X의 단위변화에 따른 Y의 효과는 다음과 같음
② marginal effect
③ 변화량의 표준편차
④ 변화량의 신뢰구간
2. 다항회귀모델(polynomial regression model)
⑴ 일반식
⑵ 계수 결정 : 다중선형회귀모델 이용
⑶ 선형성 테스트(linearity test)
⑷ 차수 결정 방법 1. top-down 방식
① 가장 일반적으로 채택되는 방식
② 1st. 최대치 r을 설정
③ 2nd. H 0 : β r = 0을 검정
④ 3rd. H 0 를 기각할 경우 r이 회귀선의 차수
⑤ 4th. H 0 를 기각하지 못하면 X i r을 제거하고 β r-1 , ···에 대해서 2nd를 반복
⑸ 차수 결정 방법 2. bottom-top 방식
① 한 단계 차수가 높은 항을 추가했을 때 주어진 샘플을 설명하는 데 유의미한 효과가 있는지를 보는 방식
② 과정
○ 1st. r-1차 다항식까지 bottom-top 방식으로 모든 항의 계수가 유의미하다고 가정
○ 2nd. r차 항을 추가
○ 3rd. r차 회귀선에 의한 제곱합을 계산 (자유도 : r)
○ 4th. 3rd에서 계산한 값에 r-1차 회귀선에 의한 제곱합 (자유도 : r-1)을 뺌
○ 5th. r차 회귀선의 잔차에 의한 제곱합 (자유도 : n-1-r)을 계산
○ 6th. 5th에서 계산한 값을 n-1-r로 나누어 평균제곱을 계산
○ 7th. 4th에서 얻은 제곱합의 차를 6th에서 얻은 평균제곱으로 나눔 : 제곱합의 차의 자유도는 1
○ 8th. 7th에서 얻은 F 통계량을 F(1, n-1-r)에 대입하여 p value 계산
③ 예제
○ 문제 상황
모델 제곱합 df 평균제곱 Linear 3971.46 1 3971.46 Error 372515.09 18 20695.28 Quadratic 367833.58 2 183916.79 Error 8652.97 17 509.10 Cubic 369211.71 3 123070.57 Error 7274.84 16 454.6 8
Table. 1. 문제 상황
○ 결과표
모델 제곱합의 차 df 잔차 제곱합 df 잔차 제곱합의 평균 F 비 Quadratic 367833.58 2 8652.97 17 509.10 F 1,17 = 714.72 Linear 3971.46 1 P < 0.001 Difference 363862.12 1 Cubic 369211.71 3 7274.84 16 454.68 F 1,16 = 3.03 Quadratic 367833.58 2 NS Difference 1378.13 1 Table. 2. 결과표 ④ 단점 : sequential type Ⅰ error accumulation이 논란이 됨 ○ 통계라는 학문은 한 번에 나타난 현상을 가지고 분석하는 것 ○ 특정 확률을 갖고 나타난 현상에 대해 다시 거기서 다른 확률을 갖는 현상을 분석하는 굉장히 까다로움 ○ 까다롭다는 의미는 F 분포를 따르지 않을 수도 있다는 의미 ○ bottom-top 방식의 차수 결정 방법은 특정 확률의 현상에서 다른 확률의 현상을 분석하는 것 ○ 특정 확률의 현상은 r-1차 회귀식을 지칭하는 것임 ○ 다른 확률의 현상은 r차 회귀식을 지칭하는 것임 ○ (주석) 분명하게 F 분포를 따름을 증명할 수 없는 듯 3. 로그회귀모델(logarithm regression model) ⑴ (참고) 로그 근사식 ⑵ 종류 1. 선형-로그 모델(linear-log model) ① 수식화 ② X i 가 1% 증가하면 Y i 는 0.01β 1 만큼 증가 ⑶ 종류 2. 로그-선형 모델(log-linear model) ① 수식화 ② X i 가 1만큼 증가하면 Y i 는 100β 1 % 만큼 증가 ⑷ 종류 3. 로그-로그 모델(log-log model) ① 수식화 ② X i 가 1% 증가하면 Y i 는 β 1 % 만큼 증가 ⑸ adjusted R2를 비교하여 로그-선형 모델과 로그-로그 모델 중 더 적합한 모델을 선택할 수 있음 ⑹ 선형-로그 모델은 종속변수의 종류가 다르므로 다른 모델과 adjusted R2를 비교하는 것은 무의미 4. 확률 모델(probability model) : 종속변수가 이진변수(binary variable)인 경우 ⑴ 선형 확률 모델(LPM, linear probability model) ① 수식화 Figure. 1. 선형 확률 모델 ② 문제점 : 종속변수가 항상 0 ~ 1 사이의 값을 보여주지 않음 ⑵ probit regression model ① 개요 : 확률 모델로서 가장 자주 사용함 ② 수식화 ○ 단순 모델 Figure. 2. probit regression model ○ 다중 모델 ③ 효과(effect) ○ 수식화 ○ marginal effect ④ 통계적 추정 ○ 각 계수의 추정량의 정확한 함수의 형태가 있는 것은 아님 : 수치해석을 통해 최대우도추정량을 구함 ○ 일단 구해진 최대우도추정량은 일관성(consistency)과 정규근사성(asymptotically normality)을 만족 ⑶ logistic regression model ① 수식화 ○ 로지스틱 함수(logistic function) ○ 모델링 : linear regression 형태인 βx + β 0 를 linking function인 로지스틱 함수에 넣음 ○ log-odd (logarithmic of odds ratio) : logit이라고도 함 Figure. 3. logit 함수 ② 최대우도 추정 ○ 독립변수를 1차원 변수 x i 가 아닌 다차원 변수 x i 로 가정하고 베르누이 함수를 이용 ○ 우도함수 L(θ)와 로그우도함수 ℓ(θ)의 정의 : 여기서 정의된 L(θ)는 cross-entropy의 일종 ○ 정리 : L(θ)와 ℓ (θ)는 convex function : 극소해는 local solution이 아니라 global solution이 됨. 증명은 다소 복잡 ○ 단계 1. 그래디언트의 정의 ○ 단계 2. 헤세 행렬의 정의 ○ 단계 3. θ k 에 대하여 테일러 급수를 구하여 2차 근사식을 구하고 근사식의 극대해 θ k+1 = θ k + d k 를 구함 Figure. 4. 최대우도 추정과 테일러 급수의 관계 ○ 단계 4. 뉴턴-랩슨법(Newton-Raphson method)처럼 θ k 를 업데이트하면 global maximum에 도달함 ○ 이와 같이 수치해석으로 구할 뿐 각 계수의 추정량의 정확한 함수 형태가 있는 것은 아님 ③ 일관성 증명에 대한 발상 (단, 기호가 위와 다를 수 있음에 유의) ④ 정규근사성 증명에 대한 발상 (단, 기호가 위와 다를 수 있음에 유의) ⑦ 응용 : multiclass classification ○ 서론 : logistic regression은 binary classification이므로 이를 multiclass classification에 직접 이용할 수 없음 ○ 방법 1. 1 vs {2, 3}을 한 후 2 vs 3과 같이 하는 방식 ○ 방법 2. softmax 함수 ○ 정의 ○ multiclass classification에서의 softmax 함수 ○ 증명 : logistic regression은 softmax 함수의 특수한 예임 ⑷ 종합 ① LPM, probit, logistic 간에 계수를 비교할 수 없음 : 모델이 다르므로 ○ 예 1. probit regression model과 logistic regression model의 비교 ○ 굉장히 유사한 플롯을 보여줌 Figure. 5. probit regression model과 logistic regression model의 비교 ○ 계수 차이는 굉장히 크게 남 : 이 차이에 어떤 수학적 의미는 없음 5. 상호작용(interaction) ⑴ 모델링 ① interaction regressor 또는 interaction term을 도입 ② 상호작용 항이 없는 모델과 계수를 비교할 수 없음 ③ 셋 이상의 다중 상호작용도 정의할 수 있음 ⑵ 효과(effect) : X i 의 단위 변화에 대한 Y i 의 효과는 다음과 같음 ⑶ 탄력성(elasticity) ① 직관적으로 기울기의 절대값이 큰 정도를 의미 ② 미시경제학에서 탄력성은 기울기에 (-1)을 곱한 것을 의미 ⑷ 응용 : 이진변수의 상호작용 ① 모델링 ② 효과 : X의 단위 변화에 따른 Y의 효과는 다음과 같음 ③ H 0 : Y가 D에 영향을 받지 않음은 β 2 = β 3 = 0을 검정하는 F 통계량 이용. determinant check ④ H 0 : X의 단위 변화에 따른 Y의 효과가 D에 영향을 받지 않음은 β 3 = 0을 검정하는 t 통계량 이용 ⑤ D = 0인 회귀선과 D = 1인 회귀선을 통해 전체 회귀선을 구할 수 있음 ⑸ 응용 : 두 개의 이진변수(더미변수)의 상호작용 ① 모델링 ② D 1 , D 2 에 대한 2 × 2 테이블을 알면 회귀선 식을 유도할 수 있음 입력 : 2019.06.21 12:10 반응형
[머신러닝] 파이썬 단순 선형 회귀분석 & 비선형 회귀분석 예제 소스코드
※ 전체 소스코드는 글 최하단에 있습니다
※ Levenberg Method 및 Levenberg-Marquardt Method의 경우 damping factor를 계속 update해야 하는데 update하지 않도록 코드를 짰다.. 수정할 예정입니다!!!!
간단 이론 정리
선형 회귀는 주어진 데이터에 가장 잘 fit하는 선형 모델을 구하는 것이다. 모델이 주어진 데이터에 가장 잘 fit할 때 잔차(=추정값-실제값)의 합은 최소가 되며, 이때 likelihood/우도/가능도는 최대가 된다. likelihood/우도/가능도는 모델이 주어졌을 때 데이터가 관측될 확률을 말한다. 이를 응용하여, 우도/가능도를 최대화하여 선형 회귀를 하는 방법을 MLE(Maximum Likelihood Estimation)/최대 우도 추정이라고 한다. 위 이미지의 ①, ②는 우도를 최대하는 방법으로부터 모델이 fit할 때의 a, b 값을 구하는 방법을 나타내는 수식들이다. ②는 ①의 양변에 log를 씌운 결과다.
선형 회귀의 모수 추정 방법으로는 크게 두 가지가 있다. 바로 경사하강법(Gradient Descent)과 최소제곱법(Least Square)이다. 경사하강법은 iteration(반복)을 이용한 방법이다. iteration을 이용한 방법은 초깃값, step size을 잘 정하는 것이 중요하다. 위 그림에서 경사하강법 부분에 써놓은 식은 반복할 때마다 a, b의 값을 어떻게 갱신할 것인지를 나타낸다. 최소제곱법에는 크게 두 가지 방법이 있다. 해석적(analytic)인 방법은 오차 함수가 최솟값을 가질 때 이는 극값일 것이므로 오차 함수의 a, b 각각에 대한 편미분이 0일 것이라고 간주하고 그때의 a, b값을 구하는 것이다. 이때 역행렬을 이용하여 연립방정식을 풀며, inverse를 이용한다. 대수적(algebric)인 방법은 모든 실험데이터의 (x, y)쌍을 이용하여 연립방정식을 세우고, pseudo inverse를 이용해 연립방정식을 풀이하는 것이다.
Nonlinear regression에서는 circle fitting을 예시로 살펴보겠다. iteration을 이용해 파라미터를 업데이트해가며 fit하는 원의 중심=(a, b), 반지름=r에 해당하는 a, b, r을 구하도록 한다. 이때 iteration을 이용하는 4가지 방법 Gradient Descent, Gauss-Newton, Levenberg Method, Levenverg-Marquardt Method을 살펴보겠다.
실습 코딩
선형 회귀분석 코드 실습에 사용한 방법
경사 하강법(Gradient Descent)
최소제곱법(Least Square)
비선형 회귀분석(circle fitting) 코드 실습에 사용한 방법
경사 하강법(Gradient Descent)
가우스-뉴턴 방법(Gauss-Newton Method)
레벤버그 방법(Levenberg Method)
레벤버그-마쿼르트 방법(Levenberg-Marquardt Method)
1. 필요한 라이브러리 임포트
import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as patches from abc import abstractmethod, ABCMeta
numpy와 matplotlib.pyplot은 기본으로 임포트해주었다. 이따 살펴보겠지만, matplotlib.patches는 원 그리기를 위해, abc.abstractmethod와 abc.ABCMeta는 Iteration을 이용하는 방법들에 대하여 필수적으로 들어가야 할 함수를 지정하기 위해 임포트하였다.
2. Iteration 클래스
class Iteration(metaclass=ABCMeta): def __init__(self, x, y, a, b, r=1): self.x = x self.y = y self.a = a self.b = b self.r = r @abstractmethod def update(self): pass def plot_mse(self, str): plt.title(str) plt.xlabel(‘iteration’) plt.ylabel(‘MSE’) x = np.arange(1, len(self.mses)+1) y = np.array(self.mses) plt.plot(x, y) plt.show()
선형 회귀분석 코드 실습에 사용한 방법
경사 하강법(Gradient Descent)
최소제곱법(Least Square)
비선형 회귀분석(circle fitting) 코드 실습에 사용한 방법
경사 하강법(Gradient Descent)
가우스-뉴턴 방법(Gauss-Newton Method)
레벤버그 방법(Levenberg Method)
레벤버그-마쿼르트 방법(Levenberg-Marquardt Method)
빨간색으로 표시된 Iteration(반복)을 이용하는 방법들에 관한 클래스는 모두 Iteration 클래스를 상속하도록 하였다. Iteration 클래스에는 __init__메서드, update 메서드, plot_mse 메서드가 있다.
__init__ 메서드 : Iteration을 이용하는 방법으로 회귀분석을 하려면 x, y 변수에 들어가는 데이터와 a, b, r 등 각 회귀계수의 초깃값이 처음에 주어져야 한다. 선형 회귀분석의 경우 a, b 두 개의 회귀계수가 필요하고, Circle Fitting의 경우 a, b, r 세 개의 회귀계수가 필요하다. 따라서 a, b, r 세 개의 인스턴스 변수를 지정하되, 선형 회귀분석의 경우 r 값이 입력되지 않아도 메소드가 돌아가도록 r에는 default value를 넣어두었다.
Iteration을 이용하는 방법으로 회귀분석을 하려면 x, y 변수에 들어가는 데이터와 a, b, r 등 각 회귀계수의 초깃값이 처음에 주어져야 한다. 선형 회귀분석의 경우 a, b 두 개의 회귀계수가 필요하고, Circle Fitting의 경우 a, b, r 세 개의 회귀계수가 필요하다. 따라서 a, b, r 세 개의 인스턴스 변수를 지정하되, 선형 회귀분석의 경우 r 값이 입력되지 않아도 메소드가 돌아가도록 r에는 default value를 넣어두었다. update 메서드 : 모든 Iteration을 이용하는 방법에서 회귀계수의 값을 업데이트하는 과정이 필요하기 때문에 update method를 Abstract Method로 지정하였다.
모든 Iteration을 이용하는 방법에서 회귀계수의 값을 업데이트하는 과정이 필요하기 때문에 update method를 Abstract Method로 지정하였다. plot_mse 메서드 : Iteration을 이용하는 방법의 경우 회귀계수의 값을 업데이트할 때마다 오차의 크기가 달라지므로, 오차가 감소하는 모습을 그래프를 통해 한눈에 확인할 수 있도록 Iteration(반복 횟수)-MSE(평균 제곱 오차) 그래프를 그려주는 메서드를 만들었다. 그래프의 제목은 str 인자로 받아 그래프 상단에 출력되도록 하였다.
3. LinearRegression 클래스
class LinearRegression(): def __init__(self, x, y): self.x = x self.y = y def plot(self, str): plt.title(str) plt.xlabel(‘x’) plt.ylabel(‘y’) plt.plot(self.x, self.y, ‘o’, color=’red’) plt.plot(self.x, self.x*self.a + self.b) plt.text(self.x.min(), self.a*self.x.min()+self.b, ‘y={0}x+{1}’.format(round(self.a, 2), round(self.b, 2))) plt.text(self.x.max(), self.a*self.x.max()+self.b, ‘MSE : {0}’.format(round(self.mse(), 2))) plt.show() def mse(self): val = np.sqrt(np.sum(np.square(self.x * self.a – self.y + self.b)))/2 return val.sum()/len(self.x)
LinearRegression 클래스에는 선형 회귀를 하는 클래스에 공통으로 필요한 메서드들을 정의하여 상속할 수 있도록 하였다. __init__ 메서드, plot 메서드, mse 메서드가 들어간다.
__init__ 메서드 : 선형 회귀분석을 하려면 공통으로 필요한 것은 x, y 변수에 넣을 수 있는 초기 데이터 쌍들이다. 회귀계수 a, b는 Iteration을 이용한 방법의 경우에만 필요한 것이다. 따라서 LinearRegression 클래스에는 공통으로 필요한 x, y 값만 받아들일 수 있도록 했다.
선형 회귀분석을 하려면 공통으로 필요한 것은 x, y 변수에 넣을 수 있는 초기 데이터 쌍들이다. 회귀계수 a, b는 Iteration을 이용한 방법의 경우에만 필요한 것이다. 따라서 LinearRegression 클래스에는 공통으로 필요한 x, y 값만 받아들일 수 있도록 했다. plot 메서드 : 선형 회귀분석의 결과 만들어진 회귀선과 초기 데이터쌍들의 분포를 시각화하여 확인할 수 있도록 그래프를 그리는 메서드를 정의했다. plt.text를 이용하여 그래프에 회귀선에 해당하는 함수식이 나타나도록 했다.
선형 회귀분석의 결과 만들어진 회귀선과 초기 데이터쌍들의 분포를 시각화하여 확인할 수 있도록 그래프를 그리는 메서드를 정의했다. plt.text를 이용하여 그래프에 회귀선에 해당하는 함수식이 나타나도록 했다. mse 메서드 : MSE(평균제곱오차)을 구하는 공식은 모든 선형 회귀분석 메서드에 대하여 공통으로 적용할 수 있으므로 LinearRegression 클래스에 정의했다.
4. GradientDescent_line 클래스
(선형 회귀분석 ; 경사하강법 / Linear Regression ; Gradient Descent)
class GradientDescent_line(Iteration, LinearRegression): def __repr__(self): return “Gradient Descent” def setdata(self, step_size): self.step_size = step_size def update(self, iter): self.mses = [] for i in range(iter): self.mses.append(self.mse()) update_a = np.sum(-self.x * (self.y – self.x * self.a – self.b)) update_b = np.sum(-1 * (self.y – self.x * self.a – self.b)) self.a -= update_a*self.step_size self.b -= update_b*self.step_size
Iteration(반복)을 이용하여 선형 회귀분석을 하도록 하는 클래스이므로 Iteration과 LinearRegression 클래스를 상속받았다. 이때 회귀계수 a, b의 초깃값을 받아들이려면 Iteration의 __init__클래스를 이용해야 하므로 Iteration 클래스를 왼쪽에 적었다. __repr__, setdata, update 메서드를 정의했다.
__repr__메서드 : 클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다.
클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다. setdata 메서드 : Gradient Descent 방법으로 선형 회귀분석을 할 때 필요한 Step Size 값을 지정하는 메서드다.
Gradient Descent 방법으로 선형 회귀분석을 할 때 필요한 Step Size 값을 지정하는 메서드다. update 메서드 : 회귀계수 a, b 값을 업데이트하는 메서드다. 자세한 내용은 위 이론정리 참고.
5. LS_Analytic, LS_Algebric 클래스
(최소제곱법 / Least Square)
class LS_Analytic(LinearRegression): def __repr__(self): return “Analytic Least Square” def solve(self): x_square = np.sum(self.x**2) x = np.sum(self.x) xy = np.sum(self.x*self.y) y = np.sum(self.y) A = np.array([[x_square, x], [x, 1]]) B = np.array([xy, y]) self.a, self.b = np.linalg.inv(A).dot(B) class LS_Algebric(LinearRegression): def __repr__(self): return “Algebric Least Square” def solve(self): A = np.array([[i, 1] for i in self.x]) B = np.array([i for i in self.y]) self.a, self.b = np.dot(np.linalg.pinv(A), B)
LS_Analytic은 최소 제곱법의 해석적 방법, LS_Algebric은 최소 제곱법의 대수적 방법을 이용하는 클래스다. Iteration(반복)을 이용하지 않고 선형 회귀분석을 하도록 하는 클래스이므로 LinearRegression 클래스만을 상속받았다. __repr__, solve 메서드를 정의했다.
__repr__메서드 : 클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다.
클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다. solve 메서드 : 최종 회귀계수 a, b 값을 구하는 메서드다. 자세한 내용은 위 이론정리 참고.
6. 선형 회귀 실행
line_x = np.array([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]) line_y = np.array([29, 33, 51, 40, 49, 50, 69, 70, 64, 89]) gdplot = GradientDescent_line(line_x, line_y, 8, 20) gdplot.setdata(0.0008) gdplot.update(50000) gdplot.plot(gdplot) gdplot.plot_mse(gdplot) LSplot1 = LS_Analytic(line_x, line_y) LSplot1.solve() LSplot1.plot(LSplot1) LSplot2 = LS_Algebric(line_x, line_y) LSplot2.solve() LSplot2.plot(LSplot2)
각 방법에 해당하는 클래스에 대하여 오브젝트를 생성한 후 메서드를 호출하여 선형 회귀를 실행한다.
GradientDescent_line
.setdata({Step Size}) : Step Size 값을 인자로 받아 오브젝트에 인스턴스 변수로 저장한다.
Step Size 값을 인자로 받아 오브젝트에 인스턴스 변수로 저장한다. .update({Iteration}) : 실행할 Iteration 횟수를 인자로 받아 회귀계수를 업데이트할 때 그만큼 반복문이 돌도록 한다.
.plot({Object}) : 회귀선 및 입력 데이터쌍을 그래프로 시각화한다. 앞서 생성한 오브젝트를 인자로 받아, 해당 클래스에 __repr__ 메서드의 출력값으로 선언해 둔 문자열이 그래프의 제목이 되도록 한다.
회귀선 및 입력 데이터쌍을 그래프로 시각화한다. 앞서 생성한 오브젝트를 인자로 받아, 해당 클래스에 __repr__ 메서드의 출력값으로 선언해 둔 문자열이 그래프의 제목이 되도록 한다. .plot_mse({Object}) : Iteration(반복 횟수)-MSE(평균 제곱 오차)의 관계를 그래프로 시각화한다. 앞서 생성한 오브젝트를 인자로 받아, 해당 클래스에 __repr__ 메서드의 출력값으로 선언해 둔 문자열이 그래프의 제목이 되도록 한다.
LS_Analytic, LS_Algebric
.solve() : 회귀계수 a, b의 값을 구하여 저장하도록 한다.
회귀계수 a, b의 값을 구하여 저장하도록 한다. .plot({Object}) : 회귀선 및 입력 데이터쌍을 그래프로 시각화한다. 앞서 생성한 오브젝트를 인자로 받아, 해당 클래스에 __repr__ 메서드의 출력값으로 선언해 둔 문자열이 그래프의 제목이 되도록 한다.
7. CircleRegression 클래스
class CircleRegression(): def __init__(self, x, y): self.x = x self.y = y def plot(self, str): plt.title(str) plt.xlabel(‘x’) plt.ylabel(‘y’) plt.plot(self.x, self.y, ‘o’, color=’red’) c = patches.Circle((self.a, self.b), self.r, fc=’w’, ec=’b’) plt.gca().add_patch(c) plt.text(self.a-self.r, self.b, ‘center : ({0}, {1}) radius : {2} MSE={3}’.format(round(self.a, 2), round(self.b, 2), round(self.r, 2), round(self.mse(), 2))) plt.show() def mse(self): val = np.sqrt(np.sum(np.square(np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)**2) – self.r)))/2 return val/len(self.x)
CircleRegression 클래스는 비선형 회귀 중에서도 Circle Fitting을 하는 클래스에 공통으로 필요한 메서드들을 정의하여 상속할 수 있도록 하였다. __init__ 메서드, plot 메서드, mse 메서드가 들어간다.
__init__ 메서드 : Circle Fitting 을 하려면 공통으로 필요한 것은 x, y 변수에 넣을 수 있는 초기 데이터 쌍들이다. 회귀계수 a, b, r은 Iteration을 이용한 방법의 경우에만 필요한 것이다. 따라서 CircleRegression 클래스에는 공통으로 필요한 x, y 값만 받아들일 수 있도록 했다.
을 하려면 공통으로 필요한 것은 x, y 변수에 넣을 수 있는 초기 데이터 쌍들이다. 회귀계수 a, b, r은 Iteration을 이용한 방법의 경우에만 필요한 것이다. 따라서 CircleRegression 클래스에는 공통으로 필요한 x, y 값만 받아들일 수 있도록 했다. plot 메서드 : Circle Fitting 의 결과 만들어진 회귀선과 초기 데이터쌍들의 분포를 시각화하여 확인할 수 있도록 그래프를 그리는 메서드를 정의했다. plt.text를 이용하여 회귀의 결과 나온 원의 중심 (a, b) 및 반지름 r의 값이 나타나도록 했다.
의 결과 만들어진 회귀선과 초기 데이터쌍들의 분포를 시각화하여 확인할 수 있도록 그래프를 그리는 메서드를 정의했다. plt.text를 이용하여 회귀의 결과 나온 원의 중심 (a, b) 및 반지름 r의 값이 나타나도록 했다. mse 메서드 : MSE(평균제곱오차)을 구하는 공식은 모든 Circle Fitting 메서드에 대하여 공통으로 적용할 수 있으므로 CircleRegression 클래스에 정의했다.
8. GradientDescent_circle 클래스
(비선형 회귀분석 Circle Fitting ; 경사하강법 / Nonlinear Regression Circle Fitting ; Gradient Descent)
class GradientDescent_circle(Iteration, CircleRegression): def __repr__(self): return “Gradient Descent” def setdata(self, step_size): self.step_size = step_size def update(self, iter): self.mses = [] for i in range(iter): self.mses.append(self.mse()) J_col0 = (self.a – self.x)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col1 = (self.b – self.y)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col2 = -np.ones_like(self.x) J = np.column_stack((J_col0, J_col1, J_col2)) F = np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) – self.r F.resize(len(F), 1) grad = np.dot(J.T, F) update_val = grad*self.step_size self.a -= update_val[0][0] self.b -= update_val[1][0] self.r -= update_val[2][0]
Iteration(반복)을 이용하여 Circle Fitting을 하도록 하는 클래스이므로 Iteration과 CircleRegression 클래스를 상속받았다. 이때 회귀계수 a, b, r의 초깃값을 받아들이려면 Iteration의 __init__클래스를 이용해야 하므로 Iteration 클래스를 왼쪽에 적었다. __repr__, setdata, update 메서드를 정의했다.
__repr__메서드 : 클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다.
클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다. setdata 메서드 : Gradient Descent 방법으로 Circle Fitting을 할 때 필요한 Step Size 값을 지정하는 메서드다.
Gradient Descent 방법으로 Circle Fitting을 할 때 필요한 Step Size 값을 지정하는 메서드다. update 메서드 : 회귀계수 a, b, r 값을 업데이트하는 메서드다. 자세한 내용은 위 이론정리 참고.
9. GaussNewton 클래스
(선형 회귀분석 Circle Fitting ; 가우스-뉴턴 방법 / Nonlinear Regression Circle Fitting ; Gauss-Newton Method)
class GaussNewton(Iteration, CircleRegression): def __repr__(self): return “Gauss-Newton” def update(self, iter): self.mses = [] for i in range(iter): self.mses.append(self.mse()) J_col0 = (self.a – self.x)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col1 = (self.b – self.y)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col2 = -np.ones_like(self.x) J = np.column_stack((J_col0, J_col1, J_col2)) F = np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) – self.r F.resize(len(F), 1) update_val = np.dot(np.linalg.pinv(J), F) self.a -= update_val[0][0] self.b -= update_val[1][0] self.r -= update_val[2][0]
Iteration(반복)을 이용하여 Circle Fitting을 하도록 하는 클래스이므로 Iteration과 CircleRegression 클래스를 상속받았다. 이때 회귀계수 a, b, r의 초깃값을 받아들이려면 Iteration의 __init__클래스를 이용해야 하므로 Iteration 클래스를 왼쪽에 적었다. __repr__, update 메서드를 정의했다.
__repr__메서드 : 클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다.
클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다. update 메서드 : 회귀계수 a, b, r 값을 업데이트하는 메서드다. 자세한 내용은 위 이론정리 참고.
10. Levenberg 클래스
(선형 회귀분석 Circle Fitting ; 레벤버그 방법 / Nonlinear Regression Circle Fitting ; Levenberg Method)
class Levenberg(Iteration, CircleRegression): def __repr__(self): return “Levenberg” def setdata(self, damping_factor): self.damping_factor = damping_factor def update(self, iter): self.mses = [] for i in range(iter): self.mses.append(self.mse()) J_col0 = (self.a – self.x)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col1 = (self.b – self.y)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col2 = -np.ones_like(self.x) J = np.column_stack((J_col0, J_col1, J_col2)) F = np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) – self.r F.resize(len(F), 1) curve = np.linalg.inv(np.dot(J.T, J)+np.identity(n=3)*self.damping_factor) grad = np.dot(J.T, F) update_val = np.dot(curve, grad) self.a -= update_val[0][0] self.b -= update_val[1][0] self.r -= update_val[2][0]
Iteration(반복)을 이용하여 Circle Fitting을 하도록 하는 클래스이므로 Iteration과 CircleRegression 클래스를 상속받았다. 이때 회귀계수 a, b, r의 초깃값을 받아들이려면 Iteration의 __init__클래스를 이용해야 하므로 Iteration 클래스를 왼쪽에 적었다. __repr__, setdata, update 메서드를 정의했다.
__repr__메서드 : 클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다.
클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다. setdata 메서드 : Levenberg Method 으로 Circle Fitting을 할 때 필요한 Damping Factor 값을 지정하는 메서드다.
으로 Circle Fitting을 할 때 필요한 Damping Factor 값을 지정하는 메서드다. update 메서드 : 회귀계수 a, b, r 값을 업데이트하는 메서드다. 자세한 내용은 위 이론정리 참고.
11. Levenberg_Marquardt 클래스
(선형 회귀분석 Circle Fitting ; 레벤버그-마쿼르트 방법 / Nonlinear Regression Circle Fitting ; Levenberg-Marquardt Method)
class Levenberg_Marquardt(Iteration, CircleRegression): def __repr__(self): return “Levenberg-Marquardt” def setdata(self, damping_factor): self.damping_factor = damping_factor def update(self, iter): self.mses = [] for i in range(iter): self.mses.append(self.mse()) J_col0 = (self.a – self.x)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col1 = (self.b – self.y)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col2 = -np.ones_like(self.x) J = np.column_stack((J_col0, J_col1, J_col2)) F = np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) – self.r F.resize(len(F), 1) curve = np.linalg.inv(np.dot(J.T, J)+np.diag(np.dot(J.T, J))*self.damping_factor) grad = np.dot(J.T, F) update_val = np.dot(curve, grad) self.a -= update_val[0][0] self.b -= update_val[1][0] self.r -= update_val[2][0]
Iteration(반복)을 이용하여 Circle Fitting을 하도록 하는 클래스이므로 Iteration과 CircleRegression 클래스를 상속받았다. 이때 회귀계수 a, b, r의 초깃값을 받아들이려면 Iteration의 __init__클래스를 이용해야 하므로 Iteration 클래스를 왼쪽에 적었다. __repr__, setdata, update 메서드를 정의했다.
__repr__메서드 : 클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다.
클래스의 방법 이름을 출력하도록 하였다. 이는 plot 메서드를 이용하여 그래프를 그릴 때 제목으로 각 클래스의 __repr__ 메서드의 출력값을 넣기 위해 지정하도록 했다. setdata 메서드 : Levenberg-Marquardt Method 으로 Circle Fitting을 할 때 필요한 Damping Factor 값을 지정하는 메서드다.
으로 Circle Fitting을 할 때 필요한 Damping Factor 값을 지정하는 메서드다. update 메서드 : 회귀계수 a, b, r 값을 업데이트하는 메서드다. 자세한 내용은 위 이론정리 참고.
12. 비선형 회귀 Circle Fitting 실행
circle_x = np.array([1.2, 3.1, 4.5, 2, 1.4, 0, -1.5, -1.9, -1.5]) circle_y = np.array([2.1, 2.5, 5, 8.3, 8.6, 8.2, 7.3, 5.4, 3.2]) GDcircle = GradientDescent_circle(circle_x, circle_y, 3, 3, 2) GDcircle.setdata(0.01) GDcircle.update(100) GDcircle.plot(GDcircle) GDcircle.plot_mse(GDcircle) GNcircle = GaussNewton(circle_x, circle_y, 3, 3, 2) GNcircle.update(5) GNcircle.plot(GNcircle) GNcircle.plot_mse(GNcircle) Lcircle = Levenberg(circle_x, circle_y, 3, 3, 2) Lcircle.setdata(0.1) Lcircle.update(5) Lcircle.plot(Lcircle) Lcircle.plot_mse(Lcircle) LMcircle = Levenberg_Marquardt(circle_x, circle_y, 3, 3, 2) LMcircle.setdata(0.1) LMcircle.update(5) LMcircle.plot(LMcircle) LMcircle.plot_mse(LMcircle)
각 방법에 해당하는 클래스에 대하여 오브젝트를 생성한 후 메서드를 호출하여 비선형 회귀 Circle Fitting을 실행한다.
GradientDescent_circle, GaussNewton, Levenberg, Levenberg_Marquardt
.setdata({Step Size}) : Step Size 값을 인자로 받아 오브젝트에 인스턴스 변수로 저장한다.
Step Size 값을 인자로 받아 오브젝트에 인스턴스 변수로 저장한다. .update({Iteration}) : 실행할 Iteration 횟수를 인자로 받아 회귀계수를 업데이트할 때 그만큼 반복문이 돌도록 한다.
실행할 Iteration 횟수를 인자로 받아 회귀계수를 업데이트할 때 그만큼 반복문이 돌도록 한다. .plot({Object}) : 회귀 결과 생성된 원 및 입력 데이터쌍을 그래프로 시각화한다. 앞서 생성한 오브젝트를 인자로 받아, 해당 클래스에 __repr__ 메서드의 출력값으로 선언해 둔 문자열이 그래프의 제목이 되도록 한다.
회귀 결과 생성된 원 및 입력 데이터쌍을 그래프로 시각화한다. 앞서 생성한 오브젝트를 인자로 받아, 해당 클래스에 __repr__ 메서드의 출력값으로 선언해 둔 문자열이 그래프의 제목이 되도록 한다. .plot_mse({Object}) : Iteration(반복 횟수)-MSE(평균 제곱 오차)의 관계를 그래프로 시각화한다. 앞서 생성한 오브젝트를 인자로 받아, 해당 클래스에 __repr__ 메서드의 출력값으로 선언해 둔 문자열이 그래프의 제목이 되도록 한다.
코드 실행 결과
선형 회귀 (Linear Regression) 결과 – 순서대로
개인적으로 Algebric Least Square결과와 Gradient Descent 엄청 돌린 후 결과는 괜찮은데 Analytic Least Square 결과는 왜 저렇게 나오는지 모르겠다. 아시는 분 있으면 알려주세요 …^^;
비선형 회귀 (Nonlinear Regression) Circle Fitting 결과 – 순서대로
Gradient Descent보다는 Gauss-Newton Method, Levenberg Method, Levenberg-Marquardt Method를 이용할 때 훨씬 더 빠르게 수렴하는 것을 확인할 수 있다. 더 좋은 비교를 위해 초깃값을 다르게 설정해보았다.
참값과 더 멀게 : a=10, b=10, c=5
!!!!!!!!!! 발산 !!!!!!!!!
전체 소스코드
import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as patches from abc import abstractmethod, ABCMeta class Iteration(metaclass=ABCMeta): def __init__(self, x, y, a, b, r=1): self.x = x self.y = y self.a = a self.b = b self.r = r @abstractmethod def update(self): pass def plot_mse(self, str): plt.title(str) plt.xlabel(‘iteration’) plt.ylabel(‘MSE’) x = np.arange(1, len(self.mses)+1) y = np.array(self.mses) plt.plot(x, y) plt.show() class LinearRegression(): def __init__(self, x, y): self.x = x self.y = y def plot(self, str): plt.title(str) plt.xlabel(‘x’) plt.ylabel(‘y’) plt.plot(self.x, self.y, ‘o’, color=’red’) plt.plot(self.x, self.x*self.a + self.b) plt.text(self.x.min(), self.a*self.x.min()+self.b, ‘y={0}x+{1}’.format(round(self.a, 2), round(self.b, 2))) plt.text(self.x.max(), self.a*self.x.max()+self.b, ‘MSE : {0}’.format(round(self.mse(), 2))) plt.show() def mse(self): val = np.sqrt(np.sum(np.square(self.x * self.a – self.y + self.b)))/2 return val.sum()/len(self.x) class GradientDescent_line(Iteration, LinearRegression): def __repr__(self): return “Gradient Descent” def setdata(self, step_size): self.step_size = step_size def update(self, iter): self.mses = [] for i in range(iter): self.mses.append(self.mse()) update_a = np.sum(-self.x * (self.y – self.x * self.a – self.b)) update_b = np.sum(-1 * (self.y – self.x * self.a – self.b)) self.a -= update_a*self.step_size self.b -= update_b*self.step_size class LS_Analytic(LinearRegression): def __repr__(self): return “Analytic Least Square” def solve(self): x_square = np.sum(self.x**2) x = np.sum(self.x) xy = np.sum(self.x*self.y) y = np.sum(self.y) A = np.array([[x_square, x], [x, 1]]) B = np.array([xy, y]) self.a, self.b = np.linalg.inv(A).dot(B) class LS_Algebric(LinearRegression): def __repr__(self): return “Algebric Least Square” def solve(self): A = np.array([[i, 1] for i in self.x]) B = np.array([i for i in self.y]) self.a, self.b = np.dot(np.linalg.pinv(A), B) #Circle Fitting class CircleRegression(): def __init__(self, x, y): self.x = x self.y = y def plot(self, str): plt.title(str) plt.xlabel(‘x’) plt.ylabel(‘y’) plt.plot(self.x, self.y, ‘o’, color=’red’) c = patches.Circle((self.a, self.b), self.r, fc=’w’, ec=’b’) plt.gca().add_patch(c) plt.text(self.a-self.r, self.b, ‘center : ({0}, {1}) radius : {2} MSE={3}’.format(round(self.a, 2), round(self.b, 2), round(self.r, 2), round(self.mse(), 2))) plt.show() def mse(self): val = np.sqrt(np.sum(np.square(np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)**2) – self.r)))/2 return val/len(self.x) class GradientDescent_circle(Iteration, CircleRegression): def __repr__(self): return “Gradient Descent” def setdata(self, step_size): self.step_size = step_size def update(self, iter): self.mses = [] for i in range(iter): self.mses.append(self.mse()) J_col0 = (self.a – self.x)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col1 = (self.b – self.y)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col2 = -np.ones_like(self.x) J = np.column_stack((J_col0, J_col1, J_col2)) F = np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) – self.r F.resize(len(F), 1) grad = np.dot(J.T, F) update_val = grad*self.step_size self.a -= update_val[0][0] self.b -= update_val[1][0] self.r -= update_val[2][0] class GaussNewton(Iteration, CircleRegression): def __repr__(self): return “Gauss-Newton” def update(self, iter): self.mses = [] for i in range(iter): self.mses.append(self.mse()) J_col0 = (self.a – self.x)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col1 = (self.b – self.y)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col2 = -np.ones_like(self.x) J = np.column_stack((J_col0, J_col1, J_col2)) F = np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) – self.r F.resize(len(F), 1) update_val = np.dot(np.linalg.pinv(J), F) self.a -= update_val[0][0] self.b -= update_val[1][0] self.r -= update_val[2][0] class Levenberg(Iteration, CircleRegression): def __repr__(self): return “Levenberg” def setdata(self, damping_factor): self.damping_factor = damping_factor def update(self, iter): self.mses = [] for i in range(iter): self.mses.append(self.mse()) J_col0 = (self.a – self.x)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col1 = (self.b – self.y)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col2 = -np.ones_like(self.x) J = np.column_stack((J_col0, J_col1, J_col2)) F = np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) – self.r F.resize(len(F), 1) curve = np.linalg.inv(np.dot(J.T, J)+np.identity(n=3)*self.damping_factor) grad = np.dot(J.T, F) update_val = np.dot(curve, grad) self.a -= update_val[0][0] self.b -= update_val[1][0] self.r -= update_val[2][0] class Levenberg_Marquardt(Iteration, CircleRegression): def __repr__(self): return “Levenberg-Marquardt” def setdata(self, damping_factor): self.damping_factor = damping_factor def update(self, iter): self.mses = [] for i in range(iter): self.mses.append(self.mse()) J_col0 = (self.a – self.x)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col1 = (self.b – self.y)/np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) J_col2 = -np.ones_like(self.x) J = np.column_stack((J_col0, J_col1, J_col2)) F = np.sqrt(np.square(self.x-self.a) + np.square(self.y-self.b)) – self.r F.resize(len(F), 1) curve = np.linalg.inv(np.dot(J.T, J)+np.diag(np.dot(J.T, J))*self.damping_factor) grad = np.dot(J.T, F) update_val = np.dot(curve, grad) self.a -= update_val[0][0] self.b -= update_val[1][0] self.r -= update_val[2][0] circle_x = np.array([1.2, 3.1, 4.5, 2, 1.4, 0, -1.5, -1.9, -1.5]) circle_y = np.array([2.1, 2.5, 5, 8.3, 8.6, 8.2, 7.3, 5.4, 3.2]) GDcircle = GradientDescent_circle(circle_x, circle_y, 3, 3, 2) GDcircle.setdata(0.01) GDcircle.update(100) GDcircle.plot(GDcircle) GDcircle.plot_mse(GDcircle) GNcircle = GaussNewton(circle_x, circle_y, 3, 3, 2) GNcircle.update(5) GNcircle.plot(GNcircle) GNcircle.plot_mse(GNcircle) Lcircle = Levenberg(circle_x, circle_y, 3, 3, 2) Lcircle.setdata(0.1) Lcircle.update(5) Lcircle.plot(Lcircle) Lcircle.plot_mse(Lcircle) LMcircle = Levenberg_Marquardt(circle_x, circle_y, 3, 3, 2) LMcircle.setdata(0.1) LMcircle.update(5) LMcircle.plot(LMcircle) LMcircle.plot_mse(LMcircle) line_x = np.array([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]) line_y = np.array([29, 33, 51, 40, 49, 50, 69, 70, 64, 89]) gdplot = GradientDescent_line(line_x, line_y, 8, 20) gdplot.setdata(0.0008) gdplot.update(50000) gdplot.plot(gdplot) gdplot.plot_mse(gdplot) LSplot1 = LS_Analytic(line_x, line_y) LSplot1.solve() LSplot1.plot(LSplot1) LSplot2 = LS_Algebric(line_x, line_y) LSplot2.solve() LSplot2.plot(LSplot2)
3. 선형 & 비선형 Modeling
3. 선형 & 비선형 Modeling
Linear Regression(선형 회귀분석)과 Non – Linear Regression(비선형 회귀분석)을 잠깐 다루고 가겠습니다.
사람들이 회귀분석을 돌릴 때, 가장 실수하는 부분은 단순하게 변수들 간의 상관관계만을 파악해서 분석하는 경우입니다. 상관관계는 두 변수의 관계가 선형성을 띄는지를 판단하는 것일 뿐입니다. 만약 두 변수가 비선형 관계에 있을 경우, 상관관계는 낮게 잡힐 수도 있습니다. 하지만 상관계수가 낮게 잡힌다고 해서 이 두 변수 간에 관계가 존재하지 않는 것은 아닙니다. 비선형으로 회귀식을 잡으면 충분히 관계를 설명할 수가 있게 됩니다.
특히 이런 경우, 데이터의 상관관계는 0.21이 뜹니다. 상관계수만 보면 매우 낮기때문에 일반적으로 모델링 할 생각부터 안하게 됩니다. 하지만 분석모형에서는 이러한 비선형 관계들로 관계식을 추정할 수 있습니다.
데이터 생성
x = rnorm(150, 5, 3) error = runif(150,min = -10, max = 10) y = 10 * x + 3 – error y2 = 10 * x^2 + 3 – error^2 y3 = sin(x) + error/20 REGRESSION = data.frame( X = x, y = y, y2 = y2, y3 = y3 )
선형 회귀분석
두 변수의 관계가 선형인 경우에 대해서 회귀분석을 추정해보겠습니다.
LINEAR = lm(y ~ x,data = REGRESSION) summary(LINEAR)
Call: lm(formula = y ~ x, data = REGRESSION) Residuals: Min 1Q Median 3Q Max -10.4623 -5.2871 0.5611 5.3107 9.3641 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 3.0896 1.0185 3.033 0.00286 ** x 10.1054 0.1716 58.897 < 2e-16 *** Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 6.003 on 148 degrees of freedom Multiple R-squared: 0.9591, Adjusted R-squared: 0.9588 F-statistic: 3469 on 1 and 148 DF, p-value: < 2.2e-16 library(ggplot2) ggplot(REGRESSION) + geom_smooth(aes(x = X, y = predict(LINEAR, newdata = REGRESSION)),col = "red", method = 'lm') + geom_point(aes(x = X , y = y),col = 'royalblue') + ylab("") + xlab("") + ggtitle("Linear Regression") 일반적인 선형회귀분석, 즉 선형을 완벽하게 띄고 있는 변수 간의 관계는 간단하게 선형으로 적합시키면 문제가 없습니다. Polynomial Regression 변수 간의 관계가 $y=x^2$형태를 가지는 데이터에 대해 2차항 회귀분석(다항 회귀분석)을 적용시켜 보겠습니다. # 제곱꼴 관계를 선형으로 적합 NonLinear = lm(y2 ~ x, data = REGRESSION) summary(NonLinear) Call: lm(formula = y2 ~ x, data = REGRESSION) Residuals: Min 1Q Median 3Q Max -154.19 -84.79 -46.28 46.35 446.95 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -208.872 21.225 -9.841 <2e-16 *** x 103.788 3.447 30.113 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 129.5 on 148 degrees of freedom Multiple R-squared: 0.8597, Adjusted R-squared: 0.8587 F-statistic: 906.8 on 1 and 148 DF, p-value: < 2.2e-16 2차항의 관계를 선형으로 적합하였을 때의 설명력은 85%가 나온 것을 알 수가 있습니다. 다음으로 다항 회귀분석(2차항)을 적용시켜보도록 하겠습니다. NonLinear2 = lm(y2 ~ poly(x,2), data = REGRESSION) summary(NonLinear2) Call: lm(formula = y2 ~ poly(x, 2), data = REGRESSION) Residuals: Min 1Q Median 3Q Max -65.180 -25.879 5.213 29.693 39.436 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 345.341 2.582 133.74 <2e-16 *** poly(x, 2)1 3899.149 31.625 123.29 <2e-16 *** poly(x, 2)2 1527.866 31.625 48.31 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 31.63 on 147 degrees of freedom Multiple R-squared: 0.9917, Adjusted R-squared: 0.9916 F-statistic: 8767 on 2 and 147 DF, p-value: < 2.2e-16 회귀식을 $\hat{y_i} = \beta_0 + \beta_1x_i +\beta_2x_i^2$형태로 적합한 결과 설명력은 99.16%로 상승한 것을 볼 수 있습니다. ggplot(REGRESSION) + geom_smooth(aes(x = X, y = predict(NonLinear2,newdata = REGRESSION)),col = "red") + geom_point(aes(x = X , y = y2),col = 'royalblue') + ylab("") + xlab("") + ggtitle("Polynomial Regression") Flexible Regression 다음 회귀분석은 $y=sin(x)$꼴을 가지는 두 변수 간의 관계를 회귀식으로 추정해보도록 하겠습니다. 워낙 형태가 괴이하기 때문에 몇차 항을 적합시켜야할지 모르겠습니다. 그러하니 변수항의 차수(Degree of Polynomial)을 2 ~ 10까지 주고 Testing을 해보도록 하겠습니다. # Train Set & Test Set 형성 TRAIN = REGRESSION[1:100,] TEST = REGRESSION[101:150,] # 저장공간 생성 DEGREE = c() TEST_MSE = c() TRAIN_MSE = c() Adj_R = c() TEST_VAR = c() TRAIN_VAR = c() # 적합 모델 찾기 for( degree in 2:10){ FLEXIBLE_MODEL = lm(y3 ~ poly(X,degree),data = TRAIN) ## Summary Save SUMMARY = summary(FLEXIBLE_MODEL) ANOVA = anova(FLEXIBLE_MODEL) DEGREE = c(DEGREE,degree) ## R_SQUARE Adj_R = c(Adj_R,SUMMARY$adj.r.squared) ## TRAIN TRAIN_MSE = c(TRAIN_MSE, ANOVA$`Mean Sq`[2]) TRAIN_VAR = c(TRAIN_VAR, var(FLEXIBLE_MODEL$fitted.values)) ## TEST Pred = predict(FLEXIBLE_MODEL, newdata = TEST) TEST_RESIDUALS = (Pred - TEST$y3) TEST_MSE_VALUE = sum(TEST_RESIDUALS^2)/(nrow(TEST)) TEST_MSE = c(TEST_MSE,TEST_MSE_VALUE) TEST_VAR = c(TEST_VAR, var(Pred)) } ## Test 결과 데이터프레임 생성 F_DATA = data.frame( DEGREE = DEGREE, Adj_R = Adj_R, TRAIN_MSE = TRAIN_MSE, TRAIN_VAR = TRAIN_VAR, TEST_MSE = TEST_MSE, TEST_VAR = TEST_VAR ) 항차를 2차항부터 10차항까지 차례대로 추정해본 결과는 다음과 같습니다. R square는 6차항부터 급격하게 올라가는 것을 볼 수가 있습니다. 따라서 6차항은 되어야 $y=sin(x)$형태의 관계를 잘 설명할 수 있는 편이라고 생각할 수 있습니다. MSE는 Train Set과 Test Set에 따라 추세가 다릅니다. 차수가 높아질수록 Train Set의 MSE는 감소하는 것을 알 수있습니다. 하지만 Test Set의 MSE는 감소하다가 증가하는 것을 확인할 수 있습니다. 이는 Train Set은 기가막히게 잘 맞추지만 새로운 데이터인 Test Set은 맞추지 못하는 OverFitting 이 발생하였다고 볼 수 있습니다. 이 발생하였다고 볼 수 있습니다. Variance는 항차가 올라갈수록 대체로 증가하는 추세에 있는 것을 볼 수 있습니다. 여기서 고차항의 회귀모형의 단점이 제대로 드러납니다. 분석 모형이 유연할수록(항차가 높을수록) 회귀추정값의 분산은 높게 뛰기 마련입니다. 이는 회귀식에 의한 추정값에 대한 신뢰구간이 길어진다는 의미이며, 결과에 대한 신뢰도가 떨어진다는 것을 의미합니다.
SPSS 비선형 회귀분석 알아보기
안녕하세요
통계판다입니다. 이제 연말이라서 많은분들이 내년을 준비하시는데요
벌써 부터 내년 논문통계분석의뢰가 예약이 잡히고 있는거 보면 정말 신기하네요.
1월 초에 벌써 잡는다고 카톡을 보내 오시는거보면 이야 정말 신기합니다.
통계판다는 혼자서 모든일을 더 처리하기때문에 나중에 제가 일을 그만 두게 되면
그 많은 지식들은 그냥 땅속에 묻히게 되는거죠 그래서 꾸준히 제가 일할 동안 열심히 포스팅을 해서요
나중에 제가 없더라도 많은 분들이 이 블로그를 보면서 열심히 공부하셔서 다들 논문통과가 될 수 있도록
하는게 제 꿈입니다. 비록 하찮지만요. 많이는 못올리지만 한개 한개 올리다보면 언젠가는 다 올리지
않을까 바래 봅니다.
오늘은 SPSS에서 고난이도중의 하나인 비선형 회귀분석 알아도보록 하겠습니다.
거의 모든 논문통계분석에서는 선형모형으로 사용이 되니깐 정말 가끔씩 의뢰가 들어오는 부분입니다.
우선 계산식이 상당히 복잡해서요 그런거 다 빼겠습니다. 논문에 넣을 부분은 아니라서요
자세한건 구글에 검색하시면 계산식은 자세히 보실수 있으실껍니다.
모수에 대한 편미분함수가 모수에 의존을 하게 되면 비선형모형이라고 칭하는데요.
등분산 가정이 위배는거죠.
우선 SPSS에서는 여러가지 알고리즘 중에서 Levenberi-Marquardt의 알고리즘을
사용합니다. Gauss-Newton의 알고리즘을 살짝 보완을 해서 만든거라고 보시면 됩니다.
우선 초기치를 선택할때는 반응치중에 가장 큰값을 선택하는게 적당하다고 합니다.
이게 상당히 복잡해서요 어떻게 설명을 드려야 할지 모르겠지만 중요한건 각 전공분야의
이론을 근거로 얻어지는 모형을 사용을 해야됩니다.
[AL] Regression – 단순/다중/비선형 회귀 분석
728×90
/*******************************************************************************************************************
— Title : [AL] Regression – 단순/다중/비선형 회귀 분석
— Reference : acorn, googling
— Key word : 단순 회귀 분석 다중 회귀 분석 simple regression multi regression 연구가설 연구 가설 귀무가설
귀무 가설 다중공선성 multocolinearity lm lr nlr 비선형회귀분석 추정 설명모형 예측모형
*******************************************************************************************************************/
■ 단순 회귀분석(Simple Regression Analysis)
ㅁ 독립변수와 종속변수가 각각 1개
ㅁ 독립변수가 종속변수에 미치는 인과관계 분석
ㅁ 단순 회귀분석 가설
ㅇ 연구가설(Ha)
• 음료수 제품의 당도와 가격 수준을 결정하는 제품 적절성 (독립변수)은 제품 만족도 (종속변수)에
정(正)의 영향을 미침
ㅇ 귀무가설(H0)
• 음료수 제품의 당도와 가격수준을 결정한느 제품 적절성은 제품의 만족도에 영향을 미치지 않음
ㅇ t와 p-value 추정
• t-value : 19.34 > ±1.96이고, p-value : 2.2e-16 < 0.05(유의수준)일 때 연구가설을 채택 • 검정통계량(t-value), 유의확률(p-value) ■ 회귀 모형의 구축 ㅁ 설명모형 vs. 예측모형 ㅇ 전통 통계학 : 출력 변수와 예측 변수들간의 관계 설명 ㅇ 데이터마이닝 : 새로운 사례에 대한 출력값을 예측 ㅁ 설명모형(Explanatory Model) ㅇ 전통적인 통계분야로서 데이터가 적은 모형 ㅇ 목적 • 모집단에서 가정하는 가설적 관계에 대한 정보를 최대한 반영할 수 있도록 전체 데이터 집합을 사용하여 최상의 적합모형을 추정 ㅁ 예측모형(Predictive Model) ㅇ 데이터마이닝 분야로서 데이터가 충분히 많은 모형 ㅇ 목적 • 적합된 모형을 이용하여 알려지지 않은 데이터에 대한 예측 ㅇ 학습용 집합(모형추정)과 평가용 집합(모형성능 평가)로 나뉨 ■ 회귀 모형의 구축 ㅁ 추정 ㅇ 회귀계수 β0, ..., βp를 추정하는 것 ㅇ 최소자승법(Ordinary Least Square: OLS)을 이용하여 추정 • 학습용 데이터에 대한 실제값(Y)과 예측된 값(^Y)간의 차이(잔차)제곱이 최소화되는 계수 ^β0, ..., ^βp를 찾음 ㅁ 회귀분석의 가정 ㅇ 가정 1: 독립변수들간의 선형관계가 존재 ㅇ 가정 2: εi은 정규분포를 따름 ㅇ 가정 3: E(εi) = 0 ㅇ 가정 4: V(εi) = σ² (homoscedasiticity) ㅇ 가정 5: 사례들은 서로 독립 (cov(ei, ej) - 0, i ≠ j) ■ 다중 회귀분석(Multi Regression Analysis) ㅁ 여러 개 독립변수가 1개의 종속변수에 미치는 영향 분석 ㅁ 연구 가설 ㅇ 연구가설1(Ha) : 음료수 제품의 적설정(독립변수1)은 제품 만족도(종속변수)에 정(正)의 영향을 미침 ㅇ 연구가설2(Ha) : 음료수 제품의 친밀도(독립변수2)은 제품 만족도(종속변수)에 정(正)의 영향을 미침 ㅁ 다중공선성(Multicolinearity) 문제 ㅇ 독립변수 간의 강한 상관관계로 인해서 회구분석의 결과를 신뢰할 수 없는 현상 ㅇ 생년월일과 나이를 독립변수로 갖는 경우 ㅇ 해결방안 : 강한 상관관계를 갖는 독립변수 제거 ■ Regularization ㅁ 개념 ㅇ 독립변수의 개수가 많을 경우 이를 축소하여 단순화(shrinkage model) ㅇ OLS fitting에 대한 alternative fitting을 통한 MSE 최소화 ㅁ 필요성 ㅇ Prediction Accuracy ㅇ Model Interpretability ㅁ a Subset Selection ㅇ Best Subset Selection ㅇ Stepwise Selection ㅇChoosing the Optimal Model ㅁ Shrinkage Methods ㅇ Ridge Regression ㅇ The Lasso ㅇ Elastic Net(Ridge + Lasso) ■ Non-Linear Regression ㅁ 개념 ㅇ 비선형으로의 확장 ㅇ The truth is never linear ㅇ often the linearity assumption is good enough ㅁ 종류 ㅇ Polynomial Regression : 차수를 높이는 것, 다항식 생성 ㅇ Step 함수 ㅇ Basis 함수 ㅇ Regression Splines ㅇ Smoothing Splines ㅇ Local Regression : 구간별로 LR 구현 ㅇ GAM (Generalized Additive Model) ㅇ Spline의 평활화 반응형
키워드에 대한 정보 비선형 회귀분석 예제
다음은 Bing에서 비선형 회귀분석 예제 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 SPSS를 활용한 회귀분석 – (12) 비선형 회귀분석(Nonlinear Regression Analysis)
- SPSS
- 회귀분석
- 비선형회귀분석
- 비선형최소제곱법
- 비선형최소자승법
- NLS
- 통계파랑
SPSS를 #활용한 #회귀분석 #- #(12) #비선형 #회귀분석(Nonlinear #Regression #Analysis)
YouTube에서 비선형 회귀분석 예제 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 SPSS를 활용한 회귀분석 – (12) 비선형 회귀분석(Nonlinear Regression Analysis) | 비선형 회귀분석 예제, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.