Задача 1

(a)

Best subset ќе има најниско RSS на тренирачкото множество бидејќи со тоа ќе ги испробаме сите можни кобинации од k предиктори. Комбинациите добиени со другите два метода сигурно ќе бидат испробани и од best subset методот.

(b)

Не можеме да знаеме кој модел има најниско RSS на тестирачкото множество, бидејќи изборот на модел за k предиктори со кој било од овие методи се прави исклучиво земајќи предвид RSS на тренирачкото множество.

(c)

  1. Точно, бидејќи forward stepwise ги зема предикторите од \(\mathcal{M}_k\) и избира еден од преостанатите \(p-k\) предиктори за да го добие \(\mathcal{M}_{k+1}\).

  2. Точно, бидејќи backward stepwise ги зема предикторите од \(\mathcal{M}_{k+1}\) и избира еден од тие \(k+1\) предиктори кој треба да се отфрли за да го добие \(\mathcal{M}_k\).

  3. Грешно, бидејќи двата метода комплетно независно еден од друг стигаат до резултатот и може да се многу различни.

  4. Грешно, бидејќи двата метода комплетно независно еден од друг стигаат до резултатот и може да се многу различни.

  5. Грешно, бидејќи изборот на \(k\) и \(k+1\) предиктори во best subset се комплетно независни еден од друг и може да се многу различни.

Задача 2

(a) (b)

И со Lasso, и со Ridge, добиваме помалку флексибилен модел. Разликата е во тоа како се ограничени овие модели. Во двата случаи, моделот добива повисок bias, а му се намалува variance. Затоа, кога покачувањето на bias ќе биде пониско од намалувањето на variance, ќе добиеме подобра точност. Точниот одговор е под (iii).

(c)

Не линеарните методи се пофлексибилни и ја зголемуваат варијансата на моделот. Кога повишувањето на варијансата е пониско од паѓањето на bias, добиваме подобра точност. Точниот одговор е под (ii).

Задача 3

(a)

RSS на тренирачкото множество постепено ќе опаѓа, бидејќи моделот постепено ќе станува пофлексибилен. Точниот одговор е под (iv).

(b)

На почеток, RSS тестирачкото множество ќе опаѓа, бидејќи моделот ќе го намалува bias-от. Во одреден момент, моделот ќе стане премногу фелксибилен, и варијансата ќе расте повеќе од што се намалува bias-от, па RSS ќе почне да расте. Ќе се добие U форма. Точниот одговор е под (ii).

(c)

Како што расте s, варијансата постепено ќе се зголемува. Точниот одговор е под (iii).

(d)

Како што расте s, bias-от постепено ќе се намалува. Точниот одговор е под (iv).

(e)

Оваа грешка ќе е константна. Точниот одговор е под (v).

Задача 4

(a)

Како што ја зголемуваме ламбдата, се зголемува степенот на регуларизација, а со тоа се намалува флексибилноста (варијансата) на моделот. Следствено на тоа, RSS на тренирачкото множество постепено ќе расте. Точниот одговор е под (iii).

(b)

Очекувано е намалувањето на варијансата на почеток да го подобри моделот на тестирачкото множество (да го намали RSS), бидејќи ќе се намали over-fitting-от. После некоја вредност, RSS повторно ќе почне да расте, бидејќи намалувањето на варијансата ќе биде помало од наголемувањето на bias-от. Ќе се добие U форма. Точниот одговор е под (ii).

(c)

Варијансата постепено ќе опаѓа. Точниот одговор е под (iv).

(d)

Bias-от постепено ќе расте. Точниот одговор е под (iii).

(e)

Оваа грешка ќе е константна. Точниот одговор е под (v).

Задача 5

\[ \sum_{i=1}^{2}y_i=0\implies|y_1|=|y_2|\implies y_1^2=y_2^2=y^2\\ \sum_{i=1}^{2}x_{ij}=0\implies|x_{1j}|=|x_{2j}|\implies x_{1j}^2=x_{2j}^2=x_j^2\\ x_{i1}=x_{i2}=x_i\implies|x_{1}|=|x_{2}|\implies x_{1}^2=x_{2}^2=x^2\implies x_1+x_2=0\\ RSS= \sum_{i=1}^{2}(y_i-x_i\sum_{j=1}^{2}\hat\beta_j)^2=\\ \sum_{i=1}^{2}(y^2-2y_ix_i\sum_{j=1}^{2}\hat\beta_j+x^2\sum_{j=1}^{2}\sum_{t=1}^{2}\hat\beta_j\hat\beta_t)=\\ 2y^2-2(\hat\beta_1+\hat\beta_2)(y_1x_1+y_2x_2)+2x^2(\hat\beta_1+\hat\beta_2)^2\\ \]

(a) (b)

\[ RSS\_RIDGE=RSS+\lambda(\hat\beta_1^2+\hat\beta_2^2)=\\ 2y^2-2(\hat\beta_1+\hat\beta_2)(y_1x_1+y_2x_2)+2x^2(\hat\beta_1+\hat\beta_2)^2+\lambda(\hat\beta_1^2+\hat\beta_2^2)\\ \begin{cases} \frac{\partial RSS\_RIDGE}{\partial \hat\beta_1}=-2(y_1x_1+y_2x_2)+4x^2(\hat\beta_1+\hat\beta_2)+2\lambda\hat\beta_1=0\\ \frac{\partial RSS\_RIDGE}{\partial \hat\beta_2}=-2(y_1x_1+y_2x_2)+4x^2(\hat\beta_1+\hat\beta_2)+2\lambda\hat\beta_2=0 \end{cases}\implies\\ \hat\beta_1-\hat\beta_2=0\implies\\ \hat\beta_1=\hat\beta_2 \]

(c) (d)

Во двата случаи (\(sign(\hat\beta_1)=sign(\hat\beta_2)=1\) и \(sign(\hat\beta_1)=sign(\hat\beta_2)=-1\)) се добива систем на две идентични равенки, па има бесконечно многу решенија. Единствено е важно бетите да имаат ист знак.

\[ RSS\_LASSO=RSS+\lambda(|\hat\beta_1|+|\hat\beta_2|)=\\ 2y^2-2(\hat\beta_1+\hat\beta_2)(y_1x_1+y_2x_2)+2x^2(\hat\beta_1+\hat\beta_2)^2+\lambda(|\hat\beta_1|+|\hat\beta_2|)\\ \begin{cases} \frac{\partial RSS\_RIDGE}{\partial \hat\beta_1}=-2(y_1x_1+y_2x_2)+4x^2(\hat\beta_1+\hat\beta_2)+\lambda\frac{\hat\beta_1}{|\hat\beta_1|}=0\\ \frac{\partial RSS\_RIDGE}{\partial \hat\beta_2}=-2(y_1x_1+y_2x_2)+4x^2(\hat\beta_1+\hat\beta_2)+\lambda\frac{\hat\beta_2}{|\hat\beta_2|}=0 \end{cases}\implies\\ \frac{\hat\beta_1}{|\hat\beta_1|}-\frac{\hat\beta_2}{|\hat\beta_2|}=0\implies\\ sign(\hat\beta_1)=sign(\hat\beta_2) \]

Задача 6

Во двата случаи ја плотираме со црвено вертикалната линија што минува низ бетата која го дава минимумот според (6.13). Гледаме дека таа се сече со параболата во нејзиниот минимум.

(a)

y = 3
lambda = 1
beta = (-10000:10000) / 100
rss_ridge = (y - beta) ^ 2 + lambda * beta ^ 2
beta_best = y / (1 + lambda)
plot(beta, rss_ridge, type="l", col="green")
abline(v=beta_best, col="red")

(b)

y = 3
lambda = 1
beta = (-10000:10000) / 100
rss_ridge = (y - beta) ^ 2 + lambda * abs(beta)
beta_best = y - lambda / 2
plot(beta, rss_ridge, type="l", col="green")
abline(v=beta_best, col="red")

Задача 7

(a)

\[ Y_i=\beta_0+\sum_{j=1}^{p}\beta_iX_{ij}+err_i \implies err_i=Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij}\\ f(Y|X,\beta)=\prod_{i=1}^np(Y_i|X_i,\beta)=\prod_{i=1}^{n}p(err_i|Y_i,X_i,\beta)=\prod_{i=1}^n\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}(\frac{err_i-0}{\sigma})^2}=\\ \prod_{i=1}^n\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}(\frac{Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij}}{\sigma})^2}=\\ (\frac{1}{\sigma\sqrt{2\pi}})^ne^{-\frac{1}{2\sigma^2}\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2} \]

(b)

\[ p(\beta)=\frac{1}{2b}e^{\frac{-|\beta|}{b}}\\ p(\beta|X,Y)\propto f(Y|X,\beta)p(\beta)=(\frac{1}{\sigma\sqrt{2\pi}})^ne^{-\frac{1}{2\sigma^2}\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2}\frac{1}{2b}e^{\frac{-|\beta|}{b}}=\\ =(\frac{1}{\sigma\sqrt{2\pi}})^n\frac{1}{2b}e^{-\frac{1}{2\sigma^2}\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2-\frac{|\beta|}{b}} \]

