Мы можем использовать технику масштабирования @WalterTross, сначала умножив каждый столбец на квадратный корень из соответствующего веса:
newdf <- sweep(df, 2, weighting, function(x,y) x * sqrt(y))
as.matrix(daisy(newdf, metric="euclidean"))
Но на всякий случай, если вы хотите иметь больше контроля и понимания того, что такое евклидово расстояние, мы можем написать специальную функцию. В качестве примечания я выбрал другой метод взвешивания. :
xpand <- function(d) do.call("expand.grid", rep(list(1:nrow(d)), 2))
euc_norm <- function(x) sqrt(sum(x^2))
euc_dist <- function(mat, weights=1) {
iter <- xpand(mat)
vec <- mapply(function(i,j) euc_norm(weights*(mat[i,] - mat[j,])),
iter[,1], iter[,2])
matrix(vec,nrow(mat), nrow(mat))
}
Мы можем проверить результат, проверив функцию daisy
:
#test1
as.matrix(daisy(df, metric="euclidean"))
# 1 2 3 4 5
# 1 0.000000 1.732051 4.898979 5.196152 6.000000
# 2 1.732051 0.000000 3.316625 3.464102 4.358899
# 3 4.898979 3.316625 0.000000 1.732051 3.464102
# 4 5.196152 3.464102 1.732051 0.000000 1.732051
# 5 6.000000 4.358899 3.464102 1.732051 0.000000
euc_dist(df)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0.000000 1.732051 4.898979 5.196152 6.000000
# [2,] 1.732051 0.000000 3.316625 3.464102 4.358899
# [3,] 4.898979 3.316625 0.000000 1.732051 3.464102
# [4,] 5.196152 3.464102 1.732051 0.000000 1.732051
# [5,] 6.000000 4.358899 3.464102 1.732051 0.000000
Причина, по которой я сомневаюсь в методе Уолтера, заключается в том, что, во-первых, я никогда не видел, чтобы веса применялись по их квадратному корню, обычно это 1/w
. Во-вторых, когда я применяю ваши веса к моей функции, я получаю другой результат.
euc_dist(df, weights=weighting)
person
Pierre L
schedule
31.08.2016
sweep(df, 1, weighting, function(x, y) x*sqrt(y))
- person Pierre L   schedule 31.08.2016