如何找到两个数据集之间的相似性(而不是相关性)?
我很难找到匹配数据集之间的相似性。我有一个主要的数据集,我想测试相同长度和相对时间序列的多个数据集,以找出在序列、日复一日的相似和差异、最接近的水平值等方面最接近的数据集。
我知道Pearson是不正确的,因为如果值从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
如何计算它们在各种属性上的相似性,如x1和x2在每一天(第1、8至7天)的方差以及(x1,第1天和第2天(8-7)和(x2,第1和第2天)之间的差异(7- 7)。
总的来说,我想根据它们的序列和值来计算相似性分数,同时考虑时间序列来假设这些列足够相似,是否匹配。
发布于 2017-06-09 23:25:07
正如评论中提到的,你真的需要认真考虑一下你所说的“相似”是什么意思,以及两者之间的相似性是什么。是n空间中的集合、向量还是点之间的关系?空间欧几里得,三角不等式应该保持吗?
对于阅读来说,指标可能是一个很好的起点,或者是一个稍微不同的角度,在贾卡德和类似的指数上。或者,您可以将问题看作是比较单词之间的相似之处,在这种情况下,您将考虑编辑距离。
当涉及到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()
提供了很好的距离方法的选择,但是如果您想尝试其他不同的方法,可以在包vegan
中的vegdist()
中找到许多方法。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
发布于 2017-06-09 15:53:10
假设数据的形式是
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
每天计算性病。如果给出一个相似函数,那么我们可以执行每对动作。
https://stackoverflow.com/questions/44461534
复制相似问题