FCM算法是将模糊理论结合HCM算法改进的聚类算法,核心思想是将HCM算法中{0,1}判定矩阵用(0,1]隶属度矩阵代替,输出的是一个聚类中心与一个隶属度矩阵。下面奉上FCM算法的R实现:
- #数据提取与预处理
- dataRsum<-function(dataset){
- data<-dataset[,c("姓名",label1,label2,label3)]
- for (i in c(label1,label2,label3)){
- data[,i]<-(as.numeric(data[,i])-mean(as.numeric(data[,i])))/sd(as.numeric(data[,i]))
- }
- return(data)
- }
- #初始化隶属函数
- setBelong_matrix<-function(centernumber,dataset){
- c<-centernumber
- center_belong_matrix<-matrix(0,c,length(dataset[,1])) ###设置隶属度矩阵格式
- for (i in 1:length(dataset[,1])){
- for(j in 1:c){
- center_belong_matrix[j,i]<-t(runif(1,min=0,max=1))
- }
- center_belong_matrix[,i]<-center_belong_matrix[,i]/sum(center_belong_matrix[,i])
- }
- return(center_belong_matrix)
- }
- #计算聚类中心(输入一个隶属度矩阵,返回聚类中心)
- calCluster<-function(power,cbmatrix,dataset){
- m<-power
- x<-dataRsum(dataset)
- u<-cbmatrix
- clusterCenter<-matrix(0,length(cbmatrix[,1]),3)#设置聚类中心格式
- for(k in 1:3){
- for(i in 1:length(cbmatrix[,1])){
- clusterCenter[i,k]<-sum(((u[i,])^m)*as.numeric(x[,k+1]))/sum((u[i,])^m)
- }
- }
- colnames(clusterCenter)<-c(label1,label2,label3)
- return(clusterCenter)
- }
- ####用法:calCluster(2,setBelong_matrix(3,dataSet),dataSet)
- #计算隶属度矩阵(输入一个聚类中心,返回一个隶属度矩阵)
- calCBmatrix<-function(power,clustercenter,dataset){
- m<-power
- x<-dataRsum(dataset)[,2:4]
- c<-length(clustercenter[,1])
- distance<-matrix(0,length(clustercenter[,1]),length(x[,1]))##设置距离矩阵格式
- for(i in 1:length(clustercenter[,1])){
- distance[i,]<-sqrt(rowSums((t(clustercenter[i,]-t(x)))^2))
- }####计算欧式距离
- d<-distance
- u<-matrix(0,c,length(dataset[,1])) ###设置隶属度矩阵格式
- for(i in 1:c){
- for(j in 1:length(x[,1])){
- u[i,j]<-(sum((d[i,j]/d[,j])^(2/(m-1))))^(-1)
- }
- }
- center_belong_matrix<-u
- return(center_belong_matrix)
- }
- ##计算价值函数
- calvaluef<-function(power,cbmatrix,clustercenter,dataset){
- m<-power
- x<-dataRsum(dataset)[,2:4]
- distance<-matrix(0,length(clustercenter[,1]),length(x[,1]))##设置距离矩阵格式
- for(i in 1:length(clustercenter[,1])){
- distance[i,]<-sqrt(rowSums((t(clustercenter[i,]-t(x)))^2))
- }####计算欧式距离
- j<-sum((cbmatrix^m)*distance^2)
- return(j)
- }
- ######执行代码
- k<-10
- cbmatrix<-setBelong_matrix(k,dataSet)####初始化隶属矩阵
- clustercenter<-calCluster(k,cbmatrix,dataSet)###获得初始聚类中心
- #diedai()
- n<-2
- for(i in 1:100){
- cbmatrix<-calCBmatrix(n,clustercenter,dataSet)
- clustercenter<-calCluster(n,cbmatrix,dataSet)
- print(calvaluef(n,cbmatrix,clustercenter,dataSet))
- }
- for(k in 2:20){
- cbmatrix<-setBelong_matrix(k,dataSet)####初始化隶属矩阵
- clustercenter<-calCluster(k,cbmatrix,dataSet)###获得初始聚类中心
- for(i in 1:100){
- cbmatrix<-calCBmatrix(n,clustercenter,dataSet)
- clustercenter<-calCluster(n,cbmatrix,dataSet)
- }
- print(calvaluef(n,cbmatrix,clustercenter,dataSet))
- }


雷达卡



京公网安备 11010802022788号







