如何找到两个数据集之间的相似性(非相关性)?
我无法找到匹配数据集之间的相似性。我有一个主数据集,我想测试相同长度和相对时间序列的多个数据集,以找出哪个是最接近的序列匹配,日常相似性和差异,水平最近值等等。
我知道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))。
总的来说,我想根据它们的序列和值来计算相似度得分,同时考虑保持时间序列,以假设这些列相似或不匹配。
答案 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