我已使用R(基于kmeans)构建了聚类模型,并希望通过找出离群值与聚类中心之间的最小距离来对离群值进行分类。我要使用的数据框如下所示:
DF_OUTLIERS
[Product] [Sales] [Usage]
1 100 1000
2 200 2000
3 300 3000
4 200 4000
5 100 5000
DF_CLUSTER
[Cluster] [Center_Sales] [Center_Usage]
1 120 1500
2 220 2400
3 150 3900
4 140 4900
目标表应如下所示:
[Product] [Sales] [Usage] [Cluster]
1 100 1000 ???
2 200 2000 ???
3 300 3000 ???
4 200 4000 ???
5 100 5000 ???
要计算距离,我想使用欧几里得距离的标准公式:
sqrt((Sales - Center_Sales)^2 + (Usage - Center_Usage)^2))
我最大的问题是开发一个函数,该函数查找每行中所有簇的最小值,而无需为目标df中的每个簇添加新列。我想对于一个经验丰富的程序员来说,这是一件容易的事,但是我绝对是R的初学者,不知道如何解决这个问题。
答案 0 :(得分:0)
有一个方便的which.min
函数,在这种情况下很有用。
outliers<-read.table(header=TRUE, text="Product Sales Usage
1 100 1000
2 200 2000
3 300 3000
4 200 4000
5 100 5000")
clusters<-read.table(header=TRUE, text="Cluster Center_Sales Center_Usage
1 120 1500
2 220 2400
3 150 3900
4 140 4900")
answer<-sapply(1:nrow(outliers), function(x) {
#find the distance for the outlier to every cluster
distance<-sqrt((outliers$Sales[x] - clusters$Center_Sales)^2 +
(outliers$Usage[x] - clusters$Center_Usage)^2)
#find the index of the shortest distance and return
which.min(distance)
})
answer
#[1] 1 2 2 3 4
outliers$cluster<-answer
只要离群值和聚类的数量合理,就应该具有良好的性能。