Emi*_*der 5 r distance similarity k-means 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
Run Code Online (Sandbox Code Playgroud)
这里有两件事 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 }
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
同样,我有兴趣计算 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
Run Code Online (Sandbox Code Playgroud)
我知道我可以用 4 个嵌套循环和列表来做到这一点。我想知道是否有更有效的方法来完成此任务。
与其他解决方案类似,但我认为您可以在应用于每个组合的函数内进行一些矩阵索引,以选择要相加的正确单元格:
请注意,默认?dist计算为:
sqrt(sum((x_i - y_i)^2))
Run Code Online (Sandbox Code Playgroud)
...当您使用时:
sum((x_i - y_i)^2)
Run Code Online (Sandbox Code Playgroud)
...所以我对下面的结果进行平方:
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 ...
Run Code Online (Sandbox Code Playgroud)
检查与手动计算的第一个期望结果:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2616 次 |
| 最近记录: |