본문 바로가기

알고리즘/백준 문제 풀이

[Python] 28692번 선형 회귀는 너무 쉬워 2

728x90

https://www.acmicpc.net/problem/28692

 

28692번: 선형 회귀는 너무 쉬워 2

주어진 점이 $(7, 32)$, $(18, 67)$, $(40, 137)$이므로, $n = 3$, $S_x = 65$, $S_y = 236$, $S_{xx} = 1\,973$, $S_{xy} = 6\,910$이다. 즉, $a_2 = \frac{3 \times 6\,910 - 65 \times 236}{3\times 1\,973 - {65}^2} = \frac{5\,390}{1\,694}=\frac{35}{11}

www.acmicpc.net


 

23/08/21

 

 

선형 회귀는 너무 쉬워 시리즈의 두 번째 문제이다. 얼핏 보면 어려운 문제일 것 같지만, 문제만 잘 읽으면 쉽게 해결할 수 있다.


 

문제 접근 방식:

 

 

결국 $\sum (y_i - ax_i - b)^2$가 최소가 되도록 하는 $a$와 $b$의 값을 구하는 것이 우리의 목적이다.

 

이에 대한 답은 문제에 다음과 같이 나와있다.

 

$\sum x_i = S_x$, $\sum y_i = S_y$, $\sum {x_i}^2 = S_{xx}$, $\sum {x_i y_i} = S_{xy}$라고 한다면, 답은 다음과 같다.

 

${S_x}^2 \neq nS_{xx}$일 때의 답은 다음과 같다.

 

$$a = \frac{nS_{xy} - S_x S_y}{nS_{xx} - {S_x}^2}$$

$$b = \frac{S_y - aS_x}{n}$$

 

${S_x}^2 = nS_{xx}$일 때는 가능한 $a$와 $b$의 값이 여러 개이므로, EZPZ를 출력해 주면 된다.

 


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더 보기를 누르면 확인할 수 있다.

더보기
# 선형 회귀는 너무 쉬워 2
import sys
input = sys.stdin.readline

N = int(input())
S_x, S_y, S_xy, S_xx = 0, 0, 0, 0
for _ in range(N):
    x_i, y_i = map(int, input().rstrip().split())
    S_x += x_i
    S_y += y_i
    S_xy += x_i*y_i
    S_xx += x_i*x_i
if S_x*S_x != N*S_xx:
    a_2 = (N*S_xy - S_x*S_y)/(N*S_xx - S_x*S_x)
    b_2 = (S_y - a_2*S_x)/N
    print(a_2, b_2)
else:
    print("EZPZ")