2016-08-30 143 views
3

我想創建一個距離數據框的加權歐氏距離的距離矩陣。權重將在向量中定義。這裏有一個例子:R中的加權歐幾里德距離

library("cluster") 

a <- c(1,2,3,4,5) 
b <- c(5,4,3,2,1) 
c <- c(5,4,1,2,3) 
df <- data.frame(a,b,c) 

weighting <- c(1, 2, 3) 

dm <- as.matrix(daisy(df, metric = "euclidean", weights = weighting)) 

我搜索無處不在,聲稱支持加權不能「集羣」包內發現河的「菊花」功能的軟件包或解決方案,這一點,但權重唐似乎沒有被應用,它只是吐出常規的歐幾里得。距離。

任何想法堆棧溢出?

newdf <- sweep(df, 2, weighting, function(x,y) x * sqrt(y)) 
as.matrix(daisy(newdf, metric="euclidean")) 

但是爲了以防萬一,你想有更多的控制和了解:

+0

https://stat.ethz.ch/R-manual/R-devel/library/cluster/html/daisy.html 我可能搞錯了,其實。該文件似乎表示,權重只適用於高爾距離。儘管如此,我的問題仍然存在:是否有支持加權歐幾里德距離的包? – Gary866

+0

我認爲你需要顯示「加權距離」的公式。 –

+0

http://images.slideplayer.com/16/5203007/slides/slide_49.jpg 所以在這個例子中(我已經糾正),如果我們想要第1行和第2行之間的距離,它會計算爲: 距離= 1 *(1-2)^ 2 + 2 *(5-4)^ 2 + 3 *(5-4)^ 2 距離計算應用於大數據集,變量和權重在每次運行中都會有所不同。所以它不是簡單的(或者至少超出我的技能水平)寫我自己的功能,因此我在尋找一個軟件包。 – Gary866

回答

3

我們可以通過其各自的重量的平方根第一每一列乘以使用縮放@WalterTross'技術歐幾里德距離是什麼,我們可以寫一個自定義函數。作爲說明,我選擇了不同的加權方法。 :

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 

我懷疑Walter的方法,是因爲應用通過它們的平方根首先,我從來沒有見過的權重的原因,它是通常爲1/w。其次,當我將權重應用於我的功能時,我會得到不同的結果。

euc_dist(df, weights=weighting) 
+0

有多種加權方式。我會用'w'縮放每一個軸來放置'w'倍的重量。對曼哈頓而言,這顯然會產生預期的效果。歐幾里得佔據了方塊,但是誰說它沒有做'(w *(x_i-y_i))^ 2'?對我而言,這似乎是最令人驚訝的加權方案。 –

+0

@ Anony-Mousse你是對的,我也會通過它的重量而不是其平方根來縮放每個軸。歐幾里德距離是平方三角形之和的平方根,所以事實上,OP在他們的問題的評論中使用了距離的錯誤定義。我堅持這一點,這讓我引入權重的平方根,但這是一個壞主意。 –

+0

如果只需要進行比較,那麼歐氏距離的平方(三角形的平方和)當然很有用,因爲它節省了計算量大的平方根提取步驟,但權重應該在標準歐幾里德度量中保持定義。 BTW歐幾里德曼和曼哈頓距離在所有維度上的增量相等時都是相等的,但其中一個爲零。 –

相關問題