首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >两个数据集之间的相似性百分比

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

Stack Overflow用户
提问于 2017-06-09 15:24:52
回答 2查看 3.2K关注 0票数 0

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

我很难找到匹配数据集之间的相似性。我有一个主要的数据集,我想测试相同长度和相对时间序列的多个数据集,以找出在序列、日复一日的相似和差异、最接近的水平值等方面最接近的数据集。

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

代码语言:javascript
运行
复制
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,这在现实中并不是一个完美的匹配,因为数据点是不一样的,这就是为什么我知道我不是在寻找相关性。(每个数据集都是独立的)。

下面是两个时间序列列的示例,我试图找出相似性的百分比。

代码语言:javascript
运行
复制
     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)。

总的来说,我想根据它们的序列和值来计算相似性分数,同时考虑时间序列来假设这些列足够相似,是否匹配。

EN

回答 2

Stack Overflow用户

发布于 2017-06-09 23:25:07

正如评论中提到的,你真的需要认真考虑一下你所说的“相似”是什么意思,以及两者之间的相似性是什么。是n空间中的集合、向量还是点之间的关系?空间欧几里得,三角不等式应该保持吗?

对于阅读来说,指标可能是一个很好的起点,或者是一个稍微不同的角度,在贾卡德和类似的指数上。或者,您可以将问题看作是比较单词之间的相似之处,在这种情况下,您将考虑编辑距离

当涉及到R时,可以使用dist()生成距离矩阵。我冒昧地用几列展开了你的矩阵。

代码语言:javascript
运行
复制
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()在行之间进行比较,因此必须将原始矩阵转置。

代码语言:javascript
运行
复制
m.dist <- as.matrix(dist(t(m), method="euclidean"))

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

代码语言:javascript
运行
复制
m.dist[row(m.dist) == col(m.dist)+1]
# 2.645751 1.732051 2.236068 2.236068 3.464102

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

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-06-09 15:53:10

假设数据的形式是

代码语言:javascript
运行
复制
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

然后:

代码语言:javascript
运行
复制
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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44461534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档