문제
선형 회귀는 데이터에 가장 잘 맞는 직선 y = slope × x + intercept, 즉 제곱 오차의 합이 가장 작은 직선을 찾습니다. 입력 변수가 하나라면 정확한 공식이 있습니다.
- slope = Σ(x - x̄)(y - ȳ) / Σ(x - x̄)²
- intercept = ȳ - slope × x̄
여기서 x̄와 ȳ는 xs와 ys의 평균입니다. xs가 모두 같으면 slope 0과 intercept ȳ를 반환하세요.
linear_regression(xs, ys)를 구현하세요.
입력
xs, ys: 데이터 점들의 x와 y 값 (같은 길이).
출력
[slope, intercept]를 반환하세요.
제약 조건
1 ≤ 점의 수 ≤ 10,000
-10,000 ≤ 각 값 ≤ 10,000
예시
입력:
xs = [1.0, 2.0, 3.0, 4.0]
ys = [3.0, 5.0, 7.0, 9.0]
예상 출력:
expected = [2.0, 1.0]
입력:
std::vector<double> xs = {1.0, 2.0, 3.0, 4.0};
std::vector<double> ys = {3.0, 5.0, 7.0, 9.0};
예상 출력:
std::vector<double> expected = {2.0, 1.0};
입력:
double[] xs = new double[] {1.0, 2.0, 3.0, 4.0};
double[] ys = new double[] {3.0, 5.0, 7.0, 9.0};
예상 출력:
double[] expected = new double[] {2.0, 1.0};
설명
점들은 정확히 y = 2x + 1 위에 있습니다. x̄ = 2.5, ȳ = 6, Σ(x - x̄)(y - ȳ) = 10, Σ(x - x̄)² = 5이므로 slope = 2, intercept = 6 - 2 × 2.5 = 1입니다.
입력:
xs = [0.0, 1.0, 2.0]
ys = [1.0, 3.0, 2.0]
예상 출력:
expected = [0.5, 1.5]
입력:
std::vector<double> xs = {0.0, 1.0, 2.0};
std::vector<double> ys = {1.0, 3.0, 2.0};
예상 출력:
std::vector<double> expected = {0.5, 1.5};
입력:
double[] xs = new double[] {0.0, 1.0, 2.0};
double[] ys = new double[] {1.0, 3.0, 2.0};
예상 출력:
double[] expected = new double[] {0.5, 1.5};
설명
x̄ = 1, ȳ = 2. Σ(x - x̄)(y - ȳ) = (-1)(-1) + 0 + (1)(0) = 1, Σ(x - x̄)² = 2이므로 slope = 0.5, intercept = 2 - 0.5 × 1 = 1.5입니다.
참고 자료
이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.