2012-10-03 151 views
0

我已經得到了所有情況之間的相似性矩陣,並且在單獨的數據框架中,這些情況的類。我想計算案例之間平均相似度同一類,這裏是一個例子n的J級方程式:快速計算鄰近矩陣中的平均鄰近度

Average proximity between cases

我們要計算所有的平方和n和所有病例之間的接近程度ķ來自與n相同的班級。鏈接:http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#outliers

我實現了2 for循環,但它真的很慢。 R有沒有更快的方法來做這樣的事情?

謝謝。

// DATA(dput)

數據幀與類:

structure(list(class = structure(c(1L, 2L, 2L, 1L, 3L, 3L, 1L, 
          1L, 2L, 3L), .Label = c("1", "2", "3", "5", "6", "7"), class = "factor")), .Names = "class", row.names = c(NA, 
      -10L), class = "data.frame") 

接近矩陣(m行和m列對應於類在數據幀的第m行以上):

structure(c(1, 0.60996875, 0.51775, 0.70571875, 0.581375, 0.42578125, 
0.6595, 0.7134375, 0.645375, 0.468875, 0.60996875, 1, 0.77021875, 
0.55171875, 0.540375, 0.53084375, 0.4943125, 0.462625, 0.7910625, 
0.56321875, 0.51775, 0.77021875, 1, 0.451375, 0.60353125, 0.62353125, 
0.5203125, 0.43934375, 0.6909375, 0.57159375, 0.70571875, 0.55171875, 
0.451375, 1, 0.69196875, 0.59390625, 0.660375, 0.76834375, 0.606875, 
0.65834375, 0.581375, 0.540375, 0.60353125, 0.69196875, 1, 0.7194375, 
0.684, 0.68090625, 0.50553125, 0.60234375, 0.42578125, 0.53084375, 
0.62353125, 0.59390625, 0.7194375, 1, 0.53665625, 0.553125, 0.513, 
0.801625, 0.6595, 0.4943125, 0.5203125, 0.660375, 0.684, 0.53665625, 
1, 0.8456875, 0.52878125, 0.65303125, 0.7134375, 0.462625, 0.43934375, 
0.76834375, 0.68090625, 0.553125, 0.8456875, 1, 0.503, 0.6215, 
0.645375, 0.7910625, 0.6909375, 0.606875, 0.50553125, 0.513, 
0.52878125, 0.503, 1, 0.60653125, 0.468875, 0.56321875, 0.57159375, 
0.65834375, 0.60234375, 0.801625, 0.65303125, 0.6215, 0.60653125, 
1), .Dim = c(10L, 10L)) 

正確結果:

c(2.44197227050781, 2.21901680175781, 2.07063155175781, 2.52448621289062, 
1.88040830957031, 2.16019295703125, 2.58622273828125, 2.81453253222656, 
2.1031745078125, 2.00542063378906) 

回答

1

應該可以。你的符號沒有說明我們是否會在行或列中找到類的成員,所以這個答案在列中假設,但如果它們在行中,那麼明顯的修改也會起作用。

colSums(mat^2)) # in R this is element-wise application of ^2 rather than matrix multiplication. 

由於兩個操作都是向量化的,因此預計它將比for循環快得多。

隨着修改和假設矩陣被命名爲「墊子」,並命名爲「cldf」類非數據幀:

sapply(1:nrow(mat) , 
      function(r) sum(mat[r, cldf[['class']][r] == cldf[['class']] ]^2) ) 
[1] 2.441972 2.219017 2.070632 2.524486 1.880408 2.160193 2.586223 2.814533 2.103175 2.005421 

+0

的問題是,我們不能告訴哪些示例來自矩陣中的同一類。我們必須從數據框中查找它。 –

+0

在這種情況下,您發佈代表性示例和「正確答案」的方式已逾期。 –

+0

我想我可以修改矩陣(或爲每個類使用矩陣的一些子集)並使用您的答案。我會試着看看它有多快。謝謝你的幫助。 –