K-mean聚类是很基础的算法,在本科阶段大家都会学,如何通过R语言自己写K-mean算法,话不多说,上代码,算法流程和函数解释代码后

K_means <- function(data,k,max.iter = 10){
rows <- nrow(data)                 #获取行数
cols <- ncol(data)                 #获取列数
within <- numeric(k)               #用于存储组类平方和
lable_matrix <- matrix(0,rows,2)   #用于存储类标签及到类中心的距离
centers <- matrix(0,cols,k)        #用于存储类中心
centers_matrix <- matrix(0,rows,k) #用于存储初始确定初始类中心时到类中心的距离
iter <- 0                          #迭代次数
random <- sample(1:rows,1)
centers[,1] <- as.matrix(data[random,])
for(j in 2:k){for(i in 1:rows){centers_matrix[i,j] <- sum((data[i,] - centers[,j-1])^2)+centers_matrix[i,j-1]}centers[,j] <- as.matrix(data[which(centers_matrix[,j] == max(centers_matrix[,j])),])
}                                  #计算初始类中心
changed <- TRUE                    #用于判断数据的类标签是否发生改变
while(changed){if(iter >= max.iter){changed <- FALSEbreak}for(j in 1:rows){updata <- 1000000000for( i in 1:k){updatas <- sum((data[j,]-centers[,i])^2)if(updatas < updata){updata <- updataslable_matrix[j,1] <- updataslable_matrix[j,2] <- i}}}                                 #更新到类中心的距离以及类标签center <- centersfor(i in 1:k){centers[,i] <- colMeans(data[lable_matrix[,2]==i,])}                                 #更新类中心changed <- !all(center == centers)#判断类中心是否变化iter <- iter + 1
}
###计算函数返回值:
totss <- sum((t(data[,])-colMeans(data))^2)
withinss <- numeric()
for(i in 1:k){withinss[i] <- sum((t(data[lable_matrix[,2]==i,])-(centers[,i]))^2)
}
tot.withinss <- sum(withinss)
betweenss<-0
for(i in 1:3){betweenss <- betweenss + sum(nrow(data[lable_matrix[,2]==i,])*(rowMeans(t(data[lable_matrix[,2]==i,]))-colMeans(data))^2)
}
size <- aggregate(lable_matrix[,2], by=list(lable=lable_matrix[,2]),length)[,2]centers_matrix <- t(centers)
colnames(centers_matrix) <- colnames(data)
result <- list(cluster = lable_matrix[,2],centers = centers_matrix,totss = totss,withinss = withinss,tot.withinss = tot.withinss,betweenss = betweenss,size = size,iter = iter)
return(result)
}df <- kmeans(iris[,1:4],3)
df$cluster
df$centers
df$totss
df$withinss
df$tot.withinss
df$betweenss
df$size
df$iter
K_means(iris[,1:4],3)

对设置的函数参数以及输出的结果做一解释:

参数:data:用于聚类的数据;k:用于聚类的数目;max.iter:最大迭代次数

输出结果(均与R语言中自带kmeans函数输出结果命名一致):

cluster:聚类结果,即类标签;

centers:聚类中心;

totss:总平方和;

withinss:各组内的平方和;

tot.withinss:组内平方和;

betweenss:组间平方和;

size:各类的数量;

iter :迭代次数;

我用自己写的函数与R语言自带的kmeans函数结果做了对比,数据集使用iris数据集,结果如下:

 由上面两图的结果对比可知:除去迭代次数不一致外其余均相同;迭代次数不一致是因为选取的初始类中心为随机选取造成的。也不排除我的迭代过程不是最优的迭代方式造成,欢迎大家留言谈论!

算法流程:

对于K-mean聚类算法的详细流程以及可改进地方和方向,我后期也会发类似的文章。