(c)

Ова е исто како lasso со \(\lambda=\frac{2\sigma^2}{b}\).

\[ log(f(Y|X,\beta)p(\beta))=log((\frac{1}{\sigma\sqrt{2\pi}})^n\frac{1}{2b})-\frac{1}{2\sigma^2}\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2-\frac{|\beta|}{b}\\ \underset{\beta}{\arg\max}[log(f(Y|X,\beta)p(\beta))]=\underset{\beta}{\arg\min}[\frac{1}{2\sigma^2}\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2+\frac{1}{b}\sum_{j=1}^{p}|\beta_j|]=\\ \underset{\beta}{\arg\min}[\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2+\frac{2\sigma^2}{b}\sum_{j=1}^{p}|\beta_j|]=\\ \underset{\beta}{\arg\min}[RSS+\frac{2\sigma^2}{b}\sum_{j=1}^{p}|\beta_j|] \]

(d)

\[ p(\beta)=\frac{1}{c\sqrt{2\pi}}e^{-\frac{\beta^2}{2c}}\\ p(\beta|X,Y)\propto f(Y|X,\beta)p(\beta)=(\frac{1}{\sigma\sqrt{2\pi}})^ne^{-\frac{1}{2\sigma^2}\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2}\frac{1}{\sqrt{2c\pi}}e^{-\frac{\beta^2}{2c}}=\\ =(\frac{1}{\sigma\sqrt{2\pi}})^n\frac{1}{\sqrt{2c\pi}}e^{-\frac{1}{2\sigma^2}\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2-\frac{\beta^2}{2c}} \]

(e)

Ова е исто како ridge со \(\lambda=\frac{\sigma^2}{c}\).

\[ log(f(Y|X,\beta)p(\beta))=log((\frac{1}{\sigma\sqrt{2\pi}})^n\frac{1}{\sqrt{2c\pi}})-\frac{1}{2\sigma^2}\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2-\frac{\beta^2}{2c}\\ \underset{\beta}{\arg\max}[log(f(Y|X,\beta)p(\beta))]=\underset{\beta}{\arg\min}[\frac{1}{2\sigma^2}\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2+\frac{1}{2c}\sum_{j=1}^{p}\beta_j^2]=\\ \underset{\beta}{\arg\min}[\sum_{i=1}^n(Y_i-\beta_0-\sum_{j=1}^{p}\beta_iX_{ij})^2+\frac{\sigma^2}{c^2}\sum_{j=1}^{p}\beta_j^2]=\\ \underset{\beta}{\arg\min}[RSS+\frac{\sigma^2}{c}\sum_{j=1}^{p}\beta_j^2] \]

Задача 8

(a) (b)

set.seed(1337)
x = rnorm(100)
e = rnorm(100)
beta = c(3, 2, 4, 1)
y = beta[1] + beta[2] * x + beta[3] * x ^ 2 + beta[4] * x ^ 3 + e
plot(x, y)

(c) (d)

library(leaps)

data = data.frame(x, x^2, x^3, x^4, x^5, x^6, x^7, x^8, x^9, x^10, y)
data

print_plot_best <- function(list, name, max=TRUE) {
  print(name)
  print(list)
  if (max) {
    best = which.max(list)
  } else {
    best = which.min(list)
  }
  print(paste("Best:", best))
  plot(list, type="l", ylab=name)
  points(best, list[best], col="red", pch=19)
}

get_best <- function(method) {
  best_subset = regsubsets(y ∼ ., data, nvmax=10, method=method)
  print(summary(best_subset))
  print_plot_best(summary(best_subset)$rsq, paste("R2", method))
  print_plot_best(summary(best_subset)$adjr2, paste("Adj. R2", method))
  print_plot_best(summary(best_subset)$cp, paste("Cp", method), max=FALSE)
  print_plot_best(summary(best_subset)$bic, paste("BIC", method), max=FALSE)
}

get_best("exhaustive")
Subset selection object
Call: get_best("exhaustive")
10 Variables  (and intercept)
     Forced in Forced out
x        FALSE      FALSE
x.2      FALSE      FALSE
x.3      FALSE      FALSE
x.4      FALSE      FALSE
x.5      FALSE      FALSE
x.6      FALSE      FALSE
x.7      FALSE      FALSE
x.8      FALSE      FALSE
x.9      FALSE      FALSE
x.10     FALSE      FALSE
1 subsets of each size up to 10
Selection Algorithm: exhaustive
          x   x.2 x.3 x.4 x.5 x.6 x.7 x.8 x.9 x.10
1  ( 1 )  " " " " "*" " " " " " " " " " " " " " " 
2  ( 1 )  " " "*" "*" " " " " " " " " " " " " " " 
3  ( 1 )  "*" "*" "*" " " " " " " " " " " " " " " 
4  ( 1 )  "*" "*" "*" "*" " " " " " " " " " " " " 
5  ( 1 )  "*" "*" "*" " " "*" " " "*" " " " " " " 
6  ( 1 )  "*" "*" "*" "*" " " "*" "*" " " " " " " 
7  ( 1 )  "*" "*" "*" "*" "*" " " "*" "*" " " " " 
8  ( 1 )  "*" "*" "*" "*" " " "*" " " "*" "*" "*" 
9  ( 1 )  "*" "*" "*" "*" "*" "*" "*" "*" "*" " " 
10  ( 1 ) "*" "*" "*" "*" "*" "*" "*" "*" "*" "*" 
[1] "R2 exhaustive"
 [1] 0.8381714 0.9810520 0.9930514 0.9932037 0.9932949 0.9935209 0.9935242
 [8] 0.9935423 0.9935445 0.9935446
[1] "Best: 10"
[1] "Adj. R2 exhaustive"
 [1] 0.8365201 0.9806613 0.9928343 0.9929176 0.9929383 0.9931029 0.9930315
 [8] 0.9929746 0.9928989 0.9928193
[1] "Best: 6"

[1] "Cp exhaustive"
 [1] 2135.132722  167.236272    3.799762    3.700135    4.443067    3.327344
 [7]    5.281478    7.032421    9.002628   11.000000
[1] "Best: 6"

[1] "BIC exhaustive"
 [1] -172.9114 -382.7902 -478.5015 -476.1124 -472.8579 -471.6812 -467.1274
 [8] -462.8016 -458.2299 -453.6277
[1] "Best: 3"

get_best("backward")
Subset selection object
Call: get_best("backward")
10 Variables  (and intercept)
     Forced in Forced out
x        FALSE      FALSE
x.2      FALSE      FALSE
x.3      FALSE      FALSE
x.4      FALSE      FALSE
x.5      FALSE      FALSE
x.6      FALSE      FALSE
x.7      FALSE      FALSE
x.8      FALSE      FALSE
x.9      FALSE      FALSE
x.10     FALSE      FALSE
1 subsets of each size up to 10
Selection Algorithm: backward
          x   x.2 x.3 x.4 x.5 x.6 x.7 x.8 x.9 x.10
1  ( 1 )  " " " " "*" " " " " " " " " " " " " " " 
2  ( 1 )  " " "*" "*" " " " " " " " " " " " " " " 
3  ( 1 )  "*" "*" "*" " " " " " " " " " " " " " " 
4  ( 1 )  "*" "*" "*" "*" " " " " " " " " " " " " 
5  ( 1 )  "*" "*" "*" "*" " " "*" " " " " " " " " 
6  ( 1 )  "*" "*" "*" "*" " " "*" "*" " " " " " " 
7  ( 1 )  "*" "*" "*" "*" " " "*" "*" " " "*" " " 
8  ( 1 )  "*" "*" "*" "*" "*" "*" "*" " " "*" " " 
9  ( 1 )  "*" "*" "*" "*" "*" "*" "*" "*" "*" " " 
10  ( 1 ) "*" "*" "*" "*" "*" "*" "*" "*" "*" "*" 
[1] "R2 backward"
 [1] 0.8381714 0.9810520 0.9930514 0.9932037 0.9932385 0.9935209 0.9935213
 [8] 0.9935323 0.9935445 0.9935446
[1] "Best: 10"
[1] "Adj. R2 backward"
 [1] 0.8365201 0.9806613 0.9928343 0.9929176 0.9928788 0.9931029 0.9930284
 [8] 0.9929638 0.9928989 0.9928193
[1] "Best: 6"

[1] "Cp backward"
 [1] 2135.132722  167.236272    3.799762    3.700135    5.221208    3.327344
 [7]    5.321841    7.169696    9.002628   11.000000
[1] "Best: 6"

[1] "BIC backward"
 [1] -172.9114 -382.7902 -478.5015 -476.1124 -472.0197 -471.6812 -467.0822
 [8] -462.6475 -458.2299 -453.6277
[1] "Best: 3"

get_best("forward")
Subset selection object
Call: get_best("forward")
10 Variables  (and intercept)
     Forced in Forced out
