선형회귀(linear Regression)이란?
X = 성적이 변화하는 '정보' 요소
Y = X값에 의해 변하는 성적
X값이 변함에 따라 Y값도 변한다는 정의 안에서
X = 독립변수(독립적으로 변할 수 있는 값)
Y = 종속변수(독립 변수에 따라 종속적으로 변하는 값)
선형회귀란 독립변수 X를 사용해 종속변수 Y의 움직임을 예측하고 설명하는 작업이다.
- 단순선형회귀(simple linear regression)
: 하나의 x값으로 y값을 설명가능 할 때 단순선형회귀라 한다.
- 다중선형회귀(multiple linear regression)
: 여러개의 x값으로 y값을 설명가능 할 때 다중선형회귀라 한다.
최소제곱법(method of least squares)
회귀 분석에서 사용되는표준 방식.
실험이나 관찰을 통해 얻은 데이터를 분석해, 미지의 상수를 구할 때 사용되는 공식
import numpy
# x, y 값 리스트로 만들기
# x = 공부시간(독립변수), y = 성적(종속변수)
x = [2,4,6,8]
y = [78, 81, 90, 93]
# x, y의평균값 구하기
mx = np.mean(x)
my = np.mean(y)
print("x 평균값:", mx)
print("y 평균값:", my)
numpy 라이브러리를 불러오고 x,y값 리스트로 생성하기
mx, my x,y의 평균값 구하기
# 분모구하기
divisor = sum([mx-i]**2 for i in x])
# 분자구하기
def top (x, mx, y, my):
d = 0
d +=(x[i]-mx)*(y[i]-my)
return d
dividend = top(x, mx, y, my)
print("분모", divisor)
print("분자", dividend)
분모값 = (x각 원소값 - x평균값)**2 (제곱)
분자값 = (x각 원소값 - x평균값)*(y각 원소값 - y평균값)
# 기울기 a 구하기
a = divisor / dividend
# y절편 b 구하기
b = my -(mx*a)
print("기울기 a =", a)
print("y절편 b =", b)
기울기 a = 분모/분자
y절편 b = y평균값 - 기울기*x평균값
평균제곱오차 MSE(Mean Squard Error)
추측값에 대한 정확성을 측정하는 방법
오차의 제곱을 평균으로 나눈 값
MSE가 0에 가까울수록 정확도가 높음
예측값, 실제값 차이는 차이값 면적의 평균
평균 제곱근 오차(RMSE, Root Mean Squared Error)
평균제곱오차MSE를 사용할 경우, 오차가 너무 커서 대용량 데이터 이용 시 불편함이 있다.
평균제곱오차에 제곱근을 씌워 평균제곱근오차(RMSE)를 사용한다.
선형회귀에서 RMSE를 가장 작게 만드는 a, b 값을 찾는 작업이라 할 수 있다.
ab = [3, 76]
# data list 만들기
# i[0] = list 첫번째 값, i[1] = list 두번째 값
data = [[2, 80], [4, 92], [6, 87], [8, 95]]
x = [i[0] for i in data]
y = [i[1] for i in data]
임의 기울기, y절편 값 ab = [3, 76]으로 설정
data x리스트, y리스트 만들기
def predict(x):
return ab[0] * x + ab[1]
내부함수 생성 : predict()함수로 y=ax+b 일차함수 구현
# RMSE 공식
def rmse(p, a):
return np.sqrt(((p-a)**2).mean())
# RMSE 공식에 데이터 대입
def rmse_val(predict_result, y):
return rmse(np.array(predict_result), np.array(y))
predict_result = predict 결과 값이 들어감
predict결과값, y값이 각각 예측/실제 값으로 rmse() 함수 안에 들어감
# 최종갑 출력하기
# predict_result 빈 리스트만들기
predict_result =[]
# 모든 데이터값 대입하기
for i in range(len(x)):
predict_result.append(predict(x[i]))
print("공부시간=%.f, 실제점수=%.f, 예측점수=%.f" % (x[i], y[i], predict(x[i])))
predict_result = [] 빈 리스트를 만들어준다
for i in range(len(x)): 반복문으로 x값 반복하기
predict_result 빈리스트에 predict x값을추가해준다.
최종코드
# 최소제곱법(method of least squares)
import numpy as np
# X = 공부한시간, Y = 성적
# list 형식 정의
x = [2,4,6,8]
y = [81, 93, 91, 97]
mx = np.mean(x)
my = np.mean(y)
print("x 평균값:", mx)
print("y 평균값:", my)
# 분모
# (x 각 원소값 - x평균값) 제곱
divisor = sum([(mx-i)**2 for i in x])
# 분자
# (x 각 원소값 - x평균값)*(y 각 원소값 - y 평균값) 더하기
def top(x, mx, y, my):
d=0
for i in range(len(x)): # x개수만큼 실행
d += (x[i] - mx) * (y[i] - my)
return d
dividend = top(x, mx, y, my)
print("분모", divisor)
print("분자", dividend)
# 기울기 a
a = dividend / divisor
# y절편 b
b = my -(mx*a)
# 출력하기
print("기울기 a =", a)
print("y 절편 b", b)
# 평균제곱근 오차(root mean square error)
import numpy as np
# 기울기 a, y절편 b
ab = [3, 76]
# data list 만들기
# i[0] = list 첫번째 값, i[1] = list 두번째 값
data = [[2, 80], [4, 92], [6, 87], [8, 95]]
x = [i[0] for i in data]
y = [i[1] for i in data]
def predict(x):
return ab[0]*x + ab[1]
# 평균제곱근 공식 -> python 함수로
# np.squr() = 제곱근, **2 제곱, mean() 평균값 구하기
def rmse(p, a):
return np.sqrt(((p -a)**2).mean())
# rmse 함수에 데이터 대입해 최종값 구하기
def rmse_val(predict_result, y):
return rmse(np.array(predict_result), np.array(y))
# 최종값 출력하기
# predict_result 빈 리스트 만들기
predict_result = []
for i in range(len(x)):
predict_result.append(predict(x[i]))
print("공부시간=%.f, 실제점수=%.f, 예측점수=%.f" % (x[i], y[i], predict(x[i])))
'머신러닝딥러닝 > 딥러닝' 카테고리의 다른 글
딥러닝(Deep Learning) #6 - 퍼셉트론 (0) | 2022.04.12 |
---|---|
딥러닝(deeplearning) #5 - 다항 로지스틱 회귀(Multi_Logistic_Regression) (0) | 2022.04.12 |
딥러닝(deeplearning) #4 - 로지스틱 회귀(logistic regression) (0) | 2022.04.12 |
딥러닝(deeplearning) #3 - 경사하강법 (0) | 2022.04.11 |
딥러닝(deeplearning) #1 - 폐암 수술 환자의 생존율 예측 (1) | 2022.04.11 |
댓글