1

我正在努力在 R 中实现 k-Means。

我从单个文件中计算出我的特征向量,并将它们全部放入一个我称之为“持有人”的袋子中:

holder[[filename]] <- c(featureVector)

如果我写的话,我可以恢复给定的特征向量:

holder[["file3453.txt"]]holder[[number]]

我将使用特征向量进行质心和其他一些计算,所以假设我有一个特征向量 V,我如何从持有者那里获取文件的名称?

这个问题也可以解释为:

给定值(特征向量)如何确定键(文件名)?

4

3 回答 3

2

扩展 nograpes 的解决方案。如果要构建反向映射,可以执行以下操作:

#this function converts a feature vector
#there may be other, better ways to do that, but this one is simple.
#it works best when your feature vectors are short and contain integers
#it may not work at all due to precision issues for real numbers
my.to.string = function(x) paste(x,collapse="_")  

在构建您的持有人向量时,请执行以下操作:

holder[[filename]] = featureVector   #updates the holder
reverseMap[[my.to.string(featureVector)]] = filename   # updates the reverse map

现在 - 完成你的任务就做

my.file = reverseMap[[my.to.string(my.feature)]]

这很简单,适用于简单的情况。它不能取代我还没有看到或需要 R 的真正的基于哈希码的数据结构。

于 2013-10-09T20:28:51.977 回答
2

但是为什么首先失去标签和向量之间的联系而需要反向查找呢?只要把它们放在一起,你就不会有这个问题:

library(data.table)

dt = data.table(filename = c('a', 'b'), feature = list(c(1,2,3), c(2,3,4)))
dt
#   filename feature
#1:        a   1,2,3
#2:        b   2,3,4

# possibly set the key to filename for fast access
setkey(dt, filename)
dt['a']    # this does a fast binary search lookup in data.tables

# modify the feature in some way for each filename:
dt[, feature := awesome_func(feature), by = filename]

# etc
于 2013-10-09T20:50:56.080 回答
1

您应该知道列表不是用 R 中的哈希表实现的。此外,没有有效的方法来做您想做的事情,您要么必须维护反向查找列表,要么只扫描匹配的索引。例如,

# Test data.
holder<-list(`file1`=c(1,0,1,0),`file2`=c(1,1,1,1),`file3`=c(1,0,1,0))
# Find this feature.
feature<-c(1,0,1,0)
# Find all indices that have this feature vector.
names(holder)[sapply(holder,function(x)all(x==feature))]
于 2013-10-09T20:17:22.563 回答