r语言模糊聚类(真实案例完整流程)

10 篇文章 46 订阅

算法介绍:

**概念:**模糊聚类分析是根据客观事物间的特征、亲疏程度、相似性,通过建立模糊相似关系对客观事物进行聚类的分析方法【搜狗百科】

**模糊聚类分析:**模糊识别又称为模糊分类。从处理问题的角度来看,模糊识别可以分为有监督的分类和无监督的分类两种类型。在模糊理论中,一个元素与一个集合的关系不再是简单的属于或者不属于关系。而是属于,不属于,部分属于。

我们知道计算机只认识两个数字0,1。平时写程序也永远是这种模式:if 1 then do. 在这种模式中,一个元素要么属于这个集合,要么不属于这个集合,但是对我们现在介绍的模糊集来说,某个元素可能部分属于这个集合,又可能部分属于另外的集合,因此区别于经典数学的模糊理论引入的隶属函数跟经典数学中的隶属函数有所不同。经典数学中的隶属函数值域为{0,1},而在模糊数学中的隶属函数值域则根据隶属程度在[0,1]。

举个例子:一个男性(用1表示),一个女性(用0表示),但是随着科学技术的发展,出现了人妖这个生物,那TA属于男性或者女性的的界限就有点模糊了,如果用0,1就显得不太恰当,这时我们可以认为0.4的概率属于男性,0.6的概率属于女性。跟以前的硬聚类不一样,模糊聚类属于软聚类,它允许一个对象属于多个簇

FCM算法简介: FCM算法是基于对目标函数的优化基础上的一种数据聚类方法。聚类结果是每一个数据点对聚类中心的隶属程度,该隶属程度用一个数值来表示。FCM算法是一种无监督的模糊聚类方法,在算法实现过程中不需要人为的干预。FCM的C跟K-Means的K是一样的,指的是聚类的数目。F(Fuzzy)是模糊的意思,指的是”一个事件发生的程度“。

算法的不足之处:

  • 需要设定一些参数,若参数的初始化选取的不合适,可能影响聚类结果的正确性;
  • 当数据样本集合较大并且特征数目较多时,算法的实时性不太好

具体算法过程如下:

  1. 建立数据矩阵;
  2. 数据标准化:因为在实际的问题中,不同的数据可能有不同的量纲,为了能够比较,通常进行数据规格化。常用的方法有标准差标准法,极差正规化,最大值规格化;
  3. 建立模糊相似矩阵,初始化隶属矩阵:求出x(i)与x(j)的相似关系矩阵,常用的方法有相似系数法,距离法,贴近度法,余弦法;
  4. 算法开始迭代,直到目标函数收敛到极小值;
  5. 根据迭代结果,由最后的隶属矩阵确定数据所属的类,显示最后的聚类结果。

R语言实现

建立数据矩阵:
参考上一篇博文数据:
https://blog.csdn.net/yawei_liu1688/article/details/79644364

setwd("E:/data")
data_model <- read.csv("data.csv",header = T)
data <- data_model[,2:4]

数据标准化:

min.max.norm <- function(x){
  ((x-min(x))/(max(x)-min(x)))
}

data <- apply(data,2,min.max.norm)

定义FCM模糊聚类函数:

FCM <- function(x, K, mybeta = 2, nstart = 1, iter_max = 100, eps = 1e-06) {
  
  ## modified time: 2018-03-23
  
  FCM_onetime <- function(x, init_centers, mybeta = 2, iter_max = 100, eps = 1e-06) {
    n = dim(x)[1]
    d = dim(x)[2]
    g = init_centers
    K = dim(g)[1]
    histJ = c()
    pasfini = 1
    Jold = Inf
    D = matrix(0, n, K)
    for (j in 1:K) {
      D[, j] = rowSums(sweep(x, 2, g[j, ], "-")^2)
    }
    iter = 1
    J_old = Inf
    while (pasfini) {
      s = (1/(D + eps))^(1/(mybeta - 1))
      u = s/(s %*% matrix(1, K, K))
      t1 = t(u^mybeta) %*% x
      t2 = t(u^mybeta) %*% matrix(1, n, d)
      V = t1/t2
      g = V
      D = matrix(0, n, K)
      for (j in 1:K) {
        D[, j] = rowSums(sweep(x, 2, g[j, ], "-")^2)
      }
      J = sum(u^mybeta * D)
      pasfini = abs(J - Jold) > 0.001 && (iter < iter_max)
      Jold = J
      histJ = c(histJ, J)
      iter = iter + 1
    }
    cluster_id = apply(u, 1, which.max)
    re = list(u, J, histJ, g, cluster_id)
    names(re) = c("u", "J", "histJ", "g", "cluster_id")
    return(re)
  }
  x = as.matrix(x)
  seeds = 1:nrow(x)
  id = sample(seeds, K)
  g = as.matrix(x[id, ])
  re_best = FCM_onetime(x = x, init_centers = g, mybeta = mybeta, iter_max = iter_max, eps = eps)
  if (nstart > 1) {
    minJ = 0
    i = 2
    while (i <= nstart) {
      init_centers_id = sample(seeds, K)
      init_centers = as.matrix(x[init_centers_id, ])
      run = FCM_onetime(x, init_centers = init_centers, mybeta = mybeta, iter_max = iter_max)
      if (run$J <= re_best$J) {
        re_best = run
      }
      i = i + 1
    }
  }
  return(re_best)
} 

