206강에서 정규 가정이 제곱오차를 낳는다고 했습니다. 이제 그것을 실제로 풉니다.
그런데 이 식을 그대로 풀면 안 됩니다. 를 만드는 순간 조건수가 제곱이 되고, 강에서 본 자릿수 손실이 그대로 일어납니다.
이 강의는 정규방정식을 강의 정사영으로 읽고, 왜 직접 풀면 안 되는지 보이고, 회귀의 여러 사실이 정사영 하나에서 나온다는 것까지 갑니다.
문제. 정규방정식을 읽습니다.
(1) 잔차가 무엇과 직교하는지 확인하세요.
(2) 사영행렬의 성질을 확인하세요.
(3) 자유도가 왜 인지 보세요.
생각의 실마리. 제곱오차를 로 미분해 으로 두면 입니다. 이것은 잔차가 의 모든 열과 직교한다는 뜻입니다.
풀이. (1) 확인합니다.
| 무엇을 확인 | 값 | 이론값 |
|---|---|---|
| 잔차와 각 열의 내적 최대 | ||
| 잔차와 예측의 내적 | ||
| 잔차 제곱합 나누기 |
잔차가 의 모든 열과 직교합니다. 그것이 정규방정식의 뜻입니다.
예측값은 의 열공간 위에 있고 잔차는 그 공간에 수직입니다. 강의 정사영이 그대로 나온 것입니다.
(2) 사영행렬의 성질을 확인합니다. 입니다.
| 무엇 | 값 | 이론값 |
|---|---|---|
| 를 두 번 곱한 것과의 차 | ||
| 와 전치의 차 | ||
| 의 대각합 | ||
| 고유값의 최댓값 | ||
| 고유값의 최솟값 |
제곱해도 그대로이고 대칭입니다. 사영행렬의 정의입니다.
대각합이 변수 개수와 같습니다. 그것이 자유도입니다.
고유값이 아니면 입니다. 열공간 안이면 이고 밖이면 입니다.
(3) 자유도가 왜 인지 봅니다.
| 표본 | 변수 | 잔차 제곱합의 평균 | 로 나눈 값 |
|---|---|---|---|
으로 나누면 참값 보다 작습니다. 개의 방향을 이미 썼기 때문입니다.
로 나누면 참값에 붙습니다. 강 문제 와 같은 이유이며, 표본 에서 가 이 됩니다.
이 문제에서 배우는 것. "로 나눈다"는 규칙이 규칙이 아니라 기하입니다. 잔차는 차원 공간이 아니라 열공간에 수직인 차원 부분공간에 삽니다. 그래서 잔차 제곱합의 기댓값이 이고, 그 차원으로 나눠야 불편이 됩니다. 강의 카이제곱 자유도, 강의 분산분석 자유도가 전부 같은 계산이며, **자유도는 언제나 "그 벡터가 사는 공간의 차원"**입니다.
바로 확인 1.
확인 1-1. 정규방정식을 쓰고 그 기하적 뜻을 쓰세요.
답. 이며 잔차가 의 열공간에 수직이라는 뜻입니다.
확인 1-2. 검산에서 사영행렬의 대각합과 고유값 범위를 쓰세요.
답. 대각합이 이고 고유값이 아니면 입니다.
확인 1-3. 검산에서 표본 일 때 두 나누기의 결과를 쓰세요.
답. 와 입니다.
문제. 수치 안정성을 봅니다.
(1) 조건수가 제곱되는지 확인하세요.
(2) 실제로 얼마나 잃는지 재세요.
(3) 푸는 법을 정리하세요.
생각의 실마리. 를 만드는 것이 정보를 잃는 연산입니다.
풀이. (1) 조건수를 확인합니다.
| 만들려는 조건수 | 의 조건수 | 의 조건수 | 의 조건수 제곱 |
|---|---|---|---|
조건수가 제곱이 됩니다. 강 문제 의 내용입니다.
배정도 부동소수점은 대략 자리를 담습니다. 조건수가 을 넘으면 정규방정식으로는 자릿수를 절반 넘게 잃습니다.
(2) 실제로 얼마나 잃는지 잽니다.
| 의 조건수 | 정규방정식 오차 | QR 오차 | 몇 배 |
|---|---|---|---|
조건수가 이면 정규방정식의 오차가 입니다. 계수 자체가 인데 오차가 그만큼이면 답이 없는 것과 같습니다.
같은 자리에서 QR은 입니다. 같은 답을 구하는데 계산 경로가 다르면 정확도가 다릅니다.
(3) 푸는 법을 정리합니다.
| 방법 | 계산량 | 정확도 | 언제 |
|---|---|---|---|
| 정규방정식 | 나쁨 | 조건수가 좋을 때만 | |
| QR 분해 | 2np^ | 좋음 | 표준 |
| 특이값 분해 | 더 비쌈 | 가장 좋음 | 계수가 모자랄 때 |
| 반복법 | 곱셈 여러 번 | 설정에 딸림 | 아주 클 때 |
실무 라이브러리는 기본으로 둘째나 셋째를 씁니다.
이 문제에서 배우는 것. 수식이 맞다고 그대로 계산하면 안 된다는 것이 수치해석의 핵심입니다. 는 수학적으로 옳지만 계산 절차로는 최악이며, 역행렬을 명시적으로 구하는 것은 더 나쁩니다. 강에서 배운 것이 여기서 실제 손해로 나타났고, 같은 교훈이 강의 플래시어텐션과 강의 부동소수점 형식에서 되풀이됩니다. "어떻게 계산하는가"가 "무엇을 계산하는가"만큼 중요합니다.
바로 확인 2.
확인 2-1. 를 만들면 조건수가 어떻게 되는지 쓰세요.
답. 제곱이 됩니다.
확인 2-2. 검산에서 조건수 일 때 두 방법의 오차를 쓰세요.
답. 과 입니다.
확인 2-3. 표준으로 쓰는 방법과 계수가 모자랄 때 쓰는 방법을 쓰세요.
답. QR 분해와 특이값 분해입니다.
문제. 변수가 표본보다 많을 때를 봅니다.
(1) 해가 무한히 많음을 보이세요.
(2) 릿지가 무엇을 하는지 보세요.
(3) 특이값을 보세요.
생각의 실마리. 가 역행렬을 안 가집니다. 그러면 해가 하나로 안 정해집니다.
풀이. (1) 표본 에 변수 이고 잡음은 없습니다.
| 어떤 해 | 잔차 제곱합 | 계수의 크기 | 판정 |
|---|---|---|---|
| 최소 노름 해 | 맞음 | ||
| 영공간을 더한 해 | 맞음 | ||
| 참 계수 | 맞음 |
셋 다 잔차가 입니다. 자료만으로는 고를 수 없습니다.
최소 노름 해가 로 가장 작습니다. 특이값 분해가 그것을 줍니다.
참 계수 보다도 작습니다. 작다고 참인 것은 아닙니다.
(2) 릿지가 무엇을 하는지 봅니다.
| 계수의 크기 | 참 계수와의 거리 | 잔차 제곱합 | |
|---|---|---|---|
를 으로 보내면 최소 노름 해로 갑니다.
를 키우면 잔차가 늘고 계수가 줄어듭니다.
잡음이 없어도 참 계수를 못 찾습니다. 참 계수와의 거리가 에서 안 줄어들며, 정보가 모자라기 때문입니다.
(3) 특이값을 봅니다.
| 몇 번째 특이값 | 값 | 가장 큰 것 대비 |
|---|---|---|
개뿐입니다. 차원인데 방향만 정보가 있습니다.
나머지 방향은 자료가 아무 말도 안 합니다. 강의 차원의 저주가 여기서 계수의 부족으로 나타납니다.
이 문제에서 배우는 것. "잔차가 "이 정보가 충분하다는 뜻이 전혀 아닙니다. 위 표에서 세 개의 완전히 다른 해가 모두 자료를 정확히 맞췄고, 그중 하나도 참이 아니었습니다. 강 문제 에서 차수 다항식이 점 개를 다 지났던 것과 같은 자리이며, 차이는 여기서는 잡음조차 없다는 것입니다. 자료가 답을 정하지 못할 때 답을 정하는 것은 우리가 넣은 가정이고, 최소 노름이든 릿지든 라소든 그 가정의 이름입니다.
바로 확인 3.
확인 3-1. 변수가 표본보다 많으면 왜 해가 무한히 많은지 쓰세요.
답. 영공간이 비어 있지 않아 거기에 무엇을 더해도 잔차가 그대로이기 때문입니다.
확인 3-2. 검산에서 세 해의 계수 크기를 쓰세요.
답. , , 입니다.
확인 3-3. 검산에서 차원 자료의 특이값이 몇 개인지 쓰세요.
답. 개이며 나머지 방향은 정보가 없습니다.
문제. 흩어진 사실을 묶습니다.
(1) 대응을 정리하세요.
(2) 결정계수를 사영의 길이로 확인하세요.
(3) 변수 추가의 효과를 보세요.
생각의 실마리. 강과 강에서 따로 배운 것들이 하나의 그림에서 나옵니다.
풀이. (1) 정리합니다.
| 무엇 | 정사영으로 읽으면 |
|---|---|
| 잔차와 의 상관이 | 잔차가 열공간에 수직 |
| 결정계수 | 예측의 길이 제곱 나누기 전체 |
| 자유도 | 잔차가 사는 공간의 차원 |
| 레버리지 | 사영행렬의 대각 원소 |
| 변수 추가로 안 줄어듦 | 공간이 커지면 사영이 가까워짐 |
(2) 결정계수를 확인합니다.
| 무엇 | 값 | 차이 |
|---|---|---|
| 결정계수 | ||
| 와 예측의 상관 제곱 |
결정계수가 중심화한 예측의 길이 제곱 비와 같습니다.
와 예측의 상관 제곱과도 같습니다. 셋이 같은 값이며, 차이는 부동소수점 오차뿐입니다.
레버리지도 확인합니다.
| 무엇 | 값 | 이론값 |
|---|---|---|
| 레버리지의 합 | ||
| 레버리지의 평균 | ||
| 레버리지의 최댓값 | 없음 | |
| 레버리지의 최솟값 | 없음 |
합이 변수 개수와 같고 평균이 입니다. 강 문제 의 레버리지가 사영행렬의 대각이었습니다.
(3) 변수 추가의 효과를 봅니다.
| 변수 개수 | 결정계수 | 수정 결정계수 | 추가한 변수 |
|---|---|---|---|
| 없음 | |||
| 참 변수 셋 | |||
| 잡음 일곱 더 | |||
| 잡음 서른 더 | |||
| 잡음 예순 더 |
변수를 더하면 결정계수가 절대 안 줄어듭니다. 공간이 커지면 사영이 에 더 가까워지기 때문입니다.
잡음만 더해도 이 로 오릅니다.
수정 결정계수는 벌점 때문에 에서 로 내려갑니다. 강 문제 의 이야기가 정사영으로 설명됩니다.
이 문제에서 배우는 것. 정사영이라는 그림 하나가 회귀의 거의 모든 성질을 설명합니다. 잔차의 직교성, 자유도, 레버리지, 결정계수, 변수 추가의 단조성이 전부 "열공간에 수직으로 내린다"는 한 문장에서 나옵니다. 그래서 회귀를 행렬 계산이 아니라 기하로 익히면 새로운 상황에서도 답을 유추할 수 있습니다. 가중 회귀는 내적을 바꾼 정사영이고, 릿지는 열공간을 넓히지 않고 당기는 것이며, 강의 커널 방법은 열공간을 무한차원으로 늘린 것입니다.
바로 확인 4.
확인 4-1. 레버리지가 무엇인지 정사영으로 쓰세요.
답. 사영행렬의 대각 원소입니다.
확인 4-2. 검산에서 레버리지의 합과 평균을 쓰세요.
답. 과 입니다.
확인 4-3. 검산에서 변수 개와 개의 두 결정계수를 쓰세요.
답. 과 , 와 입니다.
문제. 확인할 것을 정합니다.
(1) 점검 항목을 정리하세요.
(2) 눈금의 영향을 보세요.
(3) 절편을 정규화하면 어떻게 되는지 보세요.
생각의 실마리. 식은 하나인데 자료를 어떻게 넣느냐가 결과를 바꿉니다.
풀이. (1) 점검 항목입니다.
| 무엇 | 왜 |
|---|---|
| 절편을 넣었는가 | 안 넣으면 원점을 지나야 함 |
| 변수의 눈금 | 정규화와 조건수에 영향 |
| 조건수 | 계수를 못 믿는 자리 |
| 표본 대 변수 비 | 계수가 모자랄 수 있음 |
| 잔차 진단 | 강의 다섯 가지 |
둘째 줄이 자주 빠집니다. 눈금이 다르면 정규화가 불공평해집니다.
(2) 눈금의 영향을 봅니다. 세 변수의 눈금이 백만 배까지 차이 납니다.
| 무엇 | 조건수 | 판정 |
|---|---|---|
| 원자료 | 나쁨 | |
| 표준화한 뒤 | 좋음 |
표준화만 해도 조건수가 에서 으로 좋아집니다.
| 정규화 대상 | 첫째 계수 축소율 | 둘째 계수 축소율 | 셋째 계수 축소율 |
|---|---|---|---|
| 원자료에 릿지 | |||
| 표준화 뒤 릿지 |
원자료에 릿지를 걸면 눈금이 가장 작은 셋째 계수만 으로 뭉갭니다.
둘째 계수는 로 오히려 조금 늘었습니다. 벌점이 사실상 안 걸립니다.
표준화한 뒤에 걸면 셋이 근처로 비슷하게 줄어듭니다. 정규화 전에 표준화하는 것이 관례인 이유입니다.
(3) 절편을 정규화하면 어떻게 되는지 봅니다. 의 평균이 근처인 자료입니다.
| 무엇을 정규화 | 절편 | 예측 평균 | 의 평균 |
|---|---|---|---|
| 절편까지 | |||
| 계수만 |
절편까지 벌주면 절편이 에서 로 눌리고 예측 평균이 의 평균에서 벗어납니다.
계수만 벌주면 예측 평균이 의 평균과 정확히 같습니다. 강 문제 에서 본 최대우도의 보증입니다.
절편은 눈금에 딸린 값이라 으로 당길 이유가 없습니다. 그래서 정규화는 언제나 절편을 뺀 계수에만 겁니다.
이 문제에서 배우는 것. 정규화는 좌표계에 딸린 연산입니다. 라는 벌점은 "계수가 작으면 좋다"고 말하는데, 계수의 크기는 변수의 단위에 딸린 값이므로 단위를 바꾸면 벌점의 뜻이 바뀝니다. 위 표의 첫 줄이 그것을 보여 주며, 미터를 밀리미터로 바꾸기만 해도 그 변수의 계수가 분의 이 되어 벌점을 거의 안 받습니다. 그래서 표준화는 정규화의 전처리가 아니라 정규화의 일부이고, 강에서 이 성질을 다시 다룹니다.
바로 확인 5.
확인 5-1. 검산에서 표준화 전후의 조건수를 쓰세요.
답. 와 입니다.
확인 5-2. 검산에서 원자료에 릿지를 걸었을 때 세 계수의 축소율을 쓰세요.
답. , , 입니다.
확인 5-3. 검산에서 절편을 정규화했을 때와 안 했을 때의 절편을 쓰세요.
답. 와 입니다.
| 무엇 | 식 |
|---|---|
| 정규방정식 | |
| 사영행렬 | H=X(X^{\top}X)^{-1}X^ |
| 잔차 | |
| 자유도 | |
| 레버리지 | 의 대각 원소 |
| 릿지 |
| 사영행렬의 성질 | 값 |
|---|---|
| H^ | |
| H^ | |
| 대각합 | |
| 고유값 | 아니면 |
| 푸는 법 | 언제 |
|---|---|
| 정규방정식 | 조건수가 좋을 때만 |
| QR 분해 | 표준 |
| 특이값 분해 | 계수가 모자랄 때 |
| 반복법 | 아주 클 때 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 정규방정식을 그대로 풉니다 | 조건수가 제곱됩니다 |
| 역행렬을 명시적으로 구합니다 | 더 나쁩니다 |
| 잔차 을 좋다고 봅니다 | 정보가 모자란 것일 수 있습니다 |
| 눈금이 다른 채로 정규화합니다 | 벌점이 불공평해집니다 |
| 절편까지 정규화합니다 | 예측 평균이 어긋납니다 |
문제 6. 정규방정식을 쓰고 그 기하적 뜻을 쓰세요.
답. 이며 잔차가 의 열공간에 수직이라는 뜻입니다.
문제 7. 검산에서 사영행렬의 대각합과 고유값 범위를 쓰세요.
답. 대각합이 이고 고유값이 아니면 입니다.
문제 8. 검산에서 표본 일 때 두 나누기의 결과를 쓰세요.
답. 와 입니다.
문제 9. 를 만들면 조건수가 어떻게 되는지 쓰세요.
답. 제곱이 됩니다.
문제 10. 검산에서 조건수 일 때 두 방법의 오차를 쓰세요.
답. 과 입니다.
문제 11. 검산에서 세 해의 계수 크기를 쓰세요.
답. , , 입니다.
문제 12. 검산에서 차원 자료의 특이값이 몇 개인지 쓰세요.
답. 개입니다.
문제 13. 레버리지가 무엇인지 정사영으로 쓰세요.
답. 사영행렬의 대각 원소입니다.
문제 14. 검산에서 레버리지의 합과 평균을 쓰세요.
답. 과 입니다.
문제 15. 검산에서 변수 개와 개의 두 결정계수를 쓰세요.
답. 과 , 와 입니다.
문제 16. 검산에서 표준화 전후의 조건수를 쓰세요.
답. 와 입니다.
문제 17. 검산에서 원자료에 릿지를 걸었을 때 세 계수의 축소율을 쓰세요.
답. , , 입니다.
문제 18. 검산에서 절편을 정규화했을 때와 안 했을 때의 절편을 쓰세요.
답. 와 입니다.
심화 1. QR 분해로 푸는 절차를 정리하세요.
| 단계 | 무엇 |
|---|---|
| 분해 | 를 로 |
| 대입 | |
| 후진 대입 | 상삼각이라 뒤에서부터 |
를 아예 안 만듭니다. 그래서 조건수가 제곱되지 않습니다.
의 열이 열공간의 정규직교기저입니다. 이므로 사영이 더 명확합니다.
그람-슈미트보다 하우스홀더 반사를 씁니다. 수치적으로 훨씬 안정적입니다.
심화 2. 특이값 분해로 읽는 릿지를 정리하세요.
| 무엇 | 최소제곱 | 릿지 |
|---|---|---|
| 번째 방향의 배율 | 1/\sigma_ | |
| 가 클 때 | 그대로 | 거의 그대로 |
| 가 작을 때 | 폭발 | 눌림 |
작은 특이값 방향에서 최소제곱이 폭발하고 릿지가 그것을 막습니다.
강 문제 의 공선성이 작은 특이값입니다.
가 그 방향들만 골라서 줄이므로 큰 방향은 거의 안 건드립니다. 그것이 릿지가 예측을 크게 안 해치면서 분산을 줄이는 이유입니다.
심화 3. 가중 최소제곱을 정사영으로 정리하세요.
| 무엇 | 보통 | 가중 |
|---|---|---|
| 내적 | ||
| 직교 | ||
| 해 |
내적을 바꾼 정사영입니다. 기하는 그대로이고 각도의 정의만 달라집니다.
강 문제 의 가중 제곱오차가 이것입니다. 가 분산의 역수일 때 최대우도가 됩니다.
강의 IRLS도 이 틀입니다. 매 걸음마다 를 다시 계산합니다.
심화 4. 프리슈-워-로벨 정리를 정리하세요.
여러 변수 중 하나의 계수를 따로 얻는 법입니다.
| 단계 | 무엇 |
|---|---|
| 첫째 | 을 나머지 변수에 회귀해 잔차를 얻음 |
| 둘째 | 를 나머지 변수에 회귀해 잔차를 얻음 |
| 셋째 | 두 잔차를 회귀 |
셋째 단계의 기울기가 전체 회귀의 계수와 정확히 같습니다.
강 문제 의 "다른 변수를 통제한 뒤"가 이 절차입니다.
강의 이중차분도 이 정리의 특수한 경우로 읽힙니다. 고정효과를 빼는 것이 잔차를 만드는 일입니다.
심화 5. 온라인 갱신을 정리하세요.
자료가 하나씩 들어올 때 처음부터 다시 안 풀어도 됩니다.
| 방법 | 어떻게 |
|---|---|
| 셔먼-모리슨 | 역행렬을 한 계단씩 갱신 |
| QR 갱신 | 기븐스 회전으로 행 추가 |
| 재귀 최소제곱 | 칼만 필터의 특수한 경우 |
첫째 줄이 간단하지만 조건수가 나쁘면 무너집니다.
둘째 줄이 안정적이고 실무에서 쓰입니다.
셋째 줄이 강 심화 의 상태공간과 이어집니다. 계수가 천천히 변하는 경우까지 다룹니다.
심화 6. 이 강의가 남긴 문제를 정리하세요.
닫힌 해가 있는 문제를 풀었습니다.
| 무엇을 못 했나 | 어디서 |
|---|---|
| 닫힌 해가 없는 문제 | 강 |
| 반복을 몇 번 할지 | 강 |
| 여러 갈래로 넓히기 | 강 |
로지스틱에는 정규방정식 같은 닫힌 해가 없습니다. 대신 강에서 본 기울기가 깔끔하므로 뉴턴 방법이 잘 듣습니다. 강의 IRLS가 그것이고, 강은 그것을 처음부터 유도합니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 정규방정식 | normal equations | 기울기를 으로 둔 식입니다 |
| 사영행렬 | 열공간으로 내리는 행렬입니다 | |
| 레버리지 | leverage | 의 대각 원소입니다 |
| 조건수 | condition number | 가장 큰 특이값 나누기 가장 작은 것입니다 |
| QR 분해 | QR decomposition | 직교와 상삼각의 곱입니다 |
| 특이값 분해 | SVD | 세 행렬의 곱으로 나눕니다 |
| 최소 노름 해 | minimum norm solution | 잔차가 같은 해 중 가장 작은 것입니다 |
| 영공간 | null space | 인 들의 집합입니다 |
| 유사역행렬 | pseudoinverse | 최소 노름 해를 주는 연산입니다 |
| 프리슈-워-로벨 | FWL | 잔차끼리 회귀해 계수를 얻습니다 |
다음은 208강 로지스틱 회귀의 학습입니다. 이 강의가 닫힌 해가 있는 문제를 풀었습니다.
로지스틱 회귀에는 정규방정식 같은 공식이 없습니다. 대신 강에서 본 기울기가 깔끔하고 헤세 행렬이 관측에 안 딸리므로 뉴턴 방법이 아주 잘 듣습니다. 강은 IRLS를 처음부터 유도하고, 완전 분리와 수렴 실패까지 다룹니다.
import numpy as np
rng = np.random.default_rng(20261014)
def pw(s, n):
k = n - sum(2 if ord(c) > 0x2FFF else 1 for c in str(s))
return str(s) + " " * max(k, 0)
def rw(s, n):
k = n - sum(2 if ord(c) > 0x2FFF else 1 for c in str(s))
return " " * max(k, 0) + str(s)
# --- 문제 1: 정규방정식과 정사영 ----------------------------------------
print(" 206강에서 정규 가정이 제곱오차를 낳는다고 했습니다. 이제 풉니다")
print(" 기울기를 0 으로 두면 정규방정식이 나옵니다")
print(" X 전치 X w = X 전치 y 입니다")
n1 = 500
p1 = 4
X1 = rng.normal(0, 1, (n1, p1))
w1 = np.array([1.0, -2.0, 0.5, 1.5])
y1 = X1 @ w1 + rng.normal(0, 1.0, n1)
w_hat = np.linalg.solve(X1.T @ X1, X1.T @ y1)
resid = y1 - X1 @ w_hat
print(" %s %s %s"
% (pw("무엇을 확인", 30), rw("값", 20), rw("이론값", 14)))
for nm, v, t in [("잔차와 각 열의 내적 최대", float(np.abs(X1.T @ resid).max()), 0.0),
("잔차와 예측의 내적", float(np.dot(resid, X1 @ w_hat)), 0.0),
("잔차 제곱합 나누기 n", float(np.mean(resid ** 2)), 1.0)]:
print(" %s %20.10f %14.4f" % (pw(nm, 30), v, t))
print(" 잔차가 X 의 모든 열과 직교합니다. 그것이 정규방정식의 뜻입니다")
print(" 예측값은 X 의 열공간 위에 있고 잔차는 그 공간에 수직입니다")
print(" 80강의 정사영이 그대로 나온 것입니다")
print(" 사영행렬의 성질을 확인합니다")
H = X1 @ np.linalg.solve(X1.T @ X1, X1.T)
print(" %s %s %s"
% (pw("무엇", 26), rw("값", 20), rw("이론값", 14)))
for nm, v, t in [("H 를 두 번 곱한 것과의 차", float(np.abs(H @ H - H).max()), 0.0),
("H 와 전치의 차", float(np.abs(H - H.T).max()), 0.0),
("H 의 대각합", float(np.trace(H)), float(p1)),
("고유값의 최댓값", float(np.linalg.eigvalsh(H).max()), 1.0),
("고유값의 최솟값", float(np.linalg.eigvalsh(H).min()), 0.0)]:
print(" %s %20.10f %14.4f" % (pw(nm, 26), v + 0.0, t))
print(" 제곱해도 그대로이고 대칭입니다. 사영행렬의 정의입니다")
print(" 대각합이 변수 개수와 같습니다. 그것이 자유도입니다")
print(" 고유값이 0 아니면 1 입니다. 열공간 안이면 1 밖이면 0 입니다")
print(" 자유도가 왜 n 빼기 p 인지 봅니다")
print(" %s %s %s %s"
% (pw("표본", 10), rw("변수", 10), rw("잔차 제곱합의 평균", 22),
rw("n 빼기 p 로 나눈 값", 22)))
for n, p in [(10, 4), (20, 4), (100, 4), (1000, 4)]:
s1, s2 = [], []
for _ in range(2000):
X = rng.normal(0, 1, (n, p))
y = X @ np.ones(p) + rng.normal(0, 1.0, n)
w = np.linalg.solve(X.T @ X, X.T @ y)
r = y - X @ w
s1.append(float(r @ r) / n)
s2.append(float(r @ r) / (n - p))
print(" %s %10d %22.6f %22.6f"
% (pw("%d" % n, 10), p, float(np.mean(s1)), float(np.mean(s2))))
print(" n 으로 나누면 참값 1 보다 작습니다. p 개의 방향을 이미 썼기 때문입니다")
print(" n 빼기 p 로 나누면 참값에 붙습니다. 163강 문제 2 와 같은 이유입니다")
# --- 문제 2: 정규방정식을 직접 풀면 안 됩니다 ---------------------------
print(" 정규방정식을 그대로 푸는 것은 나쁜 생각입니다")
print(" X 전치 X 를 만들면 조건수가 제곱이 됩니다")
print(" %s %s %s %s"
% (pw("만들려는 조건수", 18), rw("X 의 조건수", 16),
rw("X 전치 X 의 조건수", 22), rw("X 의 조건수 제곱", 22)))
for c in [1e1, 1e3, 1e5, 1e7]:
U, _ = np.linalg.qr(rng.normal(0, 1, (60, 4)))
V, _ = np.linalg.qr(rng.normal(0, 1, (4, 4)))
sv = np.geomspace(1.0, 1.0 / c, 4)
Xc = U @ np.diag(sv) @ V.T
k1 = float(np.linalg.cond(Xc))
k2 = float(np.linalg.cond(Xc.T @ Xc))
print(" %s %16.4e %22.4e %22.4e"
% (pw("%.0e" % c, 18), k1, k2, k1 * k1))
print(" 조건수가 제곱이 됩니다. 92강 문제 3 의 내용입니다")
print(" 배정도 부동소수점은 대략 16 자리를 담습니다")
print(" 조건수가 1e8 을 넘으면 정규방정식으로는 자릿수를 절반 넘게 잃습니다")
print(" 실제로 얼마나 잃는지 봅니다")
print(" %s %s %s %s"
% (pw("X 의 조건수", 16), rw("정규방정식 오차", 22), rw("QR 오차", 20),
rw("몇 배", 14)))
for c in [1e2, 1e5, 1e8, 1e10]:
U, _ = np.linalg.qr(rng.normal(0, 1, (80, 5)))
V, _ = np.linalg.qr(rng.normal(0, 1, (5, 5)))
sv = np.geomspace(1.0, 1.0 / c, 5)
Xc = U @ np.diag(sv) @ V.T
w_true = rng.normal(0, 1, 5)
yc = Xc @ w_true
try:
w_ne = np.linalg.solve(Xc.T @ Xc, Xc.T @ yc)
e_ne = float(np.linalg.norm(w_ne - w_true))
except np.linalg.LinAlgError:
e_ne = float("inf")
Q, R = np.linalg.qr(Xc)
w_qr = np.linalg.solve(R, Q.T @ yc)
e_qr = float(np.linalg.norm(w_qr - w_true))
print(" %s %22.4e %20.4e %14.2f"
% (pw("%.0e" % c, 16), e_ne, e_qr, e_ne / max(e_qr, 1e-300)))
print(" 조건수가 커질수록 정규방정식이 QR 보다 훨씬 나빠집니다")
print(" 같은 답을 구하는데 계산 경로가 다르면 정확도가 다릅니다")
print(" 세 가지 푸는 법을 정리합니다")
print(" %s %s %s %s"
% (pw("방법", 20), rw("계산량", 16), rw("정확도", 14), rw("언제", 22)))
for a, b, c, d in [("정규방정식", "n p 제곱 의 절반", "나쁨", "조건수가 좋을 때만"),
("QR 분해", "2 n p 제곱", "좋음", "표준"),
("특이값 분해", "더 비쌈", "가장 좋음", "계수가 모자랄 때"),
("반복법", "곱셈 여러 번", "설정에 딸림", "아주 클 때")]:
print(" %s %s %s %s" % (pw(a, 20), rw(b, 16), rw(c, 14), rw(d, 22)))
print(" 실무 라이브러리는 기본으로 둘째나 셋째를 씁니다")
# --- 문제 3: 계수가 모자랄 때 ------------------------------------------
print(" 변수가 표본보다 많으면 해가 무한히 많습니다")
n3, p3 = 20, 50
X3 = rng.normal(0, 1, (n3, p3))
w3 = np.zeros(p3)
w3[:5] = np.array([2.0, -1.0, 1.5, 0.5, -2.0])
y3 = X3 @ w3
print(" 표본 20 에 변수 50 입니다. 잡음은 없습니다")
w_pinv = np.linalg.pinv(X3) @ y3
null_dir = np.linalg.svd(X3)[2][n3:]
w_other = w_pinv + 3.0 * null_dir[0]
print(" %s %s %s %s"
% (pw("어떤 해", 24), rw("잔차 제곱합", 18), rw("계수의 크기", 18),
rw("판정", 14)))
for nm, w in [("최소 노름 해", w_pinv), ("영공간을 더한 해", w_other),
("참 계수", w3)]:
r = float(np.sum((y3 - X3 @ w) ** 2))
print(" %s %18.4e %18.6f %s"
% (pw(nm, 24), r, float(np.linalg.norm(w)),
rw("맞음" if r < 1e-18 else "안 맞음", 14)))
print(" 셋 다 잔차가 0 입니다. 자료만으로는 고를 수 없습니다")
print(" 최소 노름 해가 가장 작습니다. 특이값 분해가 그것을 줍니다")
print(" 참 계수보다도 작습니다. 작다고 참인 것은 아닙니다")
print(" 릿지가 그 자리에서 무엇을 하는지 봅니다")
print(" %s %s %s %s"
% (pw("lambda", 14), rw("계수의 크기", 16), rw("참 계수와의 거리", 20),
rw("잔차 제곱합", 16)))
for lam in [0.0, 1e-6, 0.01, 1.0]:
if lam == 0.0:
w = w_pinv
else:
w = np.linalg.solve(X3.T @ X3 + lam * np.eye(p3), X3.T @ y3)
print(" %s %16.6f %20.6f %16.6f"
% (pw("%.0e" % lam if lam else "0", 14),
float(np.linalg.norm(w)), float(np.linalg.norm(w - w3)),
float(np.sum((y3 - X3 @ w) ** 2))))
print(" lambda 를 0 으로 보내면 최소 노름 해로 갑니다")
print(" lambda 를 키우면 잔차가 늘고 계수가 줄어듭니다")
print(" 잡음이 없어도 참 계수를 못 찾습니다. 정보가 모자라기 때문입니다")
print(" 정보가 있는 방향이 20 개뿐입니다")
sv3 = np.linalg.svd(X3, compute_uv=False)
print(" %s %s %s"
% (pw("몇 번째 특이값", 18), rw("값", 16), rw("가장 큰 것 대비", 20)))
for i in [0, 4, 9, 14, 19]:
print(" %s %16.6f %20.6f"
% (pw("%d" % (i + 1), 18), sv3[i], sv3[i] / sv3[0]))
print(" 20 개뿐입니다. 50 차원인데 20 방향만 정보가 있습니다")
print(" 나머지 30 방향은 자료가 아무 말도 안 합니다")
print(" 213강의 차원의 저주가 여기서 계수의 부족으로 나타납니다")
# --- 문제 4: 정사영으로 읽는 여러 사실 ----------------------------------
print(" 회귀의 여러 사실이 정사영 하나에서 나옵니다")
print(" %s %s"
% (pw("무엇", 26), rw("정사영으로 읽으면", 32)))
for a, b in [("잔차와 x 의 상관이 0", "잔차가 열공간에 수직"),
("결정계수", "예측의 길이 제곱 나누기 전체"),
("자유도 n 빼기 p", "잔차가 사는 공간의 차원"),
("레버리지", "사영행렬의 대각 원소"),
("변수 추가로 R 제곱 안 줄어듦", "공간이 커지면 사영이 가까워짐")]:
print(" %s %s" % (pw(a, 26), rw(b, 32)))
print(" 184강과 189강에서 따로 배운 것들이 하나로 묶입니다")
print(" 결정계수와 사영의 길이를 견줍니다")
n4 = 300
X4 = np.concatenate([np.ones((n4, 1)), rng.normal(0, 1, (n4, 3))], axis=1)
y4 = X4 @ np.array([1.0, 2.0, -1.0, 0.5]) + rng.normal(0, 1.5, n4)
w4 = np.linalg.solve(X4.T @ X4, X4.T @ y4)
yhat = X4 @ w4
yc = y4 - y4.mean()
hc = yhat - yhat.mean()
r2 = 1.0 - float(np.sum((y4 - yhat) ** 2)) / float(np.sum(yc ** 2))
print(" %s %s %s"
% (pw("무엇", 30), rw("값", 18), rw("차이", 16)))
for nm, a, b in [("결정계수", r2, float(np.sum(hc ** 2)) / float(np.sum(yc ** 2))),
("y 와 예측의 상관 제곱", r2,
float(np.corrcoef(y4, yhat)[0, 1]) ** 2)]:
print(" %s %18.10f %16.4e" % (pw(nm, 30), a, abs(a - b)))
print(" 결정계수가 중심화한 예측의 길이 제곱 비와 같습니다")
print(" y 와 예측의 상관 제곱과도 같습니다. 셋이 같은 값입니다")
print(" 레버리지가 사영행렬의 대각인지 확인합니다")
H4 = X4 @ np.linalg.solve(X4.T @ X4, X4.T)
lev = np.diag(H4)
print(" %s %s %s"
% (pw("무엇", 26), rw("값", 18), rw("이론값", 16)))
for nm, v, t in [("레버리지의 합", float(lev.sum()), float(X4.shape[1])),
("레버리지의 평균", float(lev.mean()),
float(X4.shape[1]) / n4),
("레버리지의 최댓값", float(lev.max()), float("nan")),
("레버리지의 최솟값", float(lev.min()), float("nan"))]:
print(" %s %18.8f %s"
% (pw(nm, 26), v,
rw("%.8f" % t if not np.isnan(t) else "없음", 16)))
print(" 합이 변수 개수와 같고 평균이 p 나누기 n 입니다")
print(" 184강 문제 4 의 레버리지가 사영행렬의 대각이었습니다")
print(" 변수를 더하면 R 제곱이 왜 안 줄어드는지 봅니다")
print(" %s %s %s %s"
% (pw("변수 개수", 12), rw("결정계수", 16), rw("수정 결정계수", 18),
rw("추가한 변수", 16)))
Xg = np.ones((n4, 1))
base_r2 = None
for k, nm in [(0, "없음"), (3, "참 변수 셋"), (10, "잡음 일곱 더"),
(40, "잡음 서른 더"), (100, "잡음 예순 더")]:
if k == 0:
Xk = np.ones((n4, 1))
else:
extra = rng.normal(0, 1, (n4, k - 3)) if k > 3 else np.zeros((n4, 0))
Xk = np.concatenate([X4, extra], axis=1)
w = np.linalg.lstsq(Xk, y4, rcond=None)[0]
sse = float(np.sum((y4 - Xk @ w) ** 2))
sst = float(np.sum(yc ** 2))
r2k = 1.0 - sse / sst
pk = Xk.shape[1]
adj = 1.0 - (sse / sst) * (n4 - 1) / (n4 - pk)
print(" %s %16.6f %18.6f %s"
% (pw("%d" % pk, 12), r2k, adj, rw(nm, 16)))
print(" 변수를 더하면 결정계수가 절대 안 줄어듭니다. 공간이 커지기 때문입니다")
print(" 잡음만 더해도 오릅니다. 수정 결정계수는 벌점 때문에 내려갑니다")
print(" 189강 문제 1 의 이야기가 정사영으로 설명됩니다")
# --- 문제 5: 실무의 선형회귀 ---------------------------------------------
print(" 실무에서 선형회귀를 쓸 때 확인할 것을 정리합니다")
print(" %s %s"
% (pw("무엇", 26), rw("왜", 30)))
for a, b in [("절편을 넣었는가", "안 넣으면 원점을 지나야 함"),
("변수의 눈금", "정규화와 조건수에 영향"),
("조건수", "계수를 못 믿는 자리"),
("표본 대 변수 비", "계수가 모자랄 수 있음"),
("잔차 진단", "184강의 다섯 가지")]:
print(" %s %s" % (pw(a, 26), rw(b, 30)))
print(" 둘째 줄이 자주 빠집니다. 눈금이 다르면 정규화가 불공평해집니다")
print(" 눈금이 조건수와 정규화에 어떻게 영향을 주는지 봅니다")
n5 = 400
z = rng.normal(0, 1, (n5, 3))
X5 = np.stack([z[:, 0], z[:, 1] * 1000.0, z[:, 2] * 0.001], axis=1)
y5 = X5 @ np.array([1.0, 0.002, 2000.0]) + rng.normal(0, 1.0, n5)
Xs = (X5 - X5.mean(axis=0)) / X5.std(axis=0)
print(" 세 변수의 눈금이 백만 배까지 차이 납니다")
print(" %s %s %s"
% (pw("무엇", 24), rw("조건수", 20), rw("판정", 16)))
for nm, M in [("원자료", X5), ("표준화한 뒤", Xs)]:
k = float(np.linalg.cond(M))
print(" %s %20.4e %s"
% (pw(nm, 24), k, rw("나쁨" if k > 1e3 else "좋음", 16)))
print(" 표준화만 해도 조건수가 크게 좋아집니다")
print(" %s %s %s %s"
% (pw("정규화 대상", 24), rw("첫째 계수 축소율", 20),
rw("둘째 계수 축소율", 20), rw("셋째 계수 축소율", 20)))
lam = 10.0
for nm, M in [("원자료에 릿지", X5), ("표준화 뒤 릿지", Xs)]:
w_ols = np.linalg.lstsq(M, y5, rcond=None)[0]
w_r = np.linalg.solve(M.T @ M + lam * np.eye(3), M.T @ y5)
ratio = np.abs(w_r) / np.maximum(np.abs(w_ols), 1e-30)
print(" %s %20.6f %20.6f %20.6f"
% (pw(nm, 24), ratio[0], ratio[1], ratio[2]))
print(" 원자료에 릿지를 걸면 눈금이 가장 작은 셋째 계수만 0.000043 으로 뭉갭니다")
print(" 둘째 계수는 1.002082 로 오히려 조금 늘었습니다. 벌점이 사실상 안 걸립니다")
print(" 표준화한 뒤에 걸면 셋이 비슷하게 줄어듭니다")
print(" 정규화 전에 표준화하는 것이 관례인 이유입니다")
print(" 절편을 정규화하면 안 되는 이유를 봅니다")
n6 = 300
x6 = rng.normal(5.0, 1.0, (n6, 2))
y6 = 100.0 + x6 @ np.array([2.0, -1.0]) + rng.normal(0, 1.0, n6)
A6 = np.concatenate([np.ones((n6, 1)), x6], axis=1)
print(" y 의 평균이 100 근처인 자료입니다")
print(" %s %s %s %s"
% (pw("무엇을 정규화", 26), rw("절편", 14), rw("예측 평균", 16),
rw("y 의 평균", 16)))
for nm, pen_intercept in [("절편까지", True), ("계수만", False)]:
P = np.eye(3) * 50.0
if not pen_intercept:
P[0, 0] = 0.0
w = np.linalg.solve(A6.T @ A6 + P, A6.T @ y6)
print(" %s %14.6f %16.6f %16.6f"
% (pw(nm, 26), w[0], float(np.mean(A6 @ w)), float(y6.mean())))
print(" 절편까지 벌주면 예측 평균이 y 의 평균에서 크게 벗어납니다")
print(" 절편은 눈금에 딸린 값이라 0 으로 당길 이유가 없습니다")
print(" 그래서 정규화는 언제나 절편을 뺀 계수에만 겁니다")
print(" 207강은 선형회귀를 풀었습니다. 208강은 로지스틱을 반복으로 풉니다")
# 206강에서 정규 가정이 제곱오차를 낳는다고 했습니다. 이제 풉니다
# 기울기를 0 으로 두면 정규방정식이 나옵니다
# X 전치 X w = X 전치 y 입니다
# 무엇을 확인 값 이론값
# 잔차와 각 열의 내적 최대 0.0000000000 0.0000
# 잔차와 예측의 내적 0.0000000000 0.0000
# 잔차 제곱합 나누기 n 1.0077634032 1.0000
# 잔차가 X 의 모든 열과 직교합니다. 그것이 정규방정식의 뜻입니다
# 예측값은 X 의 열공간 위에 있고 잔차는 그 공간에 수직입니다
# 80강의 정사영이 그대로 나온 것입니다
# 사영행렬의 성질을 확인합니다
# 무엇 값 이론값
# H 를 두 번 곱한 것과의 차 0.0000000000 0.0000
# H 와 전치의 차 0.0000000000 0.0000
# H 의 대각합 4.0000000000 4.0000
# 고유값의 최댓값 1.0000000000 1.0000
# 고유값의 최솟값 -0.0000000000 0.0000
# 제곱해도 그대로이고 대칭입니다. 사영행렬의 정의입니다
# 대각합이 변수 개수와 같습니다. 그것이 자유도입니다
# 고유값이 0 아니면 1 입니다. 열공간 안이면 1 밖이면 0 입니다
# 자유도가 왜 n 빼기 p 인지 봅니다
# 표본 변수 잔차 제곱합의 평균 n 빼기 p 로 나눈 값
# 10 4 0.604312 1.007187
# 20 4 0.794677 0.993346
# 100 4 0.959415 0.999390
# 1000 4 0.995074 0.999070
# n 으로 나누면 참값 1 보다 작습니다. p 개의 방향을 이미 썼기 때문입니다
# n 빼기 p 로 나누면 참값에 붙습니다. 163강 문제 2 와 같은 이유입니다
# 정규방정식을 그대로 푸는 것은 나쁜 생각입니다
# X 전치 X 를 만들면 조건수가 제곱이 됩니다
# 만들려는 조건수 X 의 조건수 X 전치 X 의 조건수 X 의 조건수 제곱
# 1e+01 1.0000e+01 1.0000e+02 1.0000e+02
# 1e+03 1.0000e+03 1.0000e+06 1.0000e+06
# 1e+05 1.0000e+05 1.0000e+10 1.0000e+10
# 1e+07 1.0000e+07 1.0082e+14 1.0000e+14
# 조건수가 제곱이 됩니다. 92강 문제 3 의 내용입니다
# 배정도 부동소수점은 대략 16 자리를 담습니다
# 조건수가 1e8 을 넘으면 정규방정식으로는 자릿수를 절반 넘게 잃습니다
# 실제로 얼마나 잃는지 봅니다
# X 의 조건수 정규방정식 오차 QR 오차 몇 배
# 1e+02 8.1276e-13 3.9464e-15 205.95
# 1e+05 1.0620e-07 7.2562e-13 146355.61
# 1e+08 1.4120e-01 3.9244e-09 35980280.99
# 1e+10 3.0065e+01 7.6845e-07 39124117.56
# 조건수가 커질수록 정규방정식이 QR 보다 훨씬 나빠집니다
# 같은 답을 구하는데 계산 경로가 다르면 정확도가 다릅니다
# 세 가지 푸는 법을 정리합니다
# 방법 계산량 정확도 언제
# 정규방정식 n p 제곱 의 절반 나쁨 조건수가 좋을 때만
# QR 분해 2 n p 제곱 좋음 표준
# 특이값 분해 더 비쌈 가장 좋음 계수가 모자랄 때
# 반복법 곱셈 여러 번 설정에 딸림 아주 클 때
# 실무 라이브러리는 기본으로 둘째나 셋째를 씁니다
# 변수가 표본보다 많으면 해가 무한히 많습니다
# 표본 20 에 변수 50 입니다. 잡음은 없습니다
# 어떤 해 잔차 제곱합 계수의 크기 판정
# 최소 노름 해 2.3678e-28 1.616659 맞음
# 영공간을 더한 해 2.9288e-28 3.407871 맞음
# 참 계수 0.0000e+00 3.391165 맞음
# 셋 다 잔차가 0 입니다. 자료만으로는 고를 수 없습니다
# 최소 노름 해가 가장 작습니다. 특이값 분해가 그것을 줍니다
# 참 계수보다도 작습니다. 작다고 참인 것은 아닙니다
# 릿지가 그 자리에서 무엇을 하는지 봅니다
# lambda 계수의 크기 참 계수와의 거리 잔차 제곱합
# 0 1.616659 2.981009 0.000000
# 1e-06 1.616659 2.981009 0.000000
# 1e-02 1.616071 2.981009 0.000010
# 1e+00 1.562077 2.981896 0.084105
# lambda 를 0 으로 보내면 최소 노름 해로 갑니다
# lambda 를 키우면 잔차가 늘고 계수가 줄어듭니다
# 잡음이 없어도 참 계수를 못 찾습니다. 정보가 모자라기 때문입니다
# 정보가 있는 방향이 20 개뿐입니다
# 몇 번째 특이값 값 가장 큰 것 대비
# 1 11.181927 1.000000
# 5 8.744419 0.782014
# 10 6.928959 0.619657
# 15 5.093237 0.455488
# 20 2.680846 0.239748
# 20 개뿐입니다. 50 차원인데 20 방향만 정보가 있습니다
# 나머지 30 방향은 자료가 아무 말도 안 합니다
# 213강의 차원의 저주가 여기서 계수의 부족으로 나타납니다
# 회귀의 여러 사실이 정사영 하나에서 나옵니다
# 무엇 정사영으로 읽으면
# 잔차와 x 의 상관이 0 잔차가 열공간에 수직
# 결정계수 예측의 길이 제곱 나누기 전체
# 자유도 n 빼기 p 잔차가 사는 공간의 차원
# 레버리지 사영행렬의 대각 원소
# 변수 추가로 R 제곱 안 줄어듦 공간이 커지면 사영이 가까워짐
# 184강과 189강에서 따로 배운 것들이 하나로 묶입니다
# 결정계수와 사영의 길이를 견줍니다
# 무엇 값 차이
# 결정계수 0.6791805902 1.1102e-16
# y 와 예측의 상관 제곱 0.6791805902 3.3307e-16
# 결정계수가 중심화한 예측의 길이 제곱 비와 같습니다
# y 와 예측의 상관 제곱과도 같습니다. 셋이 같은 값입니다
# 레버리지가 사영행렬의 대각인지 확인합니다
# 무엇 값 이론값
# 레버리지의 합 4.00000000 4.00000000
# 레버리지의 평균 0.01333333 0.01333333
# 레버리지의 최댓값 0.04942515 없음
# 레버리지의 최솟값 0.00355652 없음
# 합이 변수 개수와 같고 평균이 p 나누기 n 입니다
# 184강 문제 4 의 레버리지가 사영행렬의 대각이었습니다
# 변수를 더하면 R 제곱이 왜 안 줄어드는지 봅니다
# 변수 개수 결정계수 수정 결정계수 추가한 변수
# 1 0.000000 0.000000 없음
# 4 0.679181 0.675929 참 변수 셋
# 11 0.686005 0.675140 잡음 일곱 더
# 41 0.724085 0.681473 잡음 서른 더
# 101 0.773784 0.660108 잡음 예순 더
# 변수를 더하면 결정계수가 절대 안 줄어듭니다. 공간이 커지기 때문입니다
# 잡음만 더해도 오릅니다. 수정 결정계수는 벌점 때문에 내려갑니다
# 189강 문제 1 의 이야기가 정사영으로 설명됩니다
# 실무에서 선형회귀를 쓸 때 확인할 것을 정리합니다
# 무엇 왜
# 절편을 넣었는가 안 넣으면 원점을 지나야 함
# 변수의 눈금 정규화와 조건수에 영향
# 조건수 계수를 못 믿는 자리
# 표본 대 변수 비 계수가 모자랄 수 있음
# 잔차 진단 184강의 다섯 가지
# 둘째 줄이 자주 빠집니다. 눈금이 다르면 정규화가 불공평해집니다
# 눈금이 조건수와 정규화에 어떻게 영향을 주는지 봅니다
# 세 변수의 눈금이 백만 배까지 차이 납니다
# 무엇 조건수 판정
# 원자료 9.5450e+05 나쁨
# 표준화한 뒤 1.0580e+00 좋음
# 표준화만 해도 조건수가 크게 좋아집니다
# 정규화 대상 첫째 계수 축소율 둘째 계수 축소율 셋째 계수 축소율
# 원자료에 릿지 0.957522 1.002082 0.000043
# 표준화 뒤 릿지 0.972387 0.974883 0.975500
# 원자료에 릿지를 걸면 눈금이 가장 작은 셋째 계수만 0.000043 으로 뭉갭니다
# 둘째 계수는 1.002082 로 오히려 조금 늘었습니다. 벌점이 사실상 안 걸립니다
# 표준화한 뒤에 걸면 셋이 비슷하게 줄어듭니다
# 정규화 전에 표준화하는 것이 관례인 이유입니다
# 절편을 정규화하면 안 되는 이유를 봅니다
# y 의 평균이 100 근처인 자료입니다
# 무엇을 정규화 절편 예측 평균 y 의 평균
# 절편까지 11.794079 103.096780 105.062460
# 계수만 100.438630 105.062460 105.062460
# 절편까지 벌주면 예측 평균이 y 의 평균에서 크게 벗어납니다
# 절편은 눈금에 딸린 값이라 0 으로 당길 이유가 없습니다
# 그래서 정규화는 언제나 절편을 뺀 계수에만 겁니다
# 207강은 선형회귀를 풀었습니다. 208강은 로지스틱을 반복으로 풉니다