我正在尝试在R中实现Kernel Ridge回归。
公式为:
// assuming second canvas is same dimensions as first one
var secondCanvasId = context.createImageData(canvas.width, canvas.height);
for (var x = 0; x < canvas.width; x++) {
for (var y = 0; y < canvas.height; y++) {
var pix = context.getImageData(x, y, 1, 1).data;
var r = pix[0];
var g = pix[1];
var b = pix[2];
var a = pix[3];
// set canvas2 (x, y) pixel with this color, if it matches the choosen color
if (r === color.r && g === color.g && b === color.b && a === color.a) {
secondCanvasId.data[0] = r;
secondCanvasId.data[1] = g;
secondCanvasId.data[2] = b;
secondCanvasId.data[3] = a;
context.putImageData(secondCanvasId, x, y);
}
}
}
Lambda = 0.1。 I =与K相同大小的单位矩阵.y是与K具有相同行数的特征向量。
所以我在R中尝试了这个:
alpha <- ((lambda.I + K)^(-1)) * y
我收到以下错误
I <- diag(nrow(df_matrix)
lambda <- 0.1
alpha <- (lambda * I + df_matrix) ^ (-1) * df_vector
这里有关于我的数据集的一些信息
Error in (0.1 * I + df_matrix)^(-1) * df_vector : non-conformable arrays
答案 0 :(得分:4)
我敢打赌你想在这里进行矩阵求逆,即solve(m)
,而不是逐个元素(m^(-1)
)。此外,矩阵乘法(%*%
)而不是元素(*
)。所以,完全是
alpha <- solve(lambda * I + df_matrix) %*% df_vector
答案 1 :(得分:1)
您需要使用矩阵乘法%*%
。此外,您还需要使用solve
来计算逆,因为提升到幂只减去一个就会做元素明智的倒数。 e.g:
K <- matrix(runif(9),3)
y <- matrix(runif(3),nrow=3)
solve(lambda*diag(nrow(K))+K) %*% y
[,1]
[1,] 0.50035075
[2,] -0.04985508
[3,] 0.74944867
答案 2 :(得分:1)
要转置矩阵,矩阵必须是二次的,行列式必须不等于零。如果矩阵df_matrix满足这些要求,那么
alpha <- solve(lambda * I + df_matrix) %*% df_vector