创建这个最小化函数
问题描述:
我有一个样本S与预测向量Xs和二进制响应Ys。我想创建以下功能:创建这个最小化函数
基本上,对于一个给定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))
}
答
不知道你有多大的数据。我想你想矢量化,以优化性能。在这里你有一个可能的解决方案,使用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
正如我所说,不确定你的目标,但我希望它有帮助。
嗨! StackOverflow不可视化乳胶,您可以使用[this](http://www.codecogs.com/latex/eqneditor.php)作为解决方法(复制粘贴结果公式)。请修正你的公式,因为现在它不可读。也请为您的功能提供最佳尝试(无论是矢量化还是非矢量化)。谢谢。 – lrnzcig
感谢您的建议,我已经修复了配方,并且现在也添加了我自己的尝试。 – ChuckP