思路:首先,通过K-means算法将数据点划分为成若K个簇;然后计算每一个数据对象到最近簇的中心距离,来与离群点设置的阈值进行比较,以此来判别该数据对象是否是离群点。
1.读取数据
data<- read.csv(read_file,header = T)
2.K-meas聚类
# 设置聚类数 center_num <- 5 # 调用kmeans km <- kmeans(data,center_num)
3.计算各样本数据到最近中心的距离(nrow=189261是样本记录个数,根据实际情况进行设置)
#各样本欧式距离 for(i in 1:center_num){ distance <- data.frame(sqrt(rowSums((new_data-matrix(km$centers[i,],nrow=189261,ncol=center_num,byrow=T))^2))) }
#欧氏距离最小值
y=apply(distance,1,min)
4.绘制离群点图
# 设置阈值为2.5 y_lable <- 2.5 sub=which(y>y_lable) y1=y[-sub] y2=y[sub] plot(1:length(y),y,xlim=c(0,length(y)),xlab=paste("样本点","(dist=",y_lable,")",sep=""),ylab="欧氏距离",col="blue") points(which(y>y_lable),y2,pch=19,col="red") dev.off()