1. FCM <- function(x, K, mybeta = 2, nstart = 1, iter_max = 100, eps = 1e-06) {
  2. ## FCM
  3.  
  4. ## INPUTS
  5. ## x: input matrix n*d, n d-dim samples
  6. ## K: number of desired clusters
  7. ## Optional :
  8. ## mybeta : beta, exponent for u (defaut 2).
  9. ## nstart: how many random sets should be chosen(defaut 1)
  10. ## iter_max : The maximum number of iterations allowed. (default 100)
  11.  
  12. ##
  13. ## OUTPUTS
  14. ## u: The fuzzy membership matrix = maxtrix of size n*K;
  15. ## g: matrix of size K*d of the centers of the clusters
  16. ## J: objective function
  17. ## histJ: all the objective function values in the iter process
  18.  
  19. ## modified time: 2015-02-07
  20.  
  21. FCM_onetime <- function(x, init_centers, mybeta = 2, iter_max = 100, eps = 1e-06) {
  22. n = dim(x)[1]
  23. d = dim(x)[2]
  24. g = init_centers
  25. K = dim(g)[1]
  26. histJ = c()
  27. pasfini = 1
  28. Jold = Inf
  29. D = matrix(0, n, K)
  30. for (j in 1:K) {
  31. D[, j] = rowSums(sweep(x, 2, g[j, ], "-")^2)
  32. }
  33. iter = 1
  34. J_old = Inf
  35. while (pasfini) {
  36. s = (1/(D + eps))^(1/(mybeta - 1))
  37. u = s/(s %*% matrix(1, K, K))
  38. t1 = t(u^mybeta) %*% x
  39. t2 = t(u^mybeta) %*% matrix(1, n, d)
  40. V = t1/t2
  41. g = V
  42. D = matrix(0, n, K)
  43. for (j in 1:K) {
  44. D[, j] = rowSums(sweep(x, 2, g[j, ], "-")^2)
  45. }
  46. J = sum(u^mybeta * D)
  47. pasfini = abs(J - Jold) > 0.001 && (iter < iter_max)
  48. Jold = J
  49. histJ = c(histJ, J)
  50. iter = iter + 1
  51. }
  52. cluster_id = apply(u, 1, which.max)
  53. re = list(u, J, histJ, g, cluster_id)
  54. names(re) = c("u", "J", "histJ", "g", "cluster_id")
  55. return(re)
  56. }
  57. x = as.matrix(x)
  58. seeds = 1:nrow(x)
  59. id = sample(seeds, K)
  60. g = as.matrix(x[id, ])
  61. re_best = FCM_onetime(x = x, init_centers = g, mybeta = mybeta, iter_max = iter_max, eps = eps)
  62. if (nstart > 1) {
  63. minJ = 0
  64. i = 2
  65. while (i <= nstart) {
  66. init_centers_id = sample(seeds, K)
  67. init_centers = as.matrix(x[init_centers_id, ])
  68. run = FCM_onetime(x, init_centers = init_centers, mybeta = mybeta, iter_max = iter_max)
  69. if (run$J <= re_best$J) {
  70. re_best = run
  71. }
  72. i = i + 1
  73. }
  74. }
  75. return(re_best)
  76. }
  1. # 对于模糊聚类均值的公式及其推到,大致如下:
  2.  
  3. #主要代码参见下面:(其中使用kmeans作比较。然后通过svm分类测验训练)
  4. # 设置伪随机种子
  5. set.seed(100)
  6.  
  7. # 生产数据样本
  8. simple.data = function (n=200, nclass=2)
  9. {
  10. require(clusterGeneration)
  11. require(mvtnorm)
  12. # Center of Gaussians
  13. xpos = seq(-nclass*2, nclass*2, length=nclass)
  14. ypos = runif(nclass, min=-2*nclass, max=2*nclass)
  15.  
  16. func = function(i,xpos,ypos,n) {
  17. # Create a random covariance matrix
  18. cov = genPositiveDefMat(2, covMethod="eigen",
  19. rangeVar=c(1, 10), lambdaLow=1, ratioLambda=10)
  20. # 保存随机数据
  21. data = rmvnorm(n=n, mean=c(xpos[i], ypos[i]), sigma=cov$Sigma)
  22. # 保存每一次的结果
  23. list(means=cbind(xpos[i], ypos[i]), covars=cov$Sigma, data=data,class=rep(i*1.0, n))
  24. }
  25. # do call 合并列表 为 数据框
  26. strL=do.call(rbind,lapply(1:nclass,func,xpos,ypos,n))
  27. data=list()
  28. data$means=do.call(rbind,strL[,1])
  29. data$covars = as.list(strL[,2])
  30. data$data=do.call(rbind,strL[,3])
  31. data$class=do.call(c,strL[,4])
  32. # 返回
  33. data
  34. }
  35.  
  36. # 第一次随机产生u值 nr点个数 k 类别数
  37. random.uij = function(k,nr)
  38. {
  39. #
  40. u = matrix(data=round(runif(k*nr,10,20)),nrow=k,ncol=nr,
  41. dimnames=list(paste('u',1:k,sep=""),paste('x',1:nr,sep='')))
  42. tempu = function(x)
  43. {
  44. ret = round(x/sum(x),4)
  45. # 保证每一列之和为1
  46. ret[1] = 1-sum(ret[-1])
  47. ret
  48. }
  49. apply(u,2,tempu)
  50. }
  51.  
  52. # 计算 点矩阵 到 中心的距离
  53. dist_cc_dd = function(cc,dd)
  54. {
  55. # cc 为 中心点 dd 为样本点值
  56. temp = function(cc,dd)
  57. {
  58. # 计算每一个中心点与每一个点的距离
  59. temp1 = function(index)
  60. {
  61. sqrt(sum(index^2))
  62. }
  63. # 结果向量以列存放,后面的结果需要转置,按行存储
  64. apply(dd-cc,2,temp1)
  65. }
  66. # 将结果转置
  67. t(apply(cc,1,temp,dd))
  68. }
  69.  
  70. # 模糊均值聚类
  71. fuzzy.cmeans = function(data,u,m=3)
  72. {
  73. # 简单的判断,可以不要
  74. if (is.array(data) || is.matrix(data))
  75. {
  76. data = as.data.frame(data)
  77. }
  78.  
  79. # nr = nrow(data)
  80. # nc = ncol(data)
  81.  
  82. # while (J > lim && step < steps)
  83. # {
  84. # step = step + 1
  85. # uij 的 m 次幂
  86. um = u^m
  87. rowsum = apply(um,1,sum)
  88. # 求中心点 ci
  89. cc = as.matrix(um/rowsum) %*% as.matrix(data)
  90. # rownames(cc)=paste('c',1:k,sep='')
  91. # colnames(cc)=paste('x',1:nc,sep='')
  92. # 计算 J 值
  93. distance = dist_cc_dd(cc,t(data))
  94. J = sum(distance^2 * um)
  95. # cc_temp = matrix(rep(cc,each=nr),ncol=2)
  96. # dd_temp = NULL
  97. # lapply(1:k,function(i){dd_temp <<- rbind(dd_temp,data)})
  98. # dist = apply((dd_temp-cc_temp)^2,1,sum)
  99. # um_temp = as.vector(t(um))
  100. # J = um_temp %*% dist
  101.  
  102. # 计算幂次系数,后面需要使用m != 1
  103. t = -2 / (m - 1)
  104. # 根据公式 计算
  105. tmp = distance^t
  106. colsum = apply(tmp,2,sum)
  107. mat = rep(1,nrow(cc)) %*% t(colsum)
  108. # 计算 uij,如此u的每一列之和为0
  109. u = tmp / mat
  110. # }
  111. # u
  112. # 保存一次迭代的结果值
  113. list(U = u,C = cc,J = J)
  114. }
  115.  
  116. # 设置初始化参数
  117. n = 100
  118. k = 4
  119. dat = simple.data(n,k)
  120. nr = nrow(dat$data)
  121. m = 3
  122. limit = 1e-4
  123. max_itr=50
  124. # 随机初始化 uij
  125. u = random.uij(k,nr)
  126. results = list()
  127. data=dat$data
  128.  
  129. # 迭代计算 收敛值
  130. for (i in 1 : max_itr)
  131. {
  132. results[[i]] = fuzzy.cmeans(dat$data,u,m)
  133. if (i != 1 && abs((results[[i]]$J - results[[i-1]]$J)) < limit)
  134. {
  135. break
  136. }
  137. u = results[[i]]$U
  138. }
  139.  
  140. # 做散点图
  141. require(ggplot2)
  142. data=as.data.frame(dat$data,stringsAsFactors=FALSE)
  143. data=cbind(data,dat$class)
  144. nc = ncol(data)
  145. colnames(data)=paste('x',1:nc,sep='')
  146. # par(mar=rep(2,4))
  147. p=ggplot(data,aes(x=x1,y=x2,color=factor(x3)))
  148. p+geom_point()+xlab('x轴')+ylab('y轴')+ggtitle('scatter points')
  149.  
  150. # plot(dat$data,col=factor(dat$class))
  151. # points(results[[i]]$C,pch=19,col=1:uniqe(dat$class))
  152. # Sys.sleep(1)
  153.  
  154. # 计算聚类与原始类的误差比率
  155. tclass=apply(results[[i]]$U,2,function(x){which(x==max(x))})
  156. tclass[tclass==2]=5
  157. tclass[tclass==3]=6
  158. tclass[tclass==4]=7
  159. tclass[tclass==5]=4
  160. tclass[tclass==6]=2
  161. tclass[tclass==7]=3
  162.  
  163. freq=table(dat$class,tclass)
  164. (sum(freq)-sum(diag(freq))) / sum(freq)
  165.  
  166. # 训练 svm model
  167. svm_test = function()
  168. {
  169. library(e1071)
  170. svm.fit = svm(dat$data,dat$class)
  171. r.fit = predict(svm.fit, dat$data)
  172. diff.class = round(as.numeric(r.fit)) - as.numeric(dat$class)
  173. i.misclass = which(abs(diff.class) > 0)
  174. n.misclass = length(i.misclass)
  175. f.misclass = n.misclass/length(dat$class)
  176. }
  177. # 同一数据,使用 kmeans 聚类
  178. kmeans_test = function()
  179. {
  180.  
  181. k.fit = kmeans(x=dat$data,4)
  182. tclass=k.fit$cluster
  183. tclass[tclass==2]=5
  184. tclass[tclass==3]=6
  185. tclass[tclass==4]=7
  186. tclass[tclass==5]=3
  187. tclass[tclass==6]=4
  188. tclass[tclass==7]=2
  189. freq=table(dat$class,tclass)
  190. (sum(freq)-sum(diag(freq))) / sum(freq)
  191. }
  192.  
  193. # kmeans 和 fuzzy c means