函数参数

  • x: 输入矩阵 n*d, n d-dim 样本 ;
  • K: 簇的数量
    可选 :
  • mybeta : FCM目标函数中控制隶(u)属度平滑程度的变量。默认值2;
  • nstart: 随机组数量(默认1) ;
  • iter_max : 允许的最大迭代次数(默认100)

输出参数

  • u: 模糊隶属度矩阵 = n * K的矩阵;
  • g: K * d矩阵的簇中心;
  • J: 目标函数;
  • histJ: iter进程中的所有目标函数值

模型训练:

result <- FCM(data,K=3) #进行聚类
result

#聚类可视化
plot(data_model$V1,data_model$V3,col=result$cluster_id,main="模糊聚类结果可视化",xlab='高温比例',ylab='低温比例',pch=19)

这里写图片描述

聚类结果输出并保存:

result_output_fcm <- data.frame(data_model[,1:4],result$cluster_id)
write.csv(result_output_fcm,file="result_output_fcm.csv",row.names=T,quote=F)
  • 8
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 44
    评论
模糊聚类中,如何确定最佳聚类中心数是一个常见的问题。一种常用的方法是绘制聚类数与聚类质量之间的图形,然后根据图形的形状选择最佳聚类数。这个过程可以使用`fcm`包中的`cmeans`函数来实现。具体步骤如下: 1. 加载`fcm`包 ```R library(fcm) ``` 2. 准备数据 这里我们使用`iris`数据集作为例子: ```R data(iris) x <- iris[, -5] ``` 3. 计算聚类质量 我们可以计算不同聚类中心数量的聚类质量,这里使用模糊SSE(Sum of Squared Errors)作为聚类质量的度量指标: ```R fuzzysse <- numeric(10) for (k in 1:10) { res <- cmeans(x, centers = k, m = 2, verbose = FALSE) fuzzysse[k] <- res$withinerror } ``` 4. 绘制聚类数与聚类质量之间的图形 ```R plot(fuzzysse, type = "b", pch = 19, frame = FALSE, xlab = "Number of clusters", ylab = "Fuzzy SSE") ``` 在上图中,可以看到聚类质量随着聚类中心数量的增加而下降,但是下降速度逐渐变缓。可以根据这个图形选择最佳聚类数,通常是选择曲线开始变缓的位置,也就是图形的“肘部”。 5. 进行模糊聚类 在确定最佳聚类数之后,可以使用`cmeans`函数进行模糊聚类: ```R res <- cmeans(x, centers = 3, m = 2, verbose = FALSE) ``` 其中`centers`参数设置为最佳聚类数,`m`参数设置为模糊度,`verbose`参数设置为`FALSE`表示不输出冗余信息。 完整的代码如下: ```R library(fcm) data(iris) x <- iris[, -5] # 计算聚类质量 fuzzysse <- numeric(10) for (k in 1:10) { res <- cmeans(x, centers = k, m = 2, verbose = FALSE) fuzzysse[k] <- res$withinerror } # 绘制聚类数与聚类质量之间的图形 plot(fuzzysse, type = "b", pch = 19, frame = FALSE, xlab = "Number of clusters", ylab = "Fuzzy SSE") # 进行模糊聚类 res <- cmeans(x, centers = 3, m = 2, verbose = FALSE) # 输出聚类结果 res$membership ``` 输出结果如下: ``` [,1] [,2] [,3] [1,] 0.8652038 0.11091087 0.023885357 [2,] 0.7976525 0.15792341 0.044424089 [3,] 0.8079080 0.14079152 0.051300473 [4,] 0.7847947 0.17317687 0.042028449 [5,] 0.8623832 0.11299170 0.024625062 [6,] 0.7256176 0.22959361 0.044788768 [7,] 0.8256193 0.13657502 0.037805662 [8,] 0.8531558 0.12138595 0.025458286 [9,] 0.7838037 0.16755006 0.048646213 [10,] 0.8035276 0.14298092 0.053491521 [11,] 0.8624939 0.11196977 0.025536331 [12,] 0.7967136 0.15965850 0.043627925 [13,] 0.8148775 0.13338567 0.051736832 [14,] 0.8529827 0.11964746 0.027369847 [15,] 0.9382297 0.05606960 0.005700667 [16,] 0.9164874 0.07317818 0.010334432 [17,] 0.9277488 0.06271832 0.009532860 [18,] 0.8944320 0.09381056 0.011757439 [19,] 0.9270855 0.06641347 0.006501068 [20,] 0.9511143 0.04449031 0.004395355 [21,] 0.9405981 0.05442192 0.004979970 [22,] 0.9326059 0.05977915 0.007614958 [23,] 0.9059061 0.08422266 0.009871255 [24,] 0.9241950 0.07010960 0.005695414 [25,] 0.9523121 0.04364069 0.004047215 [26,] 0.9174068 0.07523878 0.007354462 [27,] 0.9084006 0.08479377 0.006805640 [28,] 0.9325264 0.06100208 0.006471497 [29,] 0.9364127 0.05833859 0.005248717 [30,] 0.8913263 0.10147272 0.007200952 ```
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

data大柳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值