R语言之K-mean聚类分析相关推荐

  1. 手把手教你R语言做k均值聚类分析

    今天聊聊k均值聚类分析,我们先要知道什么是类,在大数据时代,我们每个人都被打上很多个性标签,比如:宅男,月光族,手机控,非主流等等,每个标签都可以算是一个类,因此,可以不严谨的说:类是一些有特殊属性个 ...

  2. 《R语言与数据挖掘》⑦聚类分析建模

    书籍:<R语言与数据挖掘> 作者:张良均 出版社:机械工业出版社 ISBN:9787111540526 本书由北京华章图文信息有限公司授权杭州云悦读网络有限公司电子版制作与发行 版权所有· ...

  3. R 语言 基于关联规则与聚类分析的消费行为统计

    <金融数据挖掘案例分析> 课程设计报告 题 目: 基于关联规则与聚类分析的消费行为统计 学生姓名: 序号: 学生姓名: 序号: 学生姓名: 序号: 学生姓名: 序号: 指导教师: 信息工程 ...

  4. R语言学习笔记之聚类分析

    感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习, ...

  5. R语言学习记录:聚类分析的R实现

    时间: 2018-08-04 参考教程: Learn R | 统计建模之聚类分析(上). Learn R | 统计建模之聚类分析(下) 学习内容:聚类分析的R实现 数据来源:<应用多元统计分析& ...

  6. clustMD r语言_利用R语言实现微阵列数据分析-聚类分析

    原文见:http://www.biostat.ucsf.edu/jean/Presentation/IMSLAB.pdf 为了方便大家学习,我将该文翻译成中文加上一些相关的简单介绍,经验尚浅,还请大家 ...

  7. 通过R语言对数据进行聚类分析

    聚类分析是将数据根据相似特征分类到不同的类或簇,用以对数据进行区分. 1.聚类(K-means) 通过数据中每个数值间的距离进行聚类,是一种纵向聚类,将样本数据据成类型,用以对数据的特征进行区分. ( ...

  8. pvrect r语言 聚类_R语言一条命令实现基于样本和距离的聚类分析

    上一篇文章给大家介绍了利用 R语言的 hclust()进行聚类分析的步骤,已经很简单了,但是依然有不少小伙伴来问 "老师,还有更简单的方法吗,最好是一条命令那种",为了满足的大家的 ...

  9. r语言descstats_R语言学习笔记之聚类分析

    原标题:R语言学习笔记之聚类分析 taoyan:伪码农,R语言爱好者,爱开源. 个人博客: https://ytlogos.github.io/ 使用k-means聚类所需的包: factoextra ...

  10. R语言可视化学习笔记之相关矩阵可视化包ggcorrplot

    本文转载自"R语言中文社区",己获授权. 作者简介Introduction taoyan:伪码农,R语言爱好者,爱开源. 个人博客: https://ytlogos.github. ...

最新文章

  1. Mycat实现读写分离
  2. Microbiome:植物根际微生物组也有昼夜节律
  3. 【计算机网络】网络层 : IP 数据报格式 ( IP 数据报首部格式 )
  4. 在switch case 语句中能否使用continue 关键字?为什么?
  5. 专家:中国房地产泡沫崩溃时间就是今明二年
  6. java8 升级_java8升级
  7. 【sprinb-boot】改造成 spring-cloud 项目
  8. Zookeeper场景实践:(5)分布式通知/协调
  9. 数字图像噪声_Python
  10. Hadoop常见异常及其解决方案
  11. 如何运用领域驱动设计 - 存储库
  12. STM32----摸石头过河系列(四)
  13. 什么是机器学习?有哪些分类?到底有什么用?终于有人讲明白了
  14. 如何用SQL语句查询Excel数据
  15. iTween 动画类型
  16. windows下使用命令行将employees.sql导入mysql
  17. PyTorch 1.0 中文官方教程:ONNX 现场演示教程
  18. vscode有时候不能注释_给大伙儿盘几个提效/创意的 vscode 插件
  19. 马云行业预测:人工智能下,未来10年机器人占领职场
  20. Java测试代码及原理

热门文章

  1. 反向代理分离资源服务器分析
  2. GPFS实施方案的思考
  3. 网络编程(1)—— 基于linux系统的socket服务器端编程步骤
  4. GitLab 创建项目组及将代码导入项目
  5. linux监控文件变化的程序,在 Linux 下监控程序修改文件
  6. linux查看内存是ddr3,linux查看具体内存信息
  7. 多御安全浏览器使用技巧,剖析7大优点特性
  8. 友盟分享微信图标显示成圆形
  9. 5.9拉普拉斯矩阵的谱分解,谱图卷积,图卷积演变过程
  10. codebook实现源码