2013-08-10 2 views
1

나는 릿지 회귀 분석을하고 있으며, 직접 함수를 만들고 싶습니다. 그것은 다음을 시도했다. 그것은 k의 개별 값에 대해서만 작동하지만 배열 값에 대해서는 작동하지 않습니다.사용자 정의 능선 회귀 함수

dt<-longley 
attach(dt) 
library(MASS) 
X<-cbind(X1,X2,X3,X4,X5,X6) 
X<-as.matrix(X) 
Y<-as.matrix(Y) 

sx<-scale(X)/sqrt(nrow(X)-1) 
sy<-scale(Y)/sqrt(nrow(Y)-1) 
rxx<-cor(sx) 
rxy<-cor(sx,sy) 

for (k in 0:1){ 
res<-solve(rxx+k*diag(rxx))%*%rxy 
k=k+0.01 
} 

최적화 된 코드도 도움이 필요합니다.

+0

예제를 정리할 수 있습니까? 우리는 입력 데이터가 무엇인지 알지 못합니다. 'Y'가없고 'Y'가 사용되고, 'rid'는 사용되지 않음으로 생성되며, 설명에 'k'가 없습니다. 아마도 이것은 사용 중일 것입니다 : http://stackoverflow.com/q/5963269 –

+0

@ Bryan Hanso : code updated. Longley는 기본 데이터 세트이지만 다른 이름을 사용했습니다. 모든 데이터 세트를 고려할 수 있습니다. –

+0

@ itfeature.com 우리는 * 모든 데이터 세트를 고려하고 싶지는 않습니다. 귀하의 데이터를 고려하고 싶습니다. 도움이 필요하면 우리를 대신하여 불필요한 노력을 기울이지 않아도 예제를 실행할 수 있다면 더 좋은 기회를 얻을 수 있습니다. 편집하여 편집하십시오. –

답변

1
poly.kernel <- function(v1, v2=v1, p=1) { 
    ((as.matrix(v1) %*% t(v2))+1)^p 
} 

KernelRidgeReg <- function(TrainObjects,TrainLabels,TestObjects,lambda){ 

    X <- TrainObjects 
    y <- TrainLabels      
    kernel <- poly.kernel(X) 

    design.mat <- cbind(1, kernel) 

    I <- rbind(0, cbind(0, kernel)) 

    M <- crossprod(design.mat) + lambda*I 
    #crossprod is just x times traspose of x, just looks neater in my openion 

    M.inv <- solve(M) 
    #inverse of M 

    k <- as.matrix(diag(poly.kernel(cbind(TrainObjects,TrainLabels)))) 
    #Removing diag still gives the same MSE, but will output a vector of prediction. 

    Labels <- rbind(0,as.matrix(TrainLabels)) 

    y.hat <- t(Labels) %*% M.inv %*% rbind(0,k) 

    y.true <- Y.test 

    MSE <-mean((y.hat - y.true)^2) 

    return(list(MSE=MSE,y.hat=y.hat)) 

} 

p = 1 인 커널은 리지 회귀를 제공합니다.

내장 R 함수를 해결하면 단수의 행렬을 반환하는 경우가 있습니다. 이를 방지하기 위해 자체 함수를 작성하는 것이 좋습니다.