楼主: 乐文义
3081 0

[程序分享] FCM软聚类算法的R语言实现 [推广有奖]

  • 1关注
  • 1粉丝

大专生

98%

还不是VIP/贵宾

-

威望
0
论坛币
55 个
通用积分
2.1441
学术水平
2 点
热心指数
4 点
信用等级
2 点
经验
460 点
帖子
24
精华
0
在线时间
108 小时
注册时间
2017-1-15
最后登录
2020-6-22

楼主
乐文义 发表于 2018-2-7 11:43:01 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
关于FCM算法:
     FCM算法是将模糊理论结合HCM算法改进的聚类算法,核心思想是将HCM算法中{0,1}判定矩阵用(0,1]隶属度矩阵代替,输出的是一个聚类中心与一个隶属度矩阵。下面奉上FCM算法的R实现:
  1. #数据提取与预处理
  2. dataRsum<-function(dataset){
  3.     data<-dataset[,c("姓名",label1,label2,label3)]
  4.     for (i in c(label1,label2,label3)){
  5.         data[,i]<-(as.numeric(data[,i])-mean(as.numeric(data[,i])))/sd(as.numeric(data[,i]))
  6.     }
  7.     return(data)
  8. }
复制代码
数据处理部分是抽取自己需要的label并进行中心标准化,需要注意的是提取的label只能是数值型数据,对于含有非数值型的数据的FCM实现将在之后给出。
  1. #初始化隶属函数
  2. setBelong_matrix<-function(centernumber,dataset){
  3. c<-centernumber
  4. center_belong_matrix<-matrix(0,c,length(dataset[,1]))  ###设置隶属度矩阵格式
  5. for (i in 1:length(dataset[,1])){
  6. for(j in 1:c){
  7. center_belong_matrix[j,i]<-t(runif(1,min=0,max=1))
  8. }
  9. center_belong_matrix[,i]<-center_belong_matrix[,i]/sum(center_belong_matrix[,i])
  10. }
  11. return(center_belong_matrix)
  12. }

  13. #计算聚类中心(输入一个隶属度矩阵,返回聚类中心)
  14. calCluster<-function(power,cbmatrix,dataset){
  15. m<-power
  16. x<-dataRsum(dataset)
  17. u<-cbmatrix
  18. clusterCenter<-matrix(0,length(cbmatrix[,1]),3)#设置聚类中心格式
  19. for(k in 1:3){
  20. for(i in 1:length(cbmatrix[,1])){
  21.   clusterCenter[i,k]<-sum(((u[i,])^m)*as.numeric(x[,k+1]))/sum((u[i,])^m)
  22. }
  23. }
  24. colnames(clusterCenter)<-c(label1,label2,label3)
  25. return(clusterCenter)
  26. }
  27. ####用法:calCluster(2,setBelong_matrix(3,dataSet),dataSet)

  28. #计算隶属度矩阵(输入一个聚类中心,返回一个隶属度矩阵)
  29. calCBmatrix<-function(power,clustercenter,dataset){
  30. m<-power
  31. x<-dataRsum(dataset)[,2:4]
  32. c<-length(clustercenter[,1])
  33. distance<-matrix(0,length(clustercenter[,1]),length(x[,1]))##设置距离矩阵格式
  34. for(i in 1:length(clustercenter[,1])){
  35.   distance[i,]<-sqrt(rowSums((t(clustercenter[i,]-t(x)))^2))
  36. }####计算欧式距离
  37. d<-distance
  38. u<-matrix(0,c,length(dataset[,1]))  ###设置隶属度矩阵格式
  39. for(i in 1:c){
  40.   for(j in 1:length(x[,1])){
  41.      u[i,j]<-(sum((d[i,j]/d[,j])^(2/(m-1))))^(-1)
  42.         }
  43. }
  44. center_belong_matrix<-u
  45. return(center_belong_matrix)
  46. }

  47. ##计算价值函数
  48. calvaluef<-function(power,cbmatrix,clustercenter,dataset){
  49. m<-power
  50. x<-dataRsum(dataset)[,2:4]
  51. distance<-matrix(0,length(clustercenter[,1]),length(x[,1]))##设置距离矩阵格式
  52. for(i in 1:length(clustercenter[,1])){
  53.     distance[i,]<-sqrt(rowSums((t(clustercenter[i,]-t(x)))^2))
  54. }####计算欧式距离
  55. j<-sum((cbmatrix^m)*distance^2)
  56. return(j)
  57. }
复制代码
  1. ######执行代码
  2. k<-10
  3. cbmatrix<-setBelong_matrix(k,dataSet)####初始化隶属矩阵
  4. clustercenter<-calCluster(k,cbmatrix,dataSet)###获得初始聚类中心
  5. #diedai()
  6. n<-2
  7. for(i in 1:100){
  8. cbmatrix<-calCBmatrix(n,clustercenter,dataSet)
  9. clustercenter<-calCluster(n,cbmatrix,dataSet)
  10. print(calvaluef(n,cbmatrix,clustercenter,dataSet))
  11. }
复制代码
因为FCM非常依赖初始选取的聚类数,因此可以通过测试找到最合适的聚类数K,使得价值函数的下降效果最佳:
  1. for(k in 2:20){
  2. cbmatrix<-setBelong_matrix(k,dataSet)####初始化隶属矩阵
  3. clustercenter<-calCluster(k,cbmatrix,dataSet)###获得初始聚类中心
  4. for(i in 1:100){
  5. cbmatrix<-calCBmatrix(n,clustercenter,dataSet)
  6. clustercenter<-calCluster(n,cbmatrix,dataSet)
  7. }
  8. print(calvaluef(n,cbmatrix,clustercenter,dataSet))
  9. }
复制代码
执行任务的代码可以根据自己的需求进行修改~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:聚类算法 FCM R语言 Data 模糊理论 FCM算法 软聚类 R代码

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-24 10:06