R Implementation: Kernel Ridge Regression
DOWNLOAD
DEFINE KRR CLASS
KRR <- function
( trainObject
, testObject
, trainLabel
, lambda
, km #kernel method; km = 0 polynomial; km = 1 radial; km = 2 for linear
, parameter #treat as d for polynomial or treat as g for radial
) {
POLYNOMIAL KERNEL
\[K(x,x') = \left( 1 + \sum_{j=1}^p x_j x'_j \right)^d\]polynomial_k <- function (x, x.prime, d) {
return(I((1 + x %*% x.prime)^d));
};
RADIAL KERNEL
\[K(x,x') = \exp \left(-\gamma \sum_{j=1}^p (x_j-x'_j)^2 \right)\]radial_k <- function (x, x.prime, g) {
r <- apply( x.prime
, 1
, function(a)
colSums(apply ( x
, 1
, function(b)
(b - a)^2)
)
);
return(exp(-g*r));
};
LINEAR KERNEL
\[K(x,x') = x\cdot x' = \sum_{j=1}^p x_j \cdot x'_j\]linear_k <-function (x,x.prime) {
return(x %*% x.prime);
};
INITIALISE VARIABLES
#INITIALISE DATA FRAMES
df.trainObject <- data.frame(trainObject);
df.testObject <- data.frame(testObject);
df.trainLabel <- data.frame(trainLabel);
#INITIALIZE MATRICES
m.trainObject <- as.matrix(trainObject);
m.testObject <- as.matrix(testObject);
m.trainLabel <- as.matrix(trainLabel);
PARAMETER HANDLING
#number of attributes
p = ncol(df.trainObject);
#number of observations
n = nrow(df.trainObject);
RETURN K and k
Polynomial
if (km == 0) {
K <- polynomial_k(m.trainObject,t(m.trainObject),parameter);
k <- polynomial_k(m.trainObject,t(m.testObject),parameter);
}
Radial
else if (km == 1) {
K <- radial_k(df.trainObject,df.trainObject,parameter);
k <- radial_k(df.trainObject,df.testObject,parameter);
}
Linear
else if (km == 2) {
K <- linear_k(m.trainObject,t(m.trainObject));
k <- linear_k(m.trainObject,t(m.testObject));
};
Calculate Y Hat
y.hat <- trainLabel %*% solve(lambda*diag(n) + K) %*% k;
return (y.hat);
};