2017-09-25 19 views
0

私は、予測子ベクトルXsとバイナリ応答Ysを持つサンプルSを持っています。基本的には、与えられたX_Iのためにそれは私に異なる結果と観測値との差のL2ノルムの最小値を与えるこの最小化関数の作成

formula

:私は次の関数を作成したいと思います。私はあなたがたぶんすべての違いを1つずつループする機能を作成することができることを知っています。しかし、ベクトル化された方法があるのだろうか?

私の試み:

データセットがp + 1でnは、nはサンプルサイズ、P =#予測因子、最後の行のようにY:

g <- vector(); 
for(i in 1:n){ 
    temp <- t(data[data$Y[i] != data$Y, 1:p]) - as.vector(t(data[i,1:p])) 
    g[i]<- min(col.norm(temp)) 
} 
+1

こんにちは! StackOverflowはラテックスを視覚化しませんが、回避策として[this](http://www.codecogs.com/latex/eqneditor.php)を使用することができます(結果の式をコピーして貼り付けてください)。今すぐ読むことができないので、数式を修正してください。また、あなたの機能(ベクトル化されているかどうか)を試してみてください。ありがとう。 – lrnzcig

+0

アドバイスをいただきありがとうございます。私はこの数式を修正し、今も自分の試みを追加しました。 – ChuckP

答えて

1

ないあなたのデータはどのように大きなであることを確認してください。私はパフォーマンスを最適化するためにベクトル化したいと思う。ここにはslqdfを使用して解決策があります。

(私はdata.tableのような選択肢を探したが、私は参加のそれぞれの側にあなたの条件そのY!= Yとの直積を実行するために成功しませんでした...)

まず私は、おもちゃのデータフレームを作成し、あなたのコードで実行してください。

グラムのための結果が
library(tilting) 
data <- data.frame(p1=seq(1, 6), p2=seq(12, 17), p3=seq(14,9), Y=c(rep(0,3), rep(1,3))) 
g <- vector(); 
n <- nrow(data) 
p <- 3 
for(i in 1:n){ 
    temp <- t(data[data$Y[i] != data$Y, 1:p]) - as.vector(t(data[i,1:p])) 
    g[i]<- min(col.norm(temp)) 
} 

[1] 5.196152 3.464102 1.732051 1.732051 3.464102 5.196152 

その後、私はrownamesを使用してデータにインデックスを追加し、デカルト積を実行し、

data$idx <- rownames(data) 
library(sqldf) 
predictors <- c("p1", "p2", "p3") 
cart <- sqldf(paste0("select d1.idx,", 
        paste("d1", predictors, collapse=",", sep="."), ",", 
        paste("d2", predictors, collapse=",", sep="."), 
        " from data as d1", 
        " join data as d2", 
        " on d1.Y != d2.Y")) 

その後、私はあなたの関数を計算し、

cart$d <- sqrt(rowSums((cart[, 2:4] - cart[, 5:7])^2)) 

であり、最小化は結果を集計するのと同じです。

> aggregate(cart, by=list(cart$idx), FUN=min)[, c("idx", "d")] 
    idx  d 
1 1 5.196152 
2 2 3.464102 
3 3 1.732051 
4 4 1.732051 
5 5 3.464102 
6 6 5.196152 

私が言ったように、あなたの目的は分かりませんが、それが助けてくれることを願っています。

関連する問題