R语言 模糊c均值(FCM)算法程序(转)的更多相关文章

  1. 使用R语言-计算均值,方差等

    R语言对于数值计算很方便,最近用到了计算方差,标准差的功能,特记录. 数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [ ...

  2. 基于R语言的数据分析和挖掘方法总结——均值检验

    2.1 单组样本均值t检验(One-sample t-test) 2.1.1 方法简介 t检验,又称学生t(student t)检验,是由英国统计学家戈斯特(William Sealy Gosset, ...

  3. 模糊C均值聚类-FCM算法

    FCM(fuzzy c-means) 模糊c均值聚类融合了模糊理论的精髓.相较于k-means的硬聚类,模糊c提供了更加灵活的聚类结果.因为大部分情况下,数据集中的对象不能划分成为明显分离的簇,指派一 ...

  4. R语言均值,中位数和模式

    R语言均值,中位数和模式 在R统计分析是通过用许多内置函数来执行的. 大多数这些函数是R基本包的一部分.这些函数需要R向量作为输入参数并给出结果. 我们正在讨论本章中的函数是平均数,中位数和模式. 平 ...

  5. 多核模糊C均值聚类

    摘要: 针对于单一核在处理多数据源和异构数据源方面的不足,多核方法应运而生.本文是将多核方法应用于FCM算法,并对算法做以详细介绍,进而采用MATLAB实现. 在这之前,我们已成功将核方法应用于FCM ...

  6. 用R语言的quantreg包进行分位数回归

    什么是分位数回归 分位数回归(Quantile Regression)是计量经济学的研究前沿方向之一,它利用解释变量的多个分位数(例如四分位.十分位.百分位等)来得到被解释变量的条件分布的相应的分位数 ...

  7. 如何在R语言中使用Logistic回归模型

    在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...

  8. R语言解读一元线性回归模型

    转载自:http://blog.fens.me/r-linear-regression/ 前言 在我们的日常生活中,存在大量的具有相关性的事件,比如大气压和海拔高度,海拔越高大气压强越小:人的身高和体 ...

  9. R语言实战(三)基本图形与基本统计分析

    本文对应<R语言实战>第6章:基本图形:第7章:基本统计分析 =============================================================== ...

随机推荐

  1. 鼠标滚动:mousewheel事件在Firefox采用DOMMouseScroll事件的统一处理

    这是一个小事件,但当下的WEB应用交互非常丰富,判断鼠标的滚动来执行相应的操作是比较常见的.我用Chrome/IE/Firefox/Opera 4种浏览器做测试,发现只有firefox的处理方法有很大 ...

  2. android正则表达式隐藏邮箱地址中间字符

    // String emailStr = email.substring(0, email.lastIndexOf("@"));// if (emailStr.length() & ...

  3. linux下安装node

    经过一番的折腾终于在linux上安装了node,记录下来以免忘记 1.下载node 去官网下载最新的linux版本下对应node.js,node-v6.10.2-linux-x64.tar.gz 2. ...

  4. Linux防火墙配置—SNAT2

    1.实验目标 以实验"Linux防火墙配置-SNAT1"为基础,为网关增加外网IP地址,为eth1创建虚拟接口,使外网测试主机在Wireshark中捕获到的地址为eth1虚拟接口的 ...

  5. collection and map and Collections

    两者的区别: 两者都是接口: Collectoin是java集合框架的一个顶级接口,存储的元素可以是任意类型的对象: Map是java集合框架的映射接口,以键值对的形式存储对象: 也就是说,colle ...

  6. test back

    python Mysql 下载地址 http://sourceforge.net/projects/mysql-python/

  7. 【算法系列学习】codeforces C. Mike and gcd problem

    C. Mike and gcd problem http://www.cnblogs.com/BBBob/p/6746721.html #include<iostream> #includ ...

  8. css中最基本几个选择器

    css中有四种不同的选择器 ①类选择器,又叫class选择器.类选择器{属性名:属性值:...}/*类选择器*/.s1{ font-weight:bold;font-size:16px;}②id选择器 ...

  9. SSH 远程执行任务

    SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进 ...

  10. 小谈-—ServletConfig对象和servletContext对象

    一.servletContext概述 servletContext对象是Servlet三大域对象之一,每个Web应用程序都拥有一个ServletContext对象,该对象是Web应用程序的全局对象或者 ...