我正在尝试在R中实现AVF算法以检测分类数据中的异常值(A. Koufakou,E.G. Ortiz等http://www.enriquegortiz.com/publications/outlierDetection_ictai07.pdf)。
我的数据集大约有500,000行,13个变量(全部为分类变量)。
伪代码非常简单:
为了获取每个属性值的频率,我使用了
伪代码非常简单:
# Label all data points as non-outliers
# calculate frequency of each attribute value
# foreach point x
# AVFscore = Sum(frequency each attrib. value in x)/num.attribs
# end foreach
# return top k outliers with minimum AVFscore
为了获取每个属性值的频率,我使用了
freq_matrix <- apply(mydata, MARGIN = 2, FUN = count) # from plyr
这给了我一个数据框列表,每个变量都有一个数据框,其中包含每个变量的频率。到目前为止还不错。
我卡在如何迭代每一行并获取“AVFscore”上 - 我确定我需要使用apply(),但无法理解它应该如何工作。基本上,对于每一行,我需要查找freq_matrix中每个值的频率并将它们相加,然后除以变量数量(即13)。
例如:
Country_cde Flag1 Flag2 Score
IE A X 9/13
IE B X 7/13
US A X 8/13
US A Y 6/13
IE C Z 5/13
我知道country_cde的IE频率为3,US为2。对于Flag1,A为3,B为1,C为1等。 在这个例子中,最后一行得分最低,因此很可能是异常值。