创建这个最小化函数

问题描述:

我有一个样本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

不知道你有多大的数据。我想你想矢量化,以优化性能。在这里你有一个可能的解决方案,使用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 

正如我所说,不确定你的目标,但我希望它有帮助。