2017-09-25 54 views
0

我有一個樣本S與預測向量Xs和二進制響應Ys。我想創建以下功能:創建這個最小化函數

formula

基本上,對於一個給定X_I它給了我的意見,從最小的差的L2範數的有不同的結果。我知道你可以創建一個函數來循環遍歷所有的差異。但我想知道是否有一些矢量化的方式?

我嘗試:

數據集爲n用p + 1,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 

正如我所說,不確定你的目標,但我希望它有幫助。