R

时间:2018-09-11 12:45:31

标签: r cluster-analysis

我已使用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的初学者,不知道如何解决这个问题。

1 个答案:

答案 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

只要离群值和聚类的数量合理,就应该具有良好的性能。