我需要解决一个需要比较具有相同列数的两个矩阵的问题。其中之一被操纵,直到获得最佳匹配。我对两个矩阵之间的差异进行评分的方式非常复杂,我仍然需要最终确定它。目前我真正感兴趣的是找到一种仅适用于正整数的搜索/优化算法。我创建了一个简单的示例,其中包含一个简单的最大化函数。假设我有一个数据集 D。
D <- data.frame(rbind(c(1,1,1),
c(1,1,0),c(1,1,0),c(1,1,0),c(1,0,0),
c(0,0,0),c(1,0,0),c(1,0,0),c(1,1,0),
c(1,0,0),c(1,1,1),c(1,1,0),c(1,0,0),
c(1,0,0),c(1,0,1)))
我想找出 Dx 的哪种重新排列给我带来最低的绝对差异。
Dx<-data.frame(rbind(c(1,1,0),c(1,0,0),c(0,0,0),c(1,1,0)))
所以我可以使用下面的函数完成所有可能的排列
library(combinat)
SPACE <- t(as.data.frame(list(permn(1:3))))
f <- function(x){
if(anyDuplicated(x)>0){return(0)}
Dist<-NA
for (i in 1:nrow(D)){
Dist[i]<-sum(abs(Dx[,x]-t(D[i,])))}
return(sum(Dist))}
apply(SPACE,1,f)
并得到正确的结果。但是,这对于我实际使用的数据有两个缺点:
- 我必须指定 SPACE-所有可能的列顺序和
-
apply
遍历每个可能的排列并计算我的错误分数。
随着矩阵中列数的增加,A 和 B 都变得计算困难。我认为,在大多数计算机上,即使在一个 R 会话中保留数字 1 到 14 的所有可能排列也是不可能的。
我发现的一种优化算法是网格搜索。这开始解决 A。这意味着我不必指定 SPACE(即所有可能的排列),因此这是朝着正确方向迈出的一步,因为我想查看更大的数据集。
library(NMOF)
gridSearch(f, rep(list(seq(1,ncol(D))),ncol(D)))
但显然这并没有解决 B,因为它会经历每个可能的迭代。如果我的数据集非常大(假设有 15 列甚至更多列)怎么办?
请记住,我的参数只能是正整数(即它们是列号),是否有一种 R 算法可以让我在合理的时间内找到最佳的列顺序(或至少是一个好的近似值)(例如1-2 天),当我处理更大的数据集时?这可能看起来像一个愚蠢的例子,但它很好地模拟了我试图解决的问题。我试过了optim()
with method="SANN"
,但无处可去。不幸的是,我的经验很少,所以如果您认为这是一个无法解决的问题,请告诉我。首先从一个更简单的数据集(行数很少但列很多)问题开始,您认为是否可以通过使用某种巧妙的优化来找到如上所示的 D2 的最佳列顺序?
#D2
D<-cbind(D,D,D,D,D)
ncol(D)
Dx<-cbind(Dx,Dx,Dx,Dx,Dx)
#examples
f(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15))
f(c(13,2,4,3,5,6,7,8,9,10,11,12,1,14,15))
编辑:
我的主要兴趣是了解如何使用在搜索过程中使用一系列独特正积分(基本上是排名)的优化算法,而不是解决这个特定问题。在这种情况下,我使用了一个简单的示例,以便很容易复制,但是我正在比较的两个数据集通常在行数和其他方面有所不同,我在这里没有详细说明......距离函数我' m 构建很好地处理了这个问题,因此了解如何使用 D2 将优化算法(例如下面建议的遗传算法)应用于上面的函数 f 是我目前的主要问题。