x        FALSE      FALSE
x.2      FALSE      FALSE
x.3      FALSE      FALSE
x.4      FALSE      FALSE
x.5      FALSE      FALSE
x.6      FALSE      FALSE
x.7      FALSE      FALSE
x.8      FALSE      FALSE
x.9      FALSE      FALSE
x.10     FALSE      FALSE
1 subsets of each size up to 10
Selection Algorithm: forward
          x   x.2 x.3 x.4 x.5 x.6 x.7 x.8 x.9 x.10
1  ( 1 )  " " " " "*" " " " " " " " " " " " " " " 
2  ( 1 )  " " "*" "*" " " " " " " " " " " " " " " 
3  ( 1 )  "*" "*" "*" " " " " " " " " " " " " " " 
4  ( 1 )  "*" "*" "*" "*" " " " " " " " " " " " " 
5  ( 1 )  "*" "*" "*" "*" " " "*" " " " " " " " " 
6  ( 1 )  "*" "*" "*" "*" " " "*" "*" " " " " " " 
7  ( 1 )  "*" "*" "*" "*" " " "*" "*" " " " " "*" 
8  ( 1 )  "*" "*" "*" "*" " " "*" "*" "*" " " "*" 
9  ( 1 )  "*" "*" "*" "*" "*" "*" "*" "*" " " "*" 
10  ( 1 ) "*" "*" "*" "*" "*" "*" "*" "*" "*" "*" 
[1] "R2 forward"
 [1] 0.8381714 0.9810520 0.9930514 0.9932037 0.9932385 0.9935209 0.9935215
 [8] 0.9935391 0.9935439 0.9935446
[1] "Best: 10"
[1] "Adj. R2 forward"
 [1] 0.8365201 0.9806613 0.9928343 0.9929176 0.9928788 0.9931029 0.9930286
 [8] 0.9929711 0.9928983 0.9928193
[1] "Best: 6"

[1] "Cp forward"
 [1] 2135.132722  167.236272    3.799762    3.700135    5.221208    3.327344
 [7]    5.319341    7.075975    9.010286   11.000000
[1] "Best: 6"

[1] "BIC forward"
 [1] -172.9114 -382.7902 -478.5015 -476.1124 -472.0197 -471.6812 -467.0850
 [8] -462.7527 -458.2213 -453.6277
[1] "Best: 3"

(e)

library(glmnet)
set.seed(1337)
x_data = data[, c(
  "x", "x.2", "x.3", "x.4", "x.5", "x.6", "x.7", "x.8", "x.9", "x.10"
)]
y_data = data[, c("y")]
cross_validated = cv.glmnet(as.matrix(x_data), y_data, alpha=1)
plot(cross_validated)

print(paste("Best lambda:", cross_validated$lambda.min))
[1] "Best lambda: 0.114250899104086"

Задача 9

(a)

library(ISLR)

set.seed(1337)
train = sample(c(TRUE, FALSE), nrow(College), rep=TRUE)
test = (!train)

(b)

MSE на тренирачкото множество е 962395.8, MSE на тестирачкото множество е 1317253.

lin_model = lm(Apps ~ ., data=College[train, ])
train_preds = predict(lin_model, College[train, ])
test_preds = predict(lin_model, College[test, ])
sum((College[train, ]$Apps - train_preds) ^ 2) / nrow(College[train, ])
[1] 962395.8
sum((College[test, ]$Apps - test_preds) ^ 2) / nrow(College[test, ])
[1] 1317253

(c)

Со ламбда 301.6011, тест MSE изнесува 2166183.

library(leaps)
library(glmnet)

set.seed(1337)

grid = 10 ^ seq(10, -2, length=100)
X = model.matrix(Apps ~ ., data=College[train, ])
cross_validated = cv.glmnet(X, College[train, c("Apps")], alpha=0)
plot(cross_validated)

cross_validated$lambda.min
[1] 301.6011
ridge_reg = glmnet(
  X, 
  College[train, c("Apps")], 
  alpha=0, 
  lambda=cross_validated$lambda.min
)
test_preds = predict(
  ridge_reg, 
  model.matrix(Apps ~ ., data=College[test, ])
)
sum((College[test, ]$Apps - test_preds) ^ 2) / nrow(College[test, ])
[1] 2166183

(d)

Со ламбда 1.466566, тест MSE изнесува 1320929. Нема нули коефициенти.

set.seed(1337)

X = model.matrix(Apps ~ ., data=College[train, ])
cross_validated = cv.glmnet(X, College[train, c("Apps")], alpha=1)
plot(cross_validated)

cross_validated$lambda.min
[1] 1.466566
ridge_reg = glmnet(
  X, 
  College[train, c("Apps")], 
  alpha=1, 
  lambda=cross_validated$lambda.min
)
test_preds = predict(
  ridge_reg, 
  model.matrix(Apps ~ ., data=College[test, ])
)
sum((College[test, ]$Apps - test_preds) ^ 2) / nrow(College[test, ])
[1] 1320929
predict(
  ridge_reg, 
  model.matrix(Apps ~ ., data=College[test, ]),
  type="coefficients"
)
19 x 1 sparse Matrix of class "dgCMatrix"
                       s0
(Intercept) -8.748677e+02
(Intercept)  .           
PrivateYes  -3.988067e+02
Accept       1.352464e+00
Enroll      -8.724207e-01
Top10perc    4.831166e+01
Top25perc   -1.492847e+01
F.Undergrad  1.651791e-01
P.Undergrad  4.791767e-02
Outstate    -3.975135e-02
Room.Board   1.516512e-01
Books        1.725220e-01
Personal    -4.353364e-03
PhD         -5.240238e+00
Terminal    -1.127289e+01
S.F.Ratio    2.638255e+01
perc.alumni -7.347307e+00
Expend       9.730295e-02
Grad.Rate    1.151520e+01

(e)

Користиме 17 компоненти. Тест MSE e 1317253.

library(pls)

set.seed(1337)
pcr_model = pcr(Apps ∼ ., data=College[train, ], scale=TRUE, validation="CV")
validationplot(pcr_model, val.type="MSEP")

test_preds = predict(pcr_model, College[test, ], ncomp=17)
sum((College[test, ]$Apps - test_preds) ^ 2) / nrow(College[test, ])
[1] 1317253

(f)

Користиме 17 компоненти. Тест MSE e 1317253.

set.seed(1337)
plsr_model = plsr(Apps ∼ ., data=College[train, ], scale=TRUE, validation="CV")
validationplot(plsr_model, val.type="MSEP")

test_preds = predict(pcr_model, College[test, ], ncomp=17)
sum((College[test, ]$Apps - test_preds) ^ 2) / nrow(College[test, ])
[1] 1317253

(g)

Нема некоја разлика во тест MSE, без разлика што користиме. Секогаш лошо се предвидуваат бројот на апликации.

