r 行间距离

标签 r distance k-means similarity euclidean-distance

我很抱歉,这是我在先前的一次灾难性尝试之后自我救赎的尝试。现在我有了更清晰的认识。所以我又来了。

我的目标是找到相似的行。所以首先我对计算行之间的距离感兴趣。这是下面的测试数据集。

 Row            Blood   x1    x2    x3    x4
 1              A       0.01  0.16  0.31  0.46
 2              A       0.02  0.17  0.32  0.47
 3              A       0.03  0.18  0.33  0.48

 4              B       0.05  0.20  0.35  0.49
 5              B       0.06  0.21  0.36  0.50
 6              B       0.07  0.22  0.37  0.51

 7              AB      0.09  0.24  0.39  0.52
 8              AB      0.1   0.25  0.4   0.53
 9              AB      0.11  0.26  0.41  0.54

 10             O       0.13  0.28  0.43  0.55
 11             O       0.14  0.29  0.44  0.56
 12             O       0.15  0.3   0.45  0.57

这里有两件事 1) 距离 2) 行

考虑这个行组合。

对于 Row(1-4-7-10) ,距离
D = (d1,4 + d1,7 + d1,10 + d4,7 + d4,10 + d7,10)/6
{ Row1-Blood A, Row1-Blood B, Row1- Blood AB, Row1- Blood O } 

Row{1,4,7,10} 之间的距离就是基于这个概念计算的
d1,4  = Distance between : Row1-Blood A, Row1-Blood B  
d1,7  = Distance between : Row1-Blood A, Row1-Blood AB  
d1,10 = Distance between : Row1-Blood A, Row1-Blood O       
d4,7  = Distance between : Row1-Blood B, Row1-Blood AB  
d4,10 = Distance between : Row1-Blood B, Row1-Blood O     
d7,10 = Distance between : Row1-Blood AB, Row1-Blood O     

d-1-4   = (0.01-0.05)^2 + (0.16-0.20)^2 + (0.31-0.35)^2 +  (0.46-0.49)^2             
d-1-7   = (0.01-0.09)^2 + (0.16-0.24)^2 + (0.31-0.39)^2 +  (0.46-0.52)^2             
d-1-10  = (0.01-0.13)^2 + (0.16-0.28)^2 + (0.31-0.43)^2 +  (0.46-0.55)^2             
d-4-7   = (0.05-0.09)^2 + (0.20-0.24)^2 + (0.35-0.39)^2 +  (0.49-0.52)^2   
d-4-10  = (0.05-0.13)^2 + (0.20-0.28)^2 + (0.35-0.43)^2 +  (0.49-0.55)^2     
d-7-10  = (0.09-0.13)^2 + (0.24-0.30)^2 + (0.39-0.43)^2 +  (0.52-0.55)^2  

同样,我对计算 81 个不同行组合 (3*3*3*3) 之间的距离感兴趣。

最终的预期数据集应如下所示。
 Row         Distance
 1-4-7-10
 1-4-7-11     
 1-4-7-12

 1-4-8-10          
 1-4-8-11          
 1-4-8-12

 1-4-9-10                    
 1-4-9-11                    
 1-4-9-12

 1-5-7-10
 1-5-7-11     
 1-5-7-12

 1-5-8-10          
 1-5-8-11          
 1-5-8-12

 1-5-9-10                    
 1-5-9-11                    
 1-5-9-12  

 1-6-7-10
 .
 .
 .
 3-6-9-12

我知道我可以用 4 个嵌套循环和列表来做到这一点。我想知道是否有更有效的方法来实现这一点。

最佳答案

与其他解决方案类似,但我认为您可以在应用于每个组合的函数内进行一些矩阵索引,以选择要加起来的正确单元格:

请注意,默认 ?dist计算为:

sqrt(sum((x_i - y_i)^2))

...在您使用时:
sum((x_i - y_i)^2)

...所以我对下面的结果进行平方:
dd <- as.matrix(dist(dat[-(1:2)]))^2

apply(
  expand.grid(split(dat$Row, dat$Blood)),
  1,
  function(x) sum(dd[t(combn(x,2))])
)
#  [1] 0.1140 0.0972 0.0828 0.1212 0.1036 0.0884 0.1308 ...

检查与手动计算第一个所需结果:
L <- c(
d1_4   = (0.01-0.05)^2 + (0.16-0.20)^2 + (0.31-0.35)^2 +  (0.46-0.49)^2,           
d1_7   = (0.01-0.09)^2 + (0.16-0.24)^2 + (0.31-0.39)^2 +  (0.46-0.52)^2,             
d1_10  = (0.01-0.13)^2 + (0.16-0.28)^2 + (0.31-0.43)^2 +  (0.46-0.55)^2,             
d4_7   = (0.05-0.09)^2 + (0.20-0.24)^2 + (0.35-0.39)^2 +  (0.49-0.52)^2,   
d4_10  = (0.05-0.13)^2 + (0.20-0.28)^2 + (0.35-0.43)^2 +  (0.49-0.55)^2,     
d7_10  = (0.09-0.13)^2 + (0.24-0.28)^2 + (0.39-0.43)^2 +  (0.52-0.55)^2
)
sum(L)
# 0.114

关于r 行间距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55960703/

相关文章:

ios - 如何在 ios 中的 Google map 上显示特定路线的实时交通数据

algorithm - 如何在 MATLAB 中表示簇?

r - 为 data.table 对象编写函数(过程)

r - R中根据文件名定义文件路径

r - 将多个 plotly 图下载到 PDF Shiny

java - 从一分钟内获得的一组经度和纬度值计算速度?

cluster-analysis - 结合不同的相似性来构建一个最终的相似性

python - Python 中的 scipy kmeans 和 kmeans2 聚类问题

algorithm - K 表示 MATLAB 中的聚类 - 输出图像

r - S3 通用,用于 Tibbles、Data.Frames、矩阵等列表