gpt4 book ai didi

r - R 中的属性值频率(分类变量中的异常值)

转载 作者:行者123 更新时间:2023-12-02 05:29:02 27 4
gpt4 key购买 nike

我正在尝试在 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,等等。在此示例中,最后一行得分最低,因此可能是异常值。

最佳答案

基础 R 方法:

mydata <- read.table(text="Country_cde    Flag1     Flag2
IE A X
IE B X
US A X
US A Y
IE C Z",header=T,stringsAsFactors=F)

freq_matrix <- table( unlist( unname(mydata) ) ) # Other way to count the occurrences

mydata[,"Score"] <- apply( mydata,1, function(x) { paste0( sum(freq_matrix[x]) ,"/", length(x) )}) # Do the sum, paste with number of cols (should be computed outside to avoid cache miss)

输出:

> mydata
Country_cde Flag1 Flag2 Score
1 IE A X 9/3
2 IE B X 7/3
3 US A X 8/3
4 US A Y 6/3
5 IE C Z 5/3

如果您想要实际的除法值,请像这样删除paste0:

mydata[,"Score"] <- apply(mydata,1,function(x) { sum(freq_matrix[x]) / length(x) })

关于r - R 中的属性值频率(分类变量中的异常值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32459197/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com