我正在计算两个特征向量之间的余弦相似度,并想知道是否有人可能对下面的分类特征问题有一个简洁的解决方案。
目前我有(例子):
# define the similarity function
cosineSim <- function(x){
as.matrix(x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2)))))
}
# define some feature vectors
A <- c(1,1,0,0.5)
B <- c(1,1,0,0.5)
C <- c(1,1,0,1.2)
D <- c(1,0,0,0.7)
dataTest <- data.frame(A,B,C,D)
dataTest <- data.frame(t(dataTest))
dataMatrix <- as.matrix(dataTest)
# get similarity matrix
cosineSim(dataMatrix)
工作正常。
但是我想要添加一个分类变量(例如city)来生成一个功能,当两个城市相等时,该功能为1,另一个则为0。
在这种情况下,示例特征向量将是:
A <- c(1,1,0,0.5,"Dublin")
B <- c(1,1,0,0.5,"London")
C <- c(1,1,0,1.2,"Dublin")
D <- c(1,0,0,0.7,"New York")
我想知道是否有一种巧妙的方法可以在函数内动态生成最后一个特征的成对等式,从而使其成为矢量化实现?
我已经尝试过预处理来为每个类别制作二进制标志,以便上面的例子会变成:
A <- c(1,1,0,0.5,1,0,0)
B <- c(1,1,0,0.5,0,1,0)
C <- c(1,1,0,1.2,1,0,0)
D <- c(1,0,0,0.7,0,0,1)
这有效,但问题是它意味着我必须预先处理每个变量,在某些情况下我可以看到类别的数量变得非常大。当我想要的只是产生一个为相等而返回1的特征时,这似乎相当昂贵/效率低,否则为0(在这里授予复杂性,因为它本质上是一个依赖于两个记录并在它们之间共享的特征)。
我能看到的一个解决方案就是编写一个循环来构建每对特征向量(我可以构建一个特征,如[is_same_city] = 1/0,并且当我们有相等性时为每个向量设置为1)否则)然后得到距离 - 但是当我尝试扩展时,这种方法会杀了我。
我希望我的R技能不够发达,并且有一个简洁的解决方案可以打开大部分方块......
非常欢迎任何建议,谢谢