• 主页
  • 课程

    关于课程

    • 课程归档
    • 成为一名讲师
    • 讲师信息
    alphafold2培训

    alphafold2培训

    免费
    阅读更多
  • 特色
    • 展示
    • 关于我们
    • 问答
  • 事件
  • 个性化
  • 博客
  • 联系
  • 站点资源
    有任何问题吗?
    (00) 123 456 789
    weinfoadmin@weinformatics.cn
    注册登录
    恒诺新知
    • 主页
    • 课程

      关于课程

      • 课程归档
      • 成为一名讲师
      • 讲师信息
      alphafold2培训

      alphafold2培训

      免费
      阅读更多
    • 特色
      • 展示
      • 关于我们
      • 问答
    • 事件
    • 个性化
    • 博客
    • 联系
    • 站点资源

      R语言

      • 首页
      • 博客
      • R语言
      • 【机器学习】无监督学习之K-means

      【机器学习】无监督学习之K-means

      • 发布者 weinfoadmin
      • 分类 R语言
      • 日期 2015年11月5日
      测试开头

      在网上(http://www.rdatamining.com/ )找到了一个用R语言进行聚类分析的例子。


      以R语言自带的iris数据集为例。


      具体步骤如下:

      第一步:对数据集进行初步统计分析
      #查数据的维度
      > dim(iris)
      [1] 150 5

      #示数据集中的列名
      > names(iris)
      [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"

      #示数据集的内部结构
      > str(iris)
      'data.frame': 150 obs. of 5 variables:
      $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 …
      $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 …
      $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 …
      $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 …
      $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 …

      #示数据集的属性
      > attributes(iris)
      $names –就是数据集的列名
      [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"

      $row.names –个人理解就是每行数据的标号
      [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
      [21] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
      [41] 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
      [61] 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
      [81] 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
      [101] 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
      [121] 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
      [141] 141 142 143 144 145 146 147 148 149 150

      $class –表示类别
      [1] "data.frame"

      #看数据集的前五项数据情况
      > iris[1:5,]
      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
      1 5.1 3.5 1.4 0.2 setosa
      2 4.9 3.0 1.4 0.2 setosa
      3 4.7 3.2 1.3 0.2 setosa
      4 4.6 3.1 1.5 0.2 setosa
      5 5.0 3.6 1.4 0.2 setosa


      #看数据集中属性Sepal.Length前10行数据
      > iris[1:10, "Sepal.Length"]
      [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

      #同
      > iris$Sepal.Length[1:10]
      [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

      #显示数据集中每个变量的分布情况
      > summary(iris)
      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
      Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50
      1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50
      Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50
      Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
      3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
      Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500

      #显示iris数据集列Species中各个值出现频次
      > table(iris$Species)

      setosa versicolor virginica
      50 50 50

      #根据列Species画出饼图
      > pie(table(iris$Species))



      #算出列Sepal.Length的所有值的方差
      > var(iris$Sepal.Length)
      [1] 0.6856935

      算出列iris$Sepal.Length和iris$Petal.Length的协方差
      > cov(iris$Sepal.Length, iris$Petal.Length)
      [1] 1.274315

      #算出列iris$Sepal.Length和iris$Petal.Length的相关系数, 从结果看这两个值是强相关。
      > cor(iris$Sepal.Length, iris$Petal.Length)
      [1] 0.8717538

      #画出列iris$Sepal.Length分布柱状图
      > hist(iris$Sepal.Length)

      #画出列iris$Sepal.Length的密度函数图
      > plot(density(iris$Sepal.Length))

      #画出列iris$Sepal.Length和iris$Sepal.Width的散点图
      > plot(iris$Sepal.Length, iris$Sepal.Width)


      #绘出矩阵各列的散布图
      > plot(iris)
      or
      > pairs(iris)

      第二步:R语言Kmeans聚类分析

      #将数据集进行备份,将列newiris$Species置为空,将此数据集作为测试数据集
      > newiris <- iris
      > newiris$Species <- NULL


      #在数据集newiris上运行Kmean聚类分析, 将聚类结果保存在kc中。在kmean函数中,将需要生成聚类数设置为3
      > (kc <- kmeans(newiris, 3))
      K-means clustering with 3 clusters of sizes 38, 50, 62: K-means算法产生了3个聚类,大小分别为38,50,62.

      Cluster means: 每个聚类中各个列值生成的最终平均值
      Sepal.Length Sepal.Width Petal.Length Petal.Width
      1 5.006000 3.428000 1.462000 0.246000
      2 5.901613 2.748387 4.393548 1.433871
      3 6.850000 3.073684 5.742105 2.071053

      Clustering vector: 每行记录所属的聚类(2代表属于第二个聚类,1代表属于第一个聚类,3代表属于第三个聚类)
      [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
      [37] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
      [73] 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3
      [109] 3 3 3 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3
      [145] 3 3 2 3 3 2

      Within cluster sum of squares by cluster: 每个聚类内部的距离平方和
      [1] 15.15100 39.82097 23.87947
      (between_SS / total_SS = 88.4 %) 组间的距离平方和占了整体距离平方和的的88.4%,也就是说各个聚类间的距离做到了最大


      Available components: 运行kmeans函数返回的对象所包含的各个组成部分
      [1] "cluster" "centers" "totss" "withinss"
      [5] "tot.withinss" "betweenss" "size"
      ("cluster"是一个整数向量,用于表示记录所属的聚类
      "centers"是一个矩阵,表示每聚类中各个变量的中心点
      "totss"表示所生成聚类的总体距离平方和
      "withinss"表示各个聚类组内的距离平方和
      "tot.withinss"表示聚类组内的距离平方和总量
      "betweenss"表示聚类组间的聚类平方和总量
      "size"表示每个聚类组中成员的数量)

      #创建一个连续表,在三个聚类中分别统计各种花出现的次数
      > table(iris$Species, kc$cluster)
      1 2 3
      setosa 0 50 0
      versicolor 2 0 48
      virginica 36 0 14

      根据最后的聚类结果画出散点图,数据为结果集中的列"Sepal.Length"和"Sepal.Width",颜色为用1,2,3表示的缺省颜色
      > plot(newiris[c("Sepal.Length", "Sepal.Width")], col = kc$cluster)
      在图上标出每个聚类的中心点
      〉points(kc$centers[,c("Sepal.Length", "Sepal.Width")], col = 1:3, pch = 8, cex=2)


      Kmeans算法的原理,详见链接:https://en.wikipedia.org/wiki/K-means_clustering

      【温馨提示】请伙伴们实践、实践、再实践。


      数据人机器学习QQ群:201696892,欢迎朋友们添加。


      推荐公众号:数据科学自媒体

      微信号:DataScienceWeMedia

      这里都是分享数据科学的好东东哦

      数据科学自媒体,专注数据科学的好东西。

      【机器学习】无监督学习之K-means
      长按图片,识别二维码,关注我们。



      测试结尾

      请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!

      • 分享:
      作者头像
      weinfoadmin

      上一篇文章

      【机器学习】无监督学习之PCA
      2015年11月5日

      下一篇文章

      【数据科学】R语言dplyr 包进行数据操作与清洗
      2015年11月6日

      你可能也喜欢

      3-1665801675
      R语言学习:重读《R数据科学(中文版)》书籍
      28 9月, 2022
      6-1652833487
      经典铁死亡,再出新思路
      16 5月, 2022
      1-1651501980
      R语言学习:阅读《R For Everyone 》(第二版)
      1 5月, 2022

      搜索

      分类

      • R语言
      • TCGA数据挖掘
      • 单细胞RNA-seq测序
      • 在线会议直播预告与回放
      • 数据分析那些事儿分类
      • 未分类
      • 生信星球
      • 老俊俊的生信笔记

      投稿培训

      免费

      alphafold2培训

      免费

      群晖配置培训

      免费

      最新博文

      白介素-17受体信号的自主激活,维持炎症并促进疾病进展
      048月2023
      MCT4依赖的乳酸分泌抑制LKB1缺陷肺腺癌的抗肿瘤免疫
      187月2023
      Nature | 单细胞技术揭示衰老细胞与肌肉再生
      301月2023
      logo-eduma-the-best-lms-wordpress-theme

      (00) 123 456 789

      weinfoadmin@weinformatics.cn

      恒诺新知

      • 关于我们
      • 博客
      • 联系
      • 成为一名讲师

      链接

      • 课程
      • 事件
      • 展示
      • 问答

      支持

      • 文档
      • 论坛
      • 语言包
      • 发行状态

      推荐

      • iHub汉语代码托管
      • iLAB耗材管理
      • WooCommerce
      • 丁香园论坛

      weinformatics 即 恒诺新知。ICP备案号:粤ICP备19129767号

      • 关于我们
      • 博客
      • 联系
      • 成为一名讲师

      要成为一名讲师吗?

      加入数以千计的演讲者获得100%课时费!

      现在开始

      用你的站点账户登录

      忘记密码?

      还不是会员? 现在注册

      注册新帐户

      已经拥有注册账户? 现在登录

      close
      会员购买 你还没有登录,请先登录
      • ¥99 VIP-1个月
      • ¥199 VIP-半年
      • ¥299 VIP-1年
      在线支付 激活码

      立即支付
      支付宝
      微信支付
      请使用 支付宝 或 微信 扫码支付
      登录
      注册|忘记密码?