我有一个矩阵,包括100行和10列,在这里我想比较行之间的差异并对它们进行排序。然后,我想从中选择10个最大相异度行,我可以使用哪种方法?
set.seed(123)
mat <- matrix(runif(100 * 10), nrow = 100, ncol = 10)
我的初始方法是计算两行之间的相似度(例如,说tanimoto系数或其他:http://en.wikipedia.org/wiki/Jaccard_index),并且异化= 1 - 相似性,然后比较异化值。最后,我将对所有不相似度值进行排序,并选择10个最大相异度值。但似乎结果是100 * 100矩阵,如果存在大量行,则可能需要有效的方法来进行此类计算。然而,这只是我的想法,也许不对,所以我需要帮助。
[更新] 寻找一些文献后。我找到了最大相异度方法的一个定义。
最大相异度方法:首先将数据记录随机选择为第一个聚类中心。选择距离第一点最远的记录作为下一个聚类中心。之后选择最远离两个当前点的记录。该过程会重复进行,直到有足够数量的集群中心。
在我的问题中,足够的数字应为10。
感谢。
答案 0 :(得分:1)
首先,雅加德指数不适合您。来自维基百科页面
Jaccard系数测量有限样本集之间的相似性......
你的矩阵有漂浮样本,所以你有一个不同的问题(注意有问题的索引是根据交叉点定义的;那里应该是一个红旗: - )。
所以,你必须通过不相似来决定你的意思。一种自然的解释是,如果行A与数据集的质心具有更大的欧几里德距离,那么行A与数据集的不同于行B.您可以将数据集的质心视为您获得的向量,取每个列的平均值并将它们放在一起(apply(mat, 2, mean)
)。
通过这个,你可以将每一行的距离取到那个中心向量,然后得到这些距离的排序。从那里你可以回到原始矩阵所需的行。
所有在一起:
center <- apply(mat, 2, mean)
# not quite the distances, actually, but their squares. That will work fine for us though, since the order
# will still be the same
dists <- apply(mat, 1, function(row) sum((row - center) ** 2))
# this gives us the row indices in order of least to greaest dissimiliarity
dist.order <- order(dists)
# Now we just grab the 10 most dissimilar of those
most.dissimilar.ids <- dist.order[91:100]
# and use them to get the corresponding rows of the matrix
most.dissimilar <- mat[most.dissimilar.ids,]
如果我实际上是在写这个,我可能会将最后三行压缩为most.dissimilar <- mat[order(dists)[91:100],]
,但希望将它分解为这样可以让它更容易看出发生了什么。
当然,如果距离质心的距离作为在你的语境中思考“不相似性”的最佳方式没有意义,那么你将不得不修改一些有用的东西。