단순한 최소 제곱 계수를 찾기 위해“정상 방정식”을 사용하지 않는 이유는 무엇입니까?


17

나는이 목록을보고 여기 와 최소 제곱를 해결하기 위해 많은 방법이 있었다 믿을 수 없었다. Wikipedia 의 "정상 방정식" 은 매우 간단 해 보입니다 :

α^=와이¯β^엑스¯,β^=나는=1(엑스나는엑스¯)(와이나는와이¯)나는=1(엑스나는엑스¯)2

왜 그냥 사용하지 않습니까? Stone L은 위의 첫 번째 링크에서 SVD 또는 QR이 통계 소프트웨어에서 널리 사용되는 방법이며 정규 방정식은 "신뢰성과 수치 정확도 관점에서 끔찍합니다"라고 언급하면서 계산 또는 정밀도 문제가 있다고 가정했습니다. 그러나 다음 코드에서 일반적인 방정식은 세 가지 인기있는 파이썬 함수와 비교할 때 ~ 12 소수 자리까지 정확도를 제공합니다. numpy 's polyfit ; scipy의 회귀 ; scikit-learn의 LinearRegression .

더 흥미로운 것은 n = 100000000 일 때 정규 방정식 방법이 가장 빠르다는 것입니다. 저의 계산 시간은 다음과 같습니다. polyfit의 경우 12.9s; LinearRegression의 경우 4.2s; 정규 방정식의 경우 1.8 초입니다.

암호:

import numpy as np
from sklearn.linear_model import LinearRegression
from scipy.stats import linregress
import timeit

b0 = 0
b1 = 1
n = 100000000
x = np.linspace(-5, 5, n)
np.random.seed(42)
e = np.random.randn(n)
y = b0 + b1*x + e

# scipy                                                                                                                                     
start = timeit.default_timer()
print(str.format('{0:.30f}', linregress(x, y)[0]))
stop = timeit.default_timer()
print(stop - start)

# numpy                                                                                                                                      
start = timeit.default_timer()
print(str.format('{0:.30f}', np.polyfit(x, y, 1)[0]))
stop = timeit.default_timer()
print(stop - start)

# sklearn                                                                                                                                    
clf = LinearRegression()
start = timeit.default_timer()
clf.fit(x.reshape(-1, 1), y.reshape(-1, 1))
stop = timeit.default_timer()
print(str.format('{0:.30f}', clf.coef_[0, 0]))
print(stop - start)

# normal equation                                                                                                                            
start = timeit.default_timer()
slope = np.sum((x-x.mean())*(y-y.mean()))/np.sum((x-x.mean())**2)
stop = timeit.default_timer()
print(str.format('{0:.30f}', slope))
print(stop - start) 

답이 과장된 것입니다. 역의 계산을 명시 적으로 피하는 것이 그렇게 끔찍한 일은 아닙니다.
mathreadler

3
속도에 대한 몇 가지 참고 사항 : 단일 공변량 만보고 있으므로 행렬 반전 비용은 기본적으로 0입니다. 수천 공변량을 보면 변경됩니다. 둘째, 공변량이 하나뿐이므로 데이터 경쟁은 실제로 패키지 경쟁 업체에서 많은 시간이 소요됩니다 (그러나 선형 적으로 만 확장되므로 큰 문제는 아닙니다). 일반 방정식 솔루션은 데이터 뭉치를 수행하지 않으므로 더 빠르지 만 결과에 종과 휘파람이 붙어 있지 않습니다.
Cliff AB

답변:


22

문제를 들어 일반 식 사각형의 조건 수 형성 형성함으로써 . 대략적으로 말하면 는 모든 것이 잘되면 계산에서 잃어버린 자릿수입니다. 그리고 이것은 실제로 의 역을 형성하는 것과는 아무런 관련이 없습니다 . 가 어떻게 해결 의 정확도를 이미 잃어 버렸습니다 . 즉, 일반 방정식을 형성하면 잃어버린 정확도의 자릿수가 두 배가되었습니다.엑스영형10(영형)엑스=영형10(영형())=2영형10(영형())

조건 번호가 작 으면 (하나만 가능하면) 별 문제가되지 않습니다. 조건 번호 = 이고 QR 또는 SVD와 같은 안정적인 방법을 사용하는 경우 배정 밀도에서 약 8 자리의 정확도를 가질 수 있습니다. 정규 방정식을 구성하면 조건 수를 제곱 한 것이며 본질적으로 답의 정확도가 없습니다.1081016

때때로 당신은 보통 방정식으로 빠져 나가고 때로는 그렇지 않습니다.


2
그것을 보는 더 간단한 방법은 (조건 번호를 모르거나 신경 쓰지 않는다면) 당신이 (본질적으로) 무언가를 스스로 곱하는 것입니다 ( "제곱"). 정도. (A가 스칼라라면 이것은 더 분명해야하며, A를 행렬로 만드는 것이 근본적인 문제를 실제로 변화시키지 않는다는 것을 쉽게 알 수 있어야합니다.)
user541686

정확성의 차이 외에도 QR과 정규 방정식 사이에 큰 속도 차이가 있습니까? 후자의 경우 (X'X) -1 * X'Y를 풀고있을 수 있습니다. 나는 QR이 어떻게 작동하는지 잘 모르겠 기 때문에 묻습니다. 그래서 매트릭스를 뒤집는 것만 큼 느린 것이있을 수 있습니다. 아니면 정확도 손실을 고려해야 할 유일한 지점입니까?
사이먼

4

8

이 하나의 변수 문제 만 해결해야하는 경우 계속해서 공식을 사용하십시오. 아무 문제가 없습니다. 예를 들어 임베디드 장치를 위해 ASM에서 몇 줄의 코드를 작성하는 것을 볼 수 있습니다. 실제로 일부 상황에서는 이런 종류의 솔루션을 사용했습니다. 물론이 작은 문제를 해결하기 위해 큰 통계 라이브러리를 끌 필요는 없습니다.

수치 적 불안정성과 성능은 더 큰 문제와 일반적인 설정의 문제입니다. 다변량 최소 제곱 등을 해결하면 일반적인 문제는 물론 사용하지 않을 것입니다.


0

현대의 통계 패키지는 정규 방정식으로 선형 회귀를 해결할 수 없습니다. 정규 방정식은 통계 장부에만 존재합니다.

역행렬 계산이 매우 문제가되기 때문에 정규 방정식을 사용해서는 안됩니다.

폐쇄 형 수학 솔루션을 사용할 수있는 경우 선형 회귀에 그래디언트 디센트를 사용하는 이유는 무엇입니까?

... 직접 정규 방정식을 사용할 수 있지만. 정규 방정식에서 행렬을 반전시켜야합니다. 이제 행렬을 반전하면 계산에 O (N3)가 필요합니다. 여기서 N은 X 행렬의 행 수, 즉 관측치입니다. 또한 X가 잘못 조절되면 추정에서 계산 오류가 발생합니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.