我正在计算两个特征向量之间的余弦相似度,并想知道是否有人可以巧妙地解决以下关于分类特征的问题。
目前我有(示例):
# 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)
效果很好。
但是假设我想添加一个分类变量,例如城市,以生成一个特征,当两个城市相等时为 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,否则为 0)和然后获得距离-但是当我尝试扩展时,这种方法会杀死我。
我希望我的 R 技能还不够完善,并且有一个巧妙的解决方案可以满足大多数情况...
任何建议都非常欢迎,谢谢