단일 선형 회귀 (Simple linear regression): x값(독립변수) 하나, y값(종속변수) 하나로 구성됨
다중 선형 회귀 (Multiple linear regression): x값 여러개, y값 하나
y = ax + b
이 때, 기울기 a와 y절편 b를 잘 조절해서 그래프의 점들에 최대한 가까운 선을 긋는 것이 목표임.





#파이썬의 리스트를 numpy 배열로 바꾸는 과정. 이를 통해 더 여러가지의 계산을 수행할 수 있다.
x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])
# 각 원소의 평균 구하는 식
mx = np.mean(x)
my = np.mean(y)
# 첫번째 공식의 분모 부분 실행
divisor = sum([(i - mx)**2 for i in x])
#첫번째 공식의 분자 부분 구하기
def top (x, mx, y, my):
d = 0
for i in range(len(x)):
d += (x[i] - mx) * (y[i] - my)
return d
divided = top(x, mx, y, my)
# 두번째 공식 구하기
b = my - (mx * a)

fa = 3
fb = 76 # 가상의 기울기, y절편
def predict(x):
return fa * x + fb
# mse 계산
n = len(x)
def mse(y, yp):
return (1/n) * sum((y - yp)**2)

x축: 기울기, Y축: 오차(loss)
기울기가 2차함수의 가장 아랫쪽 볼록한 부분(미분값 = 0)에 위치할 때 오차가 최소가 됨.
학습률(learning rate): 이 때, 기울기값을 얼마씩 이동시킬 것인지를 정하는 값이 학습률임.
계산 방법
(1) MSE 식에 predicted values = axi + b를 대입

(2) 식을 각각 m, b에 대해 편미분 -> 다중으로 바뀌어서 변수가 많아지더라도 동일하게 각각 편미분하고, update함.



(3) updated m, b 구하기
updated m = m - 학습률 (2)번 a에 대한 편미분 결과
updated b = b - 학습률 (2)번 b에 대한 편미분 결과
x1 = np.array([2, 4, 6, 8)]
x2 = np.array([0, 4, 2, 3)]
y = np.array([81, 93, 91, 97)]
fig = plt.figure()
ax=fig.add_subplot(111, projection='3d')
ax.scatter3D(x1, x2, y)
plt.show()
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model.add(Dense(1, input_dim = 1, activation='linear') # 출력값, 입력변수(다중선형회귀이면 얘를 변경해줌), 분석방법
model.compile(optimizer='sgd', loss='mse') # 오차수정: sgd(경사하강법), 오차정도판단: mse(평균제곱오차)
model.fit(x, y, epochs=2000) # 오차 최소화 과정 2000번 반복
#시각화
plt.scatter(x, y)
plt.plot(x, model.predict(x), 'r')
plt.show()

x = ax + b



-{y * logh + (1-y) * log(1-h)}
1 : -logh0 : -log(1-h)