当前位置: 首页 > news >正文

【R语言】Kmeans算法

使用R语言实现kmeans算法底层代码,并对HighDensity_Scatter_Data数据进行聚类分析(不直接使用kmeans函数)

# 导包

library(ggplot2)

library(RColorBrewer) 



  # 加载数据

  mydata <- read.table("D:/RWorkPlace/K-means聚类分析/K-means聚类分析/HighDensity_Scatter_Data.csv", header = TRUE, sep = ",")

 

  #画出原始数据的散点图,这是个带透明度设置的黑色散点图

  ggplot(data = mydata, aes(x,y)) +

    geom_point( colour="black",alpha=0.1)+

    labs(x = "Axis X",y="Axis Y")+

    theme(

      text=element_text(size=15,color="black"),

      plot.title=element_text(size=15,family="myfont",face="bold.italic",hjust=.5,color="black"),

      legend.position="none"

    )

 

  # 指定将数据集分成 k 个类别

  k <- 2 # 指定质心数量

 

  # step:0,设定质心,nrow读取有问题不知道为什么,我直接手动设置行列了

  m <- 10000  # 数据集样本数m

  n <- 2  # 维度dim

  centers <- matrix(0, nrow = 10000, ncol = 2)  # 定义聚类中心存储矩阵



 

  # 根据设定的聚类中心数随机获取样本中的点作为初始聚类中心坐标

  for (i in 1:k) {

    index <- sample(1:m, 1)  # 随机获取一个索引

    centers[i,1 ] <- mydata[index, 1]  # 将x中的第index行赋值给centers的第i行

    centers[i,2 ] <- mydata[index, 2]

  }

 

  # KMeans核心实现代码

  for (i in 1:600) {

    # 备份一下质心数据

    t_center <- centers

   

    # step1: 计算距离

    dist_list <- matrix(0, nrow = m, ncol = k)

    for (j in 1:k) {

      dist_list[, j] <- sqrt(rowSums((mydata - centers[j, ])^2) + 1)

    }

   

    # step2: 计算极值

    argmin_dist <- apply(dist_list, 1, which.min)

   

    # step3: 更新质心

    for (j in 1:k) {

      cluster_points <- mydata[argmin_dist == j, ]

      if (nrow(cluster_points) > 0) {

        centers[j, ] <- apply(cluster_points, 2, mean)

      }

    }

   

    # step4: 重复1、2、3步,直到质心不再发生改变

    if (identical(t_center, centers)) {

      print(i)

      break

    }

  }

 

  cat("质心坐标矩阵:\n")

  print(centers)

  cat("\n各样本点标签值:\n")

  print(argmin_dist)

 

  #创建cluster列映射颜色

  mydata$cluster <- as.factor(argmin_dist)

 

  #将聚类结果映射到每个点上,给每个点赋予颜色

  ggplot(data = mydata, aes(x,y,color=cluster)) +

    geom_point( alpha=0.2)+

    scale_color_manual(values=c("#00AFBB",  "#FC4E07"))+

    labs(x = "Axis X",y="Axis Y")+

    theme(

      text=element_text(size=15,color="black"),

      plot.title=element_text(size=15,family="myfont",face="bold.italic",color="black"),

      legend.background=element_blank(),

      legend.position=c(0.85,0.15)

运行结果

相关文章:

  • Servlet理论知识详解
  • 由堆栈异常引发的一系列问题启发
  • 计算机视觉 |解锁视频理解三剑客——TimeSformer
  • Spring 中的依赖注入
  • 【Deepseek学习大模型】Roofline计算规则
  • 虚拟机缩放比例问题处理
  • RK3588 mpp视频帧解码
  • PG 中级认证专家考证事项
  • 【大模型】大模型推理能力深度剖析:从通用模型到专业优化
  • 【数据结构】二叉树(门槛极低的系统理解)
  • 一次性内窥镜鲁棒性详解:技术与应用
  • 结构体介绍及内存大小分配问题
  • SonarQube 在持续集成中的作用与应用
  • PDF图形识别:一键框选,快速计数,开启数字化图形处理新时代
  • linux在vim中查找和替换
  • string类在OJ的使用
  • linux中安装部署Jenkins,成功构建springboot项目详细教程
  • 03_旁挂负载分担组网场景
  • AI壁纸创作技巧01:蓝色敖闰
  • undo log、redo log和bin log详解
  • 文学如何遭遇世界:日本“世界文学”的半个世纪
  • 洋山特殊综合保税区累计进出口货值超1万亿元
  • 葡萄牙三年第三次大选:“三分天下”已定,“欧洲例外”不再
  • 嘴巴总是发干,喝水也不管用?小心是这几种疾病的警报
  • 改造老旧小区、建立“一张图”,五部委将多举措支持城市更新
  • 住建部:目前已累计建设改造各类市政管网50万公里