LS0tDQp0aXRsZTogIkxpbmVhciBNb2RlbCBTZWxlY3Rpb24gYW5kIFJlZ3VsYXJpemF0aW9uIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyDQl9Cw0LTQsNGH0LAgMQ0KDQojIyMgKGEpDQoNCkJlc3Qgc3Vic2V0INGc0LUg0LjQvNCwINC90LDRmNC90LjRgdC60L4gUlNTINC90LAg0YLRgNC10L3QuNGA0LDRh9C60L7RgtC+INC80L3QvtC20LXRgdGC0LLQviDQsdC40LTQtdGY0ZzQuCDRgdC+INGC0L7QsCDRnNC1INCz0Lgg0LjRgdC/0YDQvtCx0LDQvNC1INGB0LjRgtC1INC80L7QttC90Lgg0LrQvtCx0LjQvdCw0YbQuNC4INC+0LQgayDQv9GA0LXQtNC40LrRgtC+0YDQuC4g0JrQvtC80LHQuNC90LDRhtC40LjRgtC1INC00L7QsdC40LXQvdC4INGB0L4g0LTRgNGD0LPQuNGC0LUg0LTQstCwINC80LXRgtC+0LTQsCDRgdC40LPRg9GA0L3QviDRnNC1INCx0LjQtNCw0YIg0LjRgdC/0YDQvtCx0LDQvdC4INC4INC+0LQgYmVzdCBzdWJzZXQg0LzQtdGC0L7QtNC+0YIuDQoNCiMjIyAoYikNCg0K0J3QtSDQvNC+0LbQtdC80LUg0LTQsCDQt9C90LDQtdC80LUg0LrQvtGYINC80L7QtNC10Lsg0LjQvNCwINC90LDRmNC90LjRgdC60L4gUlNTINC90LAg0YLQtdGB0YLQuNGA0LDRh9C60L7RgtC+INC80L3QvtC20LXRgdGC0LLQviwg0LHQuNC00LXRmNGc0Lgg0LjQt9Cx0L7RgNC+0YIg0L3QsCDQvNC+0LTQtdC7INC30LAgayDQv9GA0LXQtNC40LrRgtC+0YDQuCDRgdC+INC60L7RmCDQsdC40LvQviDQvtC0INC+0LLQuNC1INC80LXRgtC+0LTQuCDRgdC1INC/0YDQsNCy0Lgg0LjRgdC60LvRg9GH0LjQstC+INC30LXQvNCw0ZjRnNC4INC/0YDQtdC00LLQuNC0IFJTUyDQvdCwINGC0YDQtdC90LjRgNCw0YfQutC+0YLQviDQvNC90L7QttC10YHRgtCy0L4uDQoNCiMjIyAoYykNCg0KKGkpINCi0L7Rh9C90L4sINCx0LjQtNC10ZjRnNC4IGZvcndhcmQgc3RlcHdpc2Ug0LPQuCDQt9C10LzQsCDQv9GA0LXQtNC40LrRgtC+0YDQuNGC0LUg0L7QtCAkXG1hdGhjYWx7TX1fayQg0Lgg0LjQt9Cx0LjRgNCwINC10LTQtdC9INC+0LQg0L/RgNC10L7RgdGC0LDQvdCw0YLQuNGC0LUgJHAtayQg0L/RgNC10LTQuNC60YLQvtGA0Lgg0LfQsCDQtNCwINCz0L4g0LTQvtCx0LjQtSAkXG1hdGhjYWx7TX1fe2srMX0kLg0KDQooaWkpINCi0L7Rh9C90L4sINCx0LjQtNC10ZjRnNC4IGJhY2t3YXJkIHN0ZXB3aXNlINCz0Lgg0LfQtdC80LAg0L/RgNC10LTQuNC60YLQvtGA0LjRgtC1INC+0LQgJFxtYXRoY2Fse019X3trKzF9JCDQuCDQuNC30LHQuNGA0LAg0LXQtNC10L0g0L7QtCDRgtC40LUgJGsrMSQg0L/RgNC10LTQuNC60YLQvtGA0Lgg0LrQvtGYINGC0YDQtdCx0LAg0LTQsCDRgdC1INC+0YLRhNGA0LvQuCDQt9CwINC00LAg0LPQviDQtNC+0LHQuNC1ICRcbWF0aGNhbHtNfV9rJC4NCg0KKGlpaSkg0JPRgNC10YjQvdC+LCDQsdC40LTQtdGY0ZzQuCDQtNCy0LDRgtCwINC80LXRgtC+0LTQsCDQutC+0LzQv9C70LXRgtC90L4g0L3QtdC30LDQstC40YHQvdC+INC10LTQtdC9INC+0LQg0LTRgNGD0LMg0YHRgtC40LPQsNCw0YIg0LTQviDRgNC10LfRg9C70YLQsNGC0L7RgiDQuCDQvNC+0LbQtSDQtNCwINGB0LUg0LzQvdC+0LPRgyDRgNCw0LfQu9C40YfQvdC4Lg0KDQooaXYpINCT0YDQtdGI0L3Qviwg0LHQuNC00LXRmNGc0Lgg0LTQstCw0YLQsCDQvNC10YLQvtC00LAg0LrQvtC80L/Qu9C10YLQvdC+INC90LXQt9Cw0LLQuNGB0L3QviDQtdC00LXQvSDQvtC0INC00YDRg9CzINGB0YLQuNCz0LDQsNGCINC00L4g0YDQtdC30YPQu9GC0LDRgtC+0YIg0Lgg0LzQvtC20LUg0LTQsCDRgdC1INC80L3QvtCz0YMg0YDQsNC30LvQuNGH0L3QuC4NCg0KKHYpINCT0YDQtdGI0L3Qviwg0LHQuNC00LXRmNGc0Lgg0LjQt9Cx0L7RgNC+0YIg0L3QsCAkayQg0LggJGsrMSQg0L/RgNC10LTQuNC60YLQvtGA0Lgg0LLQviBiZXN0IHN1YnNldCDRgdC1INC60L7QvNC/0LvQtdGC0L3QviDQvdC10LfQsNCy0LjRgdC90Lgg0LXQtNC10L0g0L7QtCDQtNGA0YPQsyDQuCDQvNC+0LbQtSDQtNCwINGB0LUg0LzQvdC+0LPRgyDRgNCw0LfQu9C40YfQvdC4Lg0KDQojINCX0LDQtNCw0YfQsCAyDQoNCiMjIyAoYSkgKGIpDQoNCtCYINGB0L4gTGFzc28sINC4INGB0L4gUmlkZ2UsINC00L7QsdC40LLQsNC80LUg0L/QvtC80LDQu9C60YMg0YTQu9C10LrRgdC40LHQuNC70LXQvSDQvNC+0LTQtdC7LiDQoNCw0LfQu9C40LrQsNGC0LAg0LUg0LLQviDRgtC+0LAg0LrQsNC60L4g0YHQtSDQvtCz0YDQsNC90LjRh9C10L3QuCDQvtCy0LjQtSDQvNC+0LTQtdC70LguINCS0L4g0LTQstCw0YLQsCDRgdC70YPRh9Cw0LgsINC80L7QtNC10LvQvtGCINC00L7QsdC40LLQsCDQv9C+0LLQuNGB0L7QuiBiaWFzLCDQsCDQvNGDINGB0LUg0L3QsNC80LDQu9GD0LLQsCB2YXJpYW5jZS4g0JfQsNGC0L7QsCwg0LrQvtCz0LAg0L/QvtC60LDRh9GD0LLQsNGa0LXRgtC+INC90LAgYmlhcyDRnNC1INCx0LjQtNC1INC/0L7QvdC40YHQutC+INC+0LQg0L3QsNC80LDQu9GD0LLQsNGa0LXRgtC+INC90LAgdmFyaWFuY2UsINGc0LUg0LTQvtCx0LjQtdC80LUg0L/QvtC00L7QsdGA0LAg0YLQvtGH0L3QvtGB0YIuINCi0L7Rh9C90LjQvtGCINC+0LTQs9C+0LLQvtGAINC1INC/0L7QtCAoaWlpKS4NCg0KIyMjIChjKQ0KDQrQndC1INC70LjQvdC10LDRgNC90LjRgtC1INC80LXRgtC+0LTQuCDRgdC1INC/0L7RhNC70LXQutGB0LjQsdC40LvQvdC4INC4INGY0LAg0LfQs9C+0LvQtdC80YPQstCw0LDRgiDQstCw0YDQuNGY0LDQvdGB0LDRgtCwINC90LAg0LzQvtC00LXQu9C+0YIuINCa0L7Qs9CwINC/0L7QstC40YjRg9Cy0LDRmtC10YLQviDQvdCwINCy0LDRgNC40ZjQsNC90YHQsNGC0LAg0LUg0L/QvtC90LjRgdC60L4g0L7QtCDQv9Cw0ZPQsNGa0LXRgtC+INC90LAgYmlhcywg0LTQvtCx0LjQstCw0LzQtSDQv9C+0LTQvtCx0YDQsCDRgtC+0YfQvdC+0YHRgi4g0KLQvtGH0L3QuNC+0YIg0L7QtNCz0L7QstC+0YAg0LUg0L/QvtC0IChpaSkuDQoNCiMg0JfQsNC00LDRh9CwIDMNCg0KIyMjIChhKQ0KDQpSU1Mg0L3QsCDRgtGA0LXQvdC40YDQsNGH0LrQvtGC0L4g0LzQvdC+0LbQtdGB0YLQstC+INC/0L7RgdGC0LXQv9C10L3QviDRnNC1INC+0L/QsNGT0LAsINCx0LjQtNC10ZjRnNC4INC80L7QtNC10LvQvtGCINC/0L7RgdGC0LXQv9C10L3QviDRnNC1INGB0YLQsNC90YPQstCwINC/0L7RhNC70LXQutGB0LjQsdC40LvQtdC9LiDQotC+0YfQvdC40L7RgiDQvtC00LPQvtCy0L7RgCDQtSDQv9C+0LQgKGl2KS4NCg0KIyMjIChiKQ0KDQrQndCwINC/0L7Rh9C10YLQvtC6LCBSU1Mg0YLQtdGB0YLQuNGA0LDRh9C60L7RgtC+INC80L3QvtC20LXRgdGC0LLQviDRnNC1INC+0L/QsNGT0LAsINCx0LjQtNC10ZjRnNC4INC80L7QtNC10LvQvtGCINGc0LUg0LPQviDQvdCw0LzQsNC70YPQstCwIGJpYXMt0L7Rgi4g0JLQviDQvtC00YDQtdC00LXQvSDQvNC+0LzQtdC90YIsINC80L7QtNC10LvQvtGCINGc0LUg0YHRgtCw0L3QtSDQv9GA0LXQvNC90L7Qs9GDINGE0LXQu9C60YHQuNCx0LjQu9C10L0sINC4INCy0LDRgNC40ZjQsNC90YHQsNGC0LAg0ZzQtSDRgNCw0YHRgtC1INC/0L7QstC10ZzQtSDQvtC0INGI0YLQviDRgdC1INC90LDQvNCw0LvRg9Cy0LAgYmlhcy3QvtGCLCDQv9CwIFJTUyDRnNC1INC/0L7Rh9C90LUg0LTQsCDRgNCw0YHRgtC1LiDQjNC1INGB0LUg0LTQvtCx0LjQtSBVINGE0L7RgNC80LAuINCi0L7Rh9C90LjQvtGCINC+0LTQs9C+0LLQvtGAINC1INC/0L7QtCAoaWkpLg0KDQojIyMgKGMpDQoNCtCa0LDQutC+INGI0YLQviDRgNCw0YHRgtC1IHMsINCy0LDRgNC40ZjQsNC90YHQsNGC0LAg0L/QvtGB0YLQtdC/0LXQvdC+INGc0LUg0YHQtSDQt9Cz0L7Qu9C10LzRg9Cy0LAuINCi0L7Rh9C90LjQvtGCINC+0LTQs9C+0LLQvtGAINC1INC/0L7QtCAoaWlpKS4NCg0KIyMjIChkKQ0KDQrQmtCw0LrQviDRiNGC0L4g0YDQsNGB0YLQtSBzLCBiaWFzLdC+0YIg0L/QvtGB0YLQtdC/0LXQvdC+INGc0LUg0YHQtSDQvdCw0LzQsNC70YPQstCwLiDQotC+0YfQvdC40L7RgiDQvtC00LPQvtCy0L7RgCDQtSDQv9C+0LQgKGl2KS4NCg0KIyMjIChlKQ0KDQrQntCy0LDQsCDQs9GA0LXRiNC60LAg0ZzQtSDQtSDQutC+0L3RgdGC0LDQvdGC0L3QsC4g0KLQvtGH0L3QuNC+0YIg0L7QtNCz0L7QstC+0YAg0LUg0L/QvtC0ICh2KS4NCg0KIyDQl9Cw0LTQsNGH0LAgNA0KDQojIyMgKGEpDQoNCtCa0LDQutC+INGI0YLQviDRmNCwINC30LPQvtC70LXQvNGD0LLQsNC80LUg0LvQsNC80LHQtNCw0YLQsCwg0YHQtSDQt9Cz0L7Qu9C10LzRg9Cy0LAg0YHRgtC10L/QtdC90L7RgiDQvdCwINGA0LXQs9GD0LvQsNGA0LjQt9Cw0YbQuNGY0LAsINCwINGB0L4g0YLQvtCwINGB0LUg0L3QsNC80LDQu9GD0LLQsCDRhNC70LXQutGB0LjQsdC40LvQvdC+0YHRgtCwICjQstCw0YDQuNGY0LDQvdGB0LDRgtCwKSDQvdCwINC80L7QtNC10LvQvtGCLiDQodC70LXQtNGB0YLQstC10L3QviDQvdCwINGC0L7QsCwgUlNTINC90LAg0YLRgNC10L3QuNGA0LDRh9C60L7RgtC+INC80L3QvtC20LXRgdGC0LLQviDQv9C+0YHRgtC10L/QtdC90L4g0ZzQtSDRgNCw0YHRgtC1LiDQotC+0YfQvdC40L7RgiDQvtC00LPQvtCy0L7RgCDQtSDQv9C+0LQgKGlpaSkuDQoNCiMjIyAoYikNCg0K0J7Rh9C10LrRg9Cy0LDQvdC+INC1INC90LDQvNCw0LvRg9Cy0LDRmtC10YLQviDQvdCwINCy0LDRgNC40ZjQsNC90YHQsNGC0LAg0L3QsCDQv9C+0YfQtdGC0L7QuiDQtNCwINCz0L4g0L/QvtC00L7QsdGA0Lgg0LzQvtC00LXQu9C+0YIg0L3QsCDRgtC10YHRgtC40YDQsNGH0LrQvtGC0L4g0LzQvdC+0LbQtdGB0YLQstC+ICjQtNCwINCz0L4g0L3QsNC80LDQu9C4IFJTUyksINCx0LjQtNC10ZjRnNC4INGc0LUg0YHQtSDQvdCw0LzQsNC70Lggb3Zlci1maXR0aW5nLdC+0YIuINCf0L7RgdC70LUg0L3QtdC60L7RmNCwINCy0YDQtdC00L3QvtGB0YIsIFJTUyDQv9C+0LLRgtC+0YDQvdC+INGc0LUg0L/QvtGH0L3QtSDQtNCwINGA0LDRgdGC0LUsINCx0LjQtNC10ZjRnNC4INC90LDQvNCw0LvRg9Cy0LDRmtC10YLQviDQvdCwINCy0LDRgNC40ZjQsNC90YHQsNGC0LAg0ZzQtSDQsdC40LTQtSDQv9C+0LzQsNC70L4g0L7QtCDQvdCw0LPQvtC70LXQvNGD0LLQsNGa0LXRgtC+INC90LAgYmlhcy3QvtGCLiDQjNC1INGB0LUg0LTQvtCx0LjQtSBVINGE0L7RgNC80LAuINCi0L7Rh9C90LjQvtGCINC+0LTQs9C+0LLQvtGAINC1INC/0L7QtCAoaWkpLg0KDQojIyMgKGMpDQoNCtCS0LDRgNC40ZjQsNC90YHQsNGC0LAg0L/QvtGB0YLQtdC/0LXQvdC+INGc0LUg0L7Qv9Cw0ZPQsC4g0KLQvtGH0L3QuNC+0YIg0L7QtNCz0L7QstC+0YAg0LUg0L/QvtC0IChpdikuDQoNCiMjIyAoZCkNCg0KQmlhcy3QvtGCINC/0L7RgdGC0LXQv9C10L3QviDRnNC1INGA0LDRgdGC0LUuINCi0L7Rh9C90LjQvtGCINC+0LTQs9C+0LLQvtGAINC1INC/0L7QtCAoaWlpKS4NCg0KIyMjIChlKQ0KDQrQntCy0LDQsCDQs9GA0LXRiNC60LAg0ZzQtSDQtSDQutC+0L3RgdGC0LDQvdGC0L3QsC4g0KLQvtGH0L3QuNC+0YIg0L7QtNCz0L7QstC+0YAg0LUg0L/QvtC0ICh2KS4NCg0KIyDQl9Cw0LTQsNGH0LAgNQ0KDQokJA0KXHN1bV97aT0xfV57Mn15X2k9MFxpbXBsaWVzfHlfMXw9fHlfMnxcaW1wbGllcyB5XzFeMj15XzJeMj15XjJcXCBcc3VtX3tpPTF9XnsyfXhfe2lqfT0wXGltcGxpZXN8eF97MWp9fD18eF97Mmp9fFxpbXBsaWVzIHhfezFqfV4yPXhfezJqfV4yPXhfal4yXFwNCnhfe2kxfT14X3tpMn09eF9pXGltcGxpZXN8eF97MX18PXx4X3syfXxcaW1wbGllcyB4X3sxfV4yPXhfezJ9XjI9eF4yXGltcGxpZXMgeF8xK3hfMj0wXFwNClJTUz0NClxzdW1fe2k9MX1eezJ9KHlfaS14X2lcc3VtX3tqPTF9XnsyfVxoYXRcYmV0YV9qKV4yPVxcDQpcc3VtX3tpPTF9XnsyfSh5XjItMnlfaXhfaVxzdW1fe2o9MX1eezJ9XGhhdFxiZXRhX2oreF4yXHN1bV97aj0xfV57Mn1cc3VtX3t0PTF9XnsyfVxoYXRcYmV0YV9qXGhhdFxiZXRhX3QpPVxcDQoyeV4yLTIoXGhhdFxiZXRhXzErXGhhdFxiZXRhXzIpKHlfMXhfMSt5XzJ4XzIpKzJ4XjIoXGhhdFxiZXRhXzErXGhhdFxiZXRhXzIpXjJcXA0KJCQNCg0KIyMjIChhKSAoYikNCg0KJCQNClJTU1xfUklER0U9UlNTK1xsYW1iZGEoXGhhdFxiZXRhXzFeMitcaGF0XGJldGFfMl4yKT1cXA0KMnleMi0yKFxoYXRcYmV0YV8xK1xoYXRcYmV0YV8yKSh5XzF4XzEreV8yeF8yKSsyeF4yKFxoYXRcYmV0YV8xK1xoYXRcYmV0YV8yKV4yK1xsYW1iZGEoXGhhdFxiZXRhXzFeMitcaGF0XGJldGFfMl4yKVxcDQpcYmVnaW57Y2FzZXN9DQpcZnJhY3tccGFydGlhbCBSU1NcX1JJREdFfXtccGFydGlhbCBcaGF0XGJldGFfMX09LTIoeV8xeF8xK3lfMnhfMikrNHheMihcaGF0XGJldGFfMStcaGF0XGJldGFfMikrMlxsYW1iZGFcaGF0XGJldGFfMT0wXFwNClxmcmFje1xwYXJ0aWFsIFJTU1xfUklER0V9e1xwYXJ0aWFsIFxoYXRcYmV0YV8yfT0tMih5XzF4XzEreV8yeF8yKSs0eF4yKFxoYXRcYmV0YV8xK1xoYXRcYmV0YV8yKSsyXGxhbWJkYVxoYXRcYmV0YV8yPTANClxlbmR7Y2FzZXN9XGltcGxpZXNcXA0KXGhhdFxiZXRhXzEtXGhhdFxiZXRhXzI9MFxpbXBsaWVzXFwNClxoYXRcYmV0YV8xPVxoYXRcYmV0YV8yDQokJA0KDQojIyMgKGMpIChkKQ0KDQrQktC+INC00LLQsNGC0LAg0YHQu9GD0YfQsNC4ICgkc2lnbihcaGF0XGJldGFfMSk9c2lnbihcaGF0XGJldGFfMik9MSQg0LggJHNpZ24oXGhhdFxiZXRhXzEpPXNpZ24oXGhhdFxiZXRhXzIpPS0xJCkg0YHQtSDQtNC+0LHQuNCy0LAg0YHQuNGB0YLQtdC8INC90LAg0LTQstC1INC40LTQtdC90YLQuNGH0L3QuCDRgNCw0LLQtdC90LrQuCwg0L/QsCDQuNC80LAg0LHQtdGB0LrQvtC90LXRh9C90L4g0LzQvdC+0LPRgyDRgNC10YjQtdC90LjRmNCwLiDQldC00LjQvdGB0YLQstC10L3QviDQtSDQstCw0LbQvdC+INCx0LXRgtC40YLQtSDQtNCwINC40LzQsNCw0YIg0LjRgdGCINC30L3QsNC6Lg0KDQokJA0KUlNTXF9MQVNTTz1SU1MrXGxhbWJkYSh8XGhhdFxiZXRhXzF8K3xcaGF0XGJldGFfMnwpPVxcDQoyeV4yLTIoXGhhdFxiZXRhXzErXGhhdFxiZXRhXzIpKHlfMXhfMSt5XzJ4XzIpKzJ4XjIoXGhhdFxiZXRhXzErXGhhdFxiZXRhXzIpXjIrXGxhbWJkYSh8XGhhdFxiZXRhXzF8K3xcaGF0XGJldGFfMnwpXFwNClxiZWdpbntjYXNlc30NClxmcmFje1xwYXJ0aWFsIFJTU1xfUklER0V9e1xwYXJ0aWFsIFxoYXRcYmV0YV8xfT0tMih5XzF4XzEreV8yeF8yKSs0eF4yKFxoYXRcYmV0YV8xK1xoYXRcYmV0YV8yKStcbGFtYmRhXGZyYWN7XGhhdFxiZXRhXzF9e3xcaGF0XGJldGFfMXx9PTBcXA0KXGZyYWN7XHBhcnRpYWwgUlNTXF9SSURHRX17XHBhcnRpYWwgXGhhdFxiZXRhXzJ9PS0yKHlfMXhfMSt5XzJ4XzIpKzR4XjIoXGhhdFxiZXRhXzErXGhhdFxiZXRhXzIpK1xsYW1iZGFcZnJhY3tcaGF0XGJldGFfMn17fFxoYXRcYmV0YV8yfH09MA0KXGVuZHtjYXNlc31caW1wbGllc1xcDQpcZnJhY3tcaGF0XGJldGFfMX17fFxoYXRcYmV0YV8xfH0tXGZyYWN7XGhhdFxiZXRhXzJ9e3xcaGF0XGJldGFfMnx9PTBcaW1wbGllc1xcDQpzaWduKFxoYXRcYmV0YV8xKT1zaWduKFxoYXRcYmV0YV8yKQ0KJCQNCg0KIyDQl9Cw0LTQsNGH0LAgNg0KDQrQktC+INC00LLQsNGC0LAg0YHQu9GD0YfQsNC4INGY0LAg0L/Qu9C+0YLQuNGA0LDQvNC1INGB0L4g0YbRgNCy0LXQvdC+INCy0LXRgNGC0LjQutCw0LvQvdCw0YLQsCDQu9C40L3QuNGY0LAg0YjRgtC+INC80LjQvdGD0LLQsCDQvdC40Lcg0LHQtdGC0LDRgtCwINC60L7RmNCwINCz0L4g0LTQsNCy0LAg0LzQuNC90LjQvNGD0LzQvtGCINGB0L/QvtGA0LXQtCAoNi4xMykuINCT0LvQtdC00LDQvNC1INC00LXQutCwINGC0LDQsCDRgdC1INGB0LXRh9C1INGB0L4g0L/QsNGA0LDQsdC+0LvQsNGC0LAg0LLQviDQvdC10ZjQt9C40L3QuNC+0YIg0LzQuNC90LjQvNGD0LwuDQoNCiMjIyAoYSkNCg0KYGBge3J9DQp5ID0gMw0KbGFtYmRhID0gMQ0KYmV0YSA9ICgtMTAwMDA6MTAwMDApIC8gMTAwDQpyc3NfcmlkZ2UgPSAoeSAtIGJldGEpIF4gMiArIGxhbWJkYSAqIGJldGEgXiAyDQpiZXRhX2Jlc3QgPSB5IC8gKDEgKyBsYW1iZGEpDQpwbG90KGJldGEsIHJzc19yaWRnZSwgdHlwZT0ibCIsIGNvbD0iZ3JlZW4iKQ0KYWJsaW5lKHY9YmV0YV9iZXN0LCBjb2w9InJlZCIpDQpgYGANCg0KIyMjIChiKQ0KDQpgYGB7cn0NCnkgPSAzDQpsYW1iZGEgPSAxDQpiZXRhID0gKC0xMDAwMDoxMDAwMCkgLyAxMDANCnJzc19yaWRnZSA9ICh5IC0gYmV0YSkgXiAyICsgbGFtYmRhICogYWJzKGJldGEpDQpiZXRhX2Jlc3QgPSB5IC0gbGFtYmRhIC8gMg0KcGxvdChiZXRhLCByc3NfcmlkZ2UsIHR5cGU9ImwiLCBjb2w9ImdyZWVuIikNCmFibGluZSh2PWJldGFfYmVzdCwgY29sPSJyZWQiKQ0KYGBgDQoNCiMg0JfQsNC00LDRh9CwIDcNCg0KIyMjIChhKQ0KDQokJA0KWV9pPVxiZXRhXzArXHN1bV97aj0xfV57cH1cYmV0YV9pWF97aWp9K2Vycl9pIFxpbXBsaWVzIGVycl9pPVlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ee3B9XGJldGFfaVhfe2lqfVxcDQpmKFl8WCxcYmV0YSk9XHByb2Rfe2k9MX1ebnAoWV9pfFhfaSxcYmV0YSk9XHByb2Rfe2k9MX1ee259cChlcnJfaXxZX2ksWF9pLFxiZXRhKT1ccHJvZF97aT0xfV5uXGZyYWN7MX17XHNpZ21hXHNxcnR7MlxwaX19ZV57LVxmcmFjezF9ezJ9KFxmcmFje2Vycl9pLTB9e1xzaWdtYX0pXjJ9PVxcDQpccHJvZF97aT0xfV5uXGZyYWN7MX17XHNpZ21hXHNxcnR7MlxwaX19ZV57LVxmcmFjezF9ezJ9KFxmcmFje1lfaS1cYmV0YV8wLVxzdW1fe2o9MX1ee3B9XGJldGFfaVhfe2lqfX17XHNpZ21hfSleMn09XFwNCihcZnJhY3sxfXtcc2lnbWFcc3FydHsyXHBpfX0pXm5lXnstXGZyYWN7MX17MlxzaWdtYV4yfVxzdW1fe2k9MX1ebihZX2ktXGJldGFfMC1cc3VtX3tqPTF9XntwfVxiZXRhX2lYX3tpan0pXjJ9DQokJA0KDQojIyMgKGIpDQoNCiQkDQpwKFxiZXRhKT1cZnJhY3sxfXsyYn1lXntcZnJhY3stfFxiZXRhfH17Yn19XFwNCnAoXGJldGF8WCxZKVxwcm9wdG8gZihZfFgsXGJldGEpcChcYmV0YSk9KFxmcmFjezF9e1xzaWdtYVxzcXJ0ezJccGl9fSlebmVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9XHN1bV97aT0xfV5uKFlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ee3B9XGJldGFfaVhfe2lqfSleMn1cZnJhY3sxfXsyYn1lXntcZnJhY3stfFxiZXRhfH17Yn19PVxcDQo9KFxmcmFjezF9e1xzaWdtYVxzcXJ0ezJccGl9fSleblxmcmFjezF9ezJifWVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9XHN1bV97aT0xfV5uKFlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ee3B9XGJldGFfaVhfe2lqfSleMi1cZnJhY3t8XGJldGF8fXtifX0NCiQkDQoNCiMjIyAoYykNCg0K0J7QstCwINC1INC40YHRgtC+INC60LDQutC+IGxhc3NvINGB0L4gJFxsYW1iZGE9XGZyYWN7MlxzaWdtYV4yfXtifSQuDQoNCiQkDQpsb2coZihZfFgsXGJldGEpcChcYmV0YSkpPWxvZygoXGZyYWN7MX17XHNpZ21hXHNxcnR7MlxwaX19KV5uXGZyYWN7MX17MmJ9KS1cZnJhY3sxfXsyXHNpZ21hXjJ9XHN1bV97aT0xfV5uKFlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ee3B9XGJldGFfaVhfe2lqfSleMi1cZnJhY3t8XGJldGF8fXtifVxcDQpcdW5kZXJzZXR7XGJldGF9e1xhcmdcbWF4fVtsb2coZihZfFgsXGJldGEpcChcYmV0YSkpXT1cdW5kZXJzZXR7XGJldGF9e1xhcmdcbWlufVtcZnJhY3sxfXsyXHNpZ21hXjJ9XHN1bV97aT0xfV5uKFlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ee3B9XGJldGFfaVhfe2lqfSleMitcZnJhY3sxfXtifVxzdW1fe2o9MX1ee3B9fFxiZXRhX2p8XT1cXA0KXHVuZGVyc2V0e1xiZXRhfXtcYXJnXG1pbn1bXHN1bV97aT0xfV5uKFlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ee3B9XGJldGFfaVhfe2lqfSleMitcZnJhY3syXHNpZ21hXjJ9e2J9XHN1bV97aj0xfV57cH18XGJldGFfanxdPVxcDQpcdW5kZXJzZXR7XGJldGF9e1xhcmdcbWlufVtSU1MrXGZyYWN7MlxzaWdtYV4yfXtifVxzdW1fe2o9MX1ee3B9fFxiZXRhX2p8XQ0KJCQNCg0KIyMjIChkKQ0KDQokJA0KcChcYmV0YSk9XGZyYWN7MX17Y1xzcXJ0ezJccGl9fWVeey1cZnJhY3tcYmV0YV4yfXsyY319XFwNCnAoXGJldGF8WCxZKVxwcm9wdG8gZihZfFgsXGJldGEpcChcYmV0YSk9KFxmcmFjezF9e1xzaWdtYVxzcXJ0ezJccGl9fSlebmVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9XHN1bV97aT0xfV5uKFlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ee3B9XGJldGFfaVhfe2lqfSleMn1cZnJhY3sxfXtcc3FydHsyY1xwaX19ZV57LVxmcmFje1xiZXRhXjJ9ezJjfX09XFwNCj0oXGZyYWN7MX17XHNpZ21hXHNxcnR7MlxwaX19KV5uXGZyYWN7MX17XHNxcnR7MmNccGl9fWVeey1cZnJhY3sxfXsyXHNpZ21hXjJ9XHN1bV97aT0xfV5uKFlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ee3B9XGJldGFfaVhfe2lqfSleMi1cZnJhY3tcYmV0YV4yfXsyY319DQokJA0KDQojIyMgKGUpDQoNCtCe0LLQsCDQtSDQuNGB0YLQviDQutCw0LrQviByaWRnZSDRgdC+ICRcbGFtYmRhPVxmcmFje1xzaWdtYV4yfXtjfSQuDQoNCiQkDQpsb2coZihZfFgsXGJldGEpcChcYmV0YSkpPWxvZygoXGZyYWN7MX17XHNpZ21hXHNxcnR7MlxwaX19KV5uXGZyYWN7MX17XHNxcnR7MmNccGl9fSktXGZyYWN7MX17MlxzaWdtYV4yfVxzdW1fe2k9MX1ebihZX2ktXGJldGFfMC1cc3VtX3tqPTF9XntwfVxiZXRhX2lYX3tpan0pXjItXGZyYWN7XGJldGFeMn17MmN9XFwNClx1bmRlcnNldHtcYmV0YX17XGFyZ1xtYXh9W2xvZyhmKFl8WCxcYmV0YSlwKFxiZXRhKSldPVx1bmRlcnNldHtcYmV0YX17XGFyZ1xtaW59W1xmcmFjezF9ezJcc2lnbWFeMn1cc3VtX3tpPTF9Xm4oWV9pLVxiZXRhXzAtXHN1bV97aj0xfV57cH1cYmV0YV9pWF97aWp9KV4yK1xmcmFjezF9ezJjfVxzdW1fe2o9MX1ee3B9XGJldGFfal4yXT1cXA0KXHVuZGVyc2V0e1xiZXRhfXtcYXJnXG1pbn1bXHN1bV97aT0xfV5uKFlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ee3B9XGJldGFfaVhfe2lqfSleMitcZnJhY3tcc2lnbWFeMn17Y14yfVxzdW1fe2o9MX1ee3B9XGJldGFfal4yXT1cXA0KXHVuZGVyc2V0e1xiZXRhfXtcYXJnXG1pbn1bUlNTK1xmcmFje1xzaWdtYV4yfXtjfVxzdW1fe2o9MX1ee3B9XGJldGFfal4yXQ0KJCQNCg0KIyDQl9Cw0LTQsNGH0LAgOA0KDQojIyMgKGEpIChiKQ0KDQpgYGB7cn0NCnNldC5zZWVkKDEzMzcpDQp4ID0gcm5vcm0oMTAwKQ0KZSA9IHJub3JtKDEwMCkNCmJldGEgPSBjKDMsIDIsIDQsIDEpDQp5ID0gYmV0YVsxXSArIGJldGFbMl0gKiB4ICsgYmV0YVszXSAqIHggXiAyICsgYmV0YVs0XSAqIHggXiAzICsgZQ0KcGxvdCh4LCB5KQ0KYGBgDQoNCg0KIyMjIChjKSAoZCkNCg0KYGBge3J9DQpsaWJyYXJ5KGxlYXBzKQ0KDQpkYXRhID0gZGF0YS5mcmFtZSh4LCB4XjIsIHheMywgeF40LCB4XjUsIHheNiwgeF43LCB4XjgsIHheOSwgeF4xMCwgeSkNCmRhdGENCg0KcHJpbnRfcGxvdF9iZXN0IDwtIGZ1bmN0aW9uKGxpc3QsIG5hbWUsIG1heD1UUlVFKSB7DQogIHByaW50KG5hbWUpDQogIHByaW50KGxpc3QpDQogIGlmIChtYXgpIHsNCiAgICBiZXN0ID0gd2hpY2gubWF4KGxpc3QpDQogIH0gZWxzZSB7DQogICAgYmVzdCA9IHdoaWNoLm1pbihsaXN0KQ0KICB9DQogIHByaW50KHBhc3RlKCJCZXN0OiIsIGJlc3QpKQ0KICBwbG90KGxpc3QsIHR5cGU9ImwiLCB5bGFiPW5hbWUpDQogIHBvaW50cyhiZXN0LCBsaXN0W2Jlc3RdLCBjb2w9InJlZCIsIHBjaD0xOSkNCn0NCg0KZ2V0X2Jlc3QgPC0gZnVuY3Rpb24obWV0aG9kKSB7DQogIGJlc3Rfc3Vic2V0ID0gcmVnc3Vic2V0cyh5IOKIvCAuLCBkYXRhLCBudm1heD0xMCwgbWV0aG9kPW1ldGhvZCkNCiAgcHJpbnQoc3VtbWFyeShiZXN0X3N1YnNldCkpDQogIHByaW50X3Bsb3RfYmVzdChzdW1tYXJ5KGJlc3Rfc3Vic2V0KSRyc3EsIHBhc3RlKCJSMiIsIG1ldGhvZCkpDQogIHByaW50X3Bsb3RfYmVzdChzdW1tYXJ5KGJlc3Rfc3Vic2V0KSRhZGpyMiwgcGFzdGUoIkFkai4gUjIiLCBtZXRob2QpKQ0KICBwcmludF9wbG90X2Jlc3Qoc3VtbWFyeShiZXN0X3N1YnNldCkkY3AsIHBhc3RlKCJDcCIsIG1ldGhvZCksIG1heD1GQUxTRSkNCiAgcHJpbnRfcGxvdF9iZXN0KHN1bW1hcnkoYmVzdF9zdWJzZXQpJGJpYywgcGFzdGUoIkJJQyIsIG1ldGhvZCksIG1heD1GQUxTRSkNCn0NCg0KZ2V0X2Jlc3QoImV4aGF1c3RpdmUiKQ0KZ2V0X2Jlc3QoImJhY2t3YXJkIikNCmdldF9iZXN0KCJmb3J3YXJkIikNCmBgYA0KDQojIyMgKGUpDQoNCmBgYHtyfQ0KbGlicmFyeShnbG1uZXQpDQpzZXQuc2VlZCgxMzM3KQ0KeF9kYXRhID0gZGF0YVssIGMoDQogICJ4IiwgInguMiIsICJ4LjMiLCAieC40IiwgInguNSIsICJ4LjYiLCAieC43IiwgInguOCIsICJ4LjkiLCAieC4xMCINCildDQp5X2RhdGEgPSBkYXRhWywgYygieSIpXQ0KY3Jvc3NfdmFsaWRhdGVkID0gY3YuZ2xtbmV0KGFzLm1hdHJpeCh4X2RhdGEpLCB5X2RhdGEsIGFscGhhPTEpDQpwbG90KGNyb3NzX3ZhbGlkYXRlZCkNCnByaW50KHBhc3RlKCJCZXN0IGxhbWJkYToiLCBjcm9zc192YWxpZGF0ZWQkbGFtYmRhLm1pbikpDQpgYGANCg0KIyDQl9Cw0LTQsNGH0LAgOQ0KDQojIyMgKGEpDQoNCmBgYHtyfQ0KbGlicmFyeShJU0xSKQ0KDQpzZXQuc2VlZCgxMzM3KQ0KdHJhaW4gPSBzYW1wbGUoYyhUUlVFLCBGQUxTRSksIG5yb3coQ29sbGVnZSksIHJlcD1UUlVFKQ0KdGVzdCA9ICghdHJhaW4pDQpgYGANCg0KIyMjIChiKQ0KDQpNU0Ug0L3QsCDRgtGA0LXQvdC40YDQsNGH0LrQvtGC0L4g0LzQvdC+0LbQtdGB0YLQstC+INC1IDk2MjM5NS44LCBNU0Ug0L3QsCDRgtC10YHRgtC40YDQsNGH0LrQvtGC0L4g0LzQvdC+0LbQtdGB0YLQstC+INC1IDEzMTcyNTMuDQoNCmBgYHtyfQ0KbGluX21vZGVsID0gbG0oQXBwcyB+IC4sIGRhdGE9Q29sbGVnZVt0cmFpbiwgXSkNCnRyYWluX3ByZWRzID0gcHJlZGljdChsaW5fbW9kZWwsIENvbGxlZ2VbdHJhaW4sIF0pDQp0ZXN0X3ByZWRzID0gcHJlZGljdChsaW5fbW9kZWwsIENvbGxlZ2VbdGVzdCwgXSkNCnN1bSgoQ29sbGVnZVt0cmFpbiwgXSRBcHBzIC0gdHJhaW5fcHJlZHMpIF4gMikgLyBucm93KENvbGxlZ2VbdHJhaW4sIF0pDQpzdW0oKENvbGxlZ2VbdGVzdCwgXSRBcHBzIC0gdGVzdF9wcmVkcykgXiAyKSAvIG5yb3coQ29sbGVnZVt0ZXN0LCBdKQ0KYGBgDQoNCiMjIyAoYykNCg0K0KHQviDQu9Cw0LzQsdC00LAgMzAxLjYwMTEsINGC0LXRgdGCIE1TRSDQuNC30L3QtdGB0YPQstCwIDIxNjYxODMuDQoNCmBgYHtyfQ0KbGlicmFyeShsZWFwcykNCmxpYnJhcnkoZ2xtbmV0KQ0KDQpzZXQuc2VlZCgxMzM3KQ0KDQpncmlkID0gMTAgXiBzZXEoMTAsIC0yLCBsZW5ndGg9MTAwKQ0KWCA9IG1vZGVsLm1hdHJpeChBcHBzIH4gLiwgZGF0YT1Db2xsZWdlW3RyYWluLCBdKQ0KY3Jvc3NfdmFsaWRhdGVkID0gY3YuZ2xtbmV0KFgsIENvbGxlZ2VbdHJhaW4sIGMoIkFwcHMiKV0sIGFscGhhPTApDQpwbG90KGNyb3NzX3ZhbGlkYXRlZCkNCmNyb3NzX3ZhbGlkYXRlZCRsYW1iZGEubWluDQpyaWRnZV9yZWcgPSBnbG1uZXQoDQogIFgsIA0KICBDb2xsZWdlW3RyYWluLCBjKCJBcHBzIildLCANCiAgYWxwaGE9MCwgDQogIGxhbWJkYT1jcm9zc192YWxpZGF0ZWQkbGFtYmRhLm1pbg0KKQ0KdGVzdF9wcmVkcyA9IHByZWRpY3QoDQogIHJpZGdlX3JlZywgDQogIG1vZGVsLm1hdHJpeChBcHBzIH4gLiwgZGF0YT1Db2xsZWdlW3Rlc3QsIF0pDQopDQpzdW0oKENvbGxlZ2VbdGVzdCwgXSRBcHBzIC0gdGVzdF9wcmVkcykgXiAyKSAvIG5yb3coQ29sbGVnZVt0ZXN0LCBdKQ0KYGBgDQoNCiMjIyAoZCkNCg0K0KHQviDQu9Cw0LzQsdC00LAgMS40NjY1NjYsINGC0LXRgdGCIE1TRSDQuNC30L3QtdGB0YPQstCwIDEzMjA5MjkuINCd0LXQvNCwINC90YPQu9C4INC60L7QtdGE0LjRhtC40LXQvdGC0LguDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTMzNykNCg0KWCA9IG1vZGVsLm1hdHJpeChBcHBzIH4gLiwgZGF0YT1Db2xsZWdlW3RyYWluLCBdKQ0KY3Jvc3NfdmFsaWRhdGVkID0gY3YuZ2xtbmV0KFgsIENvbGxlZ2VbdHJhaW4sIGMoIkFwcHMiKV0sIGFscGhhPTEpDQpwbG90KGNyb3NzX3ZhbGlkYXRlZCkNCmNyb3NzX3ZhbGlkYXRlZCRsYW1iZGEubWluDQpyaWRnZV9yZWcgPSBnbG1uZXQoDQogIFgsIA0KICBDb2xsZWdlW3RyYWluLCBjKCJBcHBzIildLCANCiAgYWxwaGE9MSwgDQogIGxhbWJkYT1jcm9zc192YWxpZGF0ZWQkbGFtYmRhLm1pbg0KKQ0KdGVzdF9wcmVkcyA9IHByZWRpY3QoDQogIHJpZGdlX3JlZywgDQogIG1vZGVsLm1hdHJpeChBcHBzIH4gLiwgZGF0YT1Db2xsZWdlW3Rlc3QsIF0pDQopDQpzdW0oKENvbGxlZ2VbdGVzdCwgXSRBcHBzIC0gdGVzdF9wcmVkcykgXiAyKSAvIG5yb3coQ29sbGVnZVt0ZXN0LCBdKQ0KcHJlZGljdCgNCiAgcmlkZ2VfcmVnLCANCiAgbW9kZWwubWF0cml4KEFwcHMgfiAuLCBkYXRhPUNvbGxlZ2VbdGVzdCwgXSksDQogIHR5cGU9ImNvZWZmaWNpZW50cyINCikNCmBgYA0KDQojIyMgKGUpDQoNCtCa0L7RgNC40YHRgtC40LzQtSAxNyDQutC+0LzQv9C+0L3QtdC90YLQuC4g0KLQtdGB0YIgTVNFIGUgMTMxNzI1My4NCg0KYGBge3J9DQpsaWJyYXJ5KHBscykNCg0Kc2V0LnNlZWQoMTMzNykNCnBjcl9tb2RlbCA9IHBjcihBcHBzIOKIvCAuLCBkYXRhPUNvbGxlZ2VbdHJhaW4sIF0sIHNjYWxlPVRSVUUsIHZhbGlkYXRpb249IkNWIikNCnZhbGlkYXRpb25wbG90KHBjcl9tb2RlbCwgdmFsLnR5cGU9Ik1TRVAiKQ0KdGVzdF9wcmVkcyA9IHByZWRpY3QocGNyX21vZGVsLCBDb2xsZWdlW3Rlc3QsIF0sIG5jb21wPTE3KQ0Kc3VtKChDb2xsZWdlW3Rlc3QsIF0kQXBwcyAtIHRlc3RfcHJlZHMpIF4gMikgLyBucm93KENvbGxlZ2VbdGVzdCwgXSkNCmBgYA0KDQojIyMgKGYpDQoNCtCa0L7RgNC40YHRgtC40LzQtSAxNyDQutC+0LzQv9C+0L3QtdC90YLQuC4g0KLQtdGB0YIgTVNFIGUgMTMxNzI1My4NCg0KYGBge3J9DQpzZXQuc2VlZCgxMzM3KQ0KcGxzcl9tb2RlbCA9IHBsc3IoQXBwcyDiiLwgLiwgZGF0YT1Db2xsZWdlW3RyYWluLCBdLCBzY2FsZT1UUlVFLCB2YWxpZGF0aW9uPSJDViIpDQp2YWxpZGF0aW9ucGxvdChwbHNyX21vZGVsLCB2YWwudHlwZT0iTVNFUCIpDQp0ZXN0X3ByZWRzID0gcHJlZGljdChwY3JfbW9kZWwsIENvbGxlZ2VbdGVzdCwgXSwgbmNvbXA9MTcpDQpzdW0oKENvbGxlZ2VbdGVzdCwgXSRBcHBzIC0gdGVzdF9wcmVkcykgXiAyKSAvIG5yb3coQ29sbGVnZVt0ZXN0LCBdKQ0KYGBgDQoNCiMjIyAoZykNCg0K0J3QtdC80LAg0L3QtdC60L7RmNCwINGA0LDQt9C70LjQutCwINCy0L4g0YLQtdGB0YIgTVNFLCDQsdC10Lcg0YDQsNC30LvQuNC60LAg0YjRgtC+INC60L7RgNC40YHRgtC40LzQtS4g0KHQtdC60L7Qs9Cw0Ygg0LvQvtGI0L4g0YHQtSDQv9GA0LXQtNCy0LjQtNGD0LLQsNCw0YIg0LHRgNC+0ZjQvtGCINC90LAg0LDQv9C70LjQutCw0YbQuNC4Lg==