两个数据集之间的相似性百分比

时间:2017-06-09 15:24:52

标签: r

如何找到两个数据集之间的相似性(非相关性)?

我无法找到匹配数据集之间的相似性。我有一个主数据集,我想测试相同长度和相对时间序列的多个数据集,以找出哪个是最接近的序列匹配,日常相似性和差异,水平最近值等等。

我知道Pearson R不正确,因为如果值从x1增加1到x2,例如:

Day x1 x2 
 1   8  9
 2   7  8
 3   6  7
 4   6  7
 5   7  8
 6   5  6
 7   5  6

我得到的R相关系数为1.实际上它们不是完美的匹配,因为数据点不一样,这就是为什么我知道我不是在寻找相关性。 (每个数据集都是独立的)。

以下是我试图找到相似百分比的两个时间序列列的示例。

     Day   x1 x2 
      1     8  7
      2     7  7
      3     6  6
      4     6  5
      5     7  6
      6     5  6
      7     5  5

如何计算各种属性的相似度,例如每天(第1天,第8天到第7天)x1和x2之间的差异以及(x1,第1天和第2天(8-7)之间的差异和( x2,第1天和第2天(7-7))。

总的来说,我想根据它们的序列和值来计算相似度得分,同时考虑保持时间序列,以假设这些列相似或不匹配。

2 个答案:

答案 0 :(得分:0)

假设数据采用

的形式
dt<-data.table(Day=seq(1:7),x1=sample(7,replace = F),x2=sample(7,replace=F))
>dt
  Day x1 x2
1:   1  5  4
2:   2  7  5
3:   3  4  7
4:   4  1  1
5:   5  3  2
6:   6  2  6
7:   7  6  3

然后:

dt[,.(std=sd(c(x1,x2))),by=1:nrow(dt)]

   nrow       std
1:    1 0.7071068
2:    2 1.4142136
3:    3 2.1213203
4:    4 0.0000000
5:    5 0.7071068
6:    6 2.8284271
7:    7 2.1213203

计算每天的标准。 如果给出相似性函数,那么我们可以执行每对动作。

答案 1 :(得分:0)

正如评论中所提到的,你真的需要认真考虑一下你所说的“相似性”。以及它们之间的相似之处。它是在n空间中的集合,向量还是点之间?如果triangle inequality成立,那空间是否为欧几里德?

对于阅读来说,Metrics可能是一个很好的起点,或者是Jaccard和类似指数上稍微不同的角度。或者,您可以将问题视为比较单词之间的相似性,在这种情况下,您正在考虑edit distance

对于R,可以使用dist()制作距离矩阵。我冒昧地用几列扩展你的矩阵。

m <- as.matrix(read.table(text="
  x1 x2 x3 x4 x5 x6
   8  9  8  8  7  5
   7  8  8  8  8  6
   6  7  7  8  9  8
   6  7  6  5  4  4
   7  8  8  9  8  7
   5  6  7  6  5  6
   5  6  6  5  5  4", header=TRUE))

dist()比较各行,因此原始矩阵必须进行转置。

m.dist <- as.matrix(dist(t(m), method="euclidean"))

如果你只对相邻列之间的相似性感兴趣,可以像这样提取相关的对角线

m.dist[row(m.dist) == col(m.dist)+1]
# 2.645751 1.732051 2.236068 2.236068 3.464102

虽然dist()提供了很好的距离方法选择,但如果您想尝试其他相异方法,可以在包vegdist()中的vegan中找到许多相似方法。 F.ex

m.diss <- as.matrix(vegdist(t(m), method="jaccard"))
m.diss[row(m.diss) == col(m.diss)+1]
# 0.13725490 0.05769231 0.09615385 0.10000000 0.17021277