1.理解Kmeans聚类

1)基本概念

  • 聚类:无监督分类,对无标签案例进行分类。
  • 半监督学习:从无标签的数据入手,是哦那个聚类来创建分类标签,然后用一个有监督的学习算法(如决策树)来寻找这些类中最重要的预测指标。
  • kmeans聚类算法特点:

  • kmeans算法涉及将n个案例中的每一个案例分配到指定k个类中的一个(指定k是为了最小化每个类内部差异,最大化类之间的差异)。
  • 为避免遍历案例所有可能的组合来计算最优聚类,kemans使用了局部最优解的启发式过程,即对初始的类分配进行修正来判断是否提升了类内部的同质性。
  • kmeans聚类的两个阶段:一是将案例分配到初始的k个类中;二是根据落入当前类的案例调整类的边界来更新分配。重复更新和分配多次,直到改变不会提升类的优度为止。
  • 可通过尝试多次不同k的聚类分析来测试研究结果的稳健性。

2)kmeans运作的基本原理

①使用距离来分配和更新类

  • 初始类中心的选择:从训练集中选择的k个随机案例来确定;或者选择发生再特征空间任意地方的随机值(而不是只在数据的观测值之间进行选择);或者完全跳过这一步,通过将每个案例随机分配到一个类中,直接进入更新阶段。
  • 选择初始类中心之后,其他的案例将分配到与其最相似,或者根据距离函数最相近的类中心。距离函数如欧氏距离、曼哈顿距离、闵可夫斯基距离等。
  • 距离计算的数据必须是数值型,且需要标准化,计算的是每一个案例与每一个类中心之间的距离。
  • 更新类:将初始的类中心转移到一个新的位置(“质心”,通过计算分配到当前类的各点的均值来获得)。类中心改变之后,类的边界发生变化,案例重新分配,如此反复更新,直到没有额外的案例被重新分配为止,聚类最终完成。
  • 聚类结果的表达:一是可以报告每个案例的分配情况;二是可以报告最后一次更新之后的质心的坐标。



运算过程如下:

指定k=3,选择初始类中心



计算距离,归类



更新类中心,重新分配



第二轮更新阶段,重新分配



最终聚类结果

②选择适当的聚类数

  • kmeans算法对于随机选择的聚类中心很敏感。选择类的数目需要一种微妙的平衡:大k会提升类的同质性,但有过拟合的风险。
  • 理想情况下,最好有一些关于真实分组的先验知识。有时k也由业务需求或分析动机所决定。
  • 若没有任何先验知识,经验规则就是k设为n/2的平方根(n是全部案例总数),对于大的数据集一般偏大。
  • “肘部法”度量不同k值:找到一个k(肘部点),使得高于该值之后的收益会发生递减。

  • 但在实际中,反复测试大量的k值是不可行的。不要要求最严格的性能,获得类最优解集。大部分应用中,选择一个k就够了。

2.Kmeans聚类应用示例

探寻青少年市场细分

1)收集数据

30000名美国高中生的随机案例数据集,在知名社交网络服务中保存了他们的个人资料。将网站页面内容划分单词,36个单词被选来代表5大兴趣类。每个案例包括4个个人特征(毕业年份,性别,年龄,交友数)和36种兴趣。

数据下载:

链接: https://pan.baidu.com/s/1CGkaRPc3glCjI-hWWg1Kug 提取码: 74bm

2)探索和准备数据

包括缺失值的查看,缺失值的虚拟编码和缺失值插补等。

## Step 2: Exploring and preparing the data ----
teens <- read.csv("snsdata.csv")
str(teens) # look at missing data for female variable
table(teens$gender)
table(teens$gender, useNA = "ifany") #计数缺失值 # look at missing data for age variable
summary(teens$age) #包含缺失值统计 # eliminate age outliers
teens$age <- ifelse(teens$age >= 13 & teens$age < 20,
teens$age, NA) summary(teens$age) # reassign missing gender values to "unknown"
teens$female <- ifelse(teens$gender == "F" &
!is.na(teens$gender), 1, 0)
teens$no_gender <- ifelse(is.na(teens$gender), 1, 0) # check our recoding work
table(teens$gender, useNA = "ifany")
table(teens$female, useNA = "ifany")
table(teens$no_gender, useNA = "ifany") # finding the mean age by cohort
mean(teens$age) # doesn't work
mean(teens$age, na.rm = TRUE) # works # age by cohort
aggregate(data = teens, age ~ gradyear, mean, na.rm = TRUE) # create a vector with the average age for each gradyear, repeated by person
# ave函数返回一个具有重复的组均值的向量,使得结果在长度上等于原始向量的长度
ave_age <- ave(teens$age, teens$gradyear,
FUN = function(x) mean(x, na.rm = TRUE)) teens$age <- ifelse(is.na(teens$age), ave_age, teens$age) # check the summary results to ensure missing values are eliminated
summary(teens$age)

3)训练模型

使用基础包的kmeans函数。注意将特征标准化,这里用z-score标准化。

另一个就是k值的指定,比如对人口分析很熟悉,或者对关于自然分组的真是数量有一些预感,也可参考一些资料等,我们将符合年龄的高中生特征确定为5个典型类型(聪明人,运动员,公主,罪犯,无特征)。

## Step 3: Training a model on the data ----
interests <- teens[5:40]
interests_z <- as.data.frame(lapply(interests, scale)) set.seed(2345)
teen_clusters <- kmeans(interests_z, 5)

4)评估性能

模型的成功与否在于类对于预期目的是否有用。评估一个类是否有用的最基本方法之一就是检查落在每一组中的案例数,数目过多或过少(如1个或几个),则这些类不太有用。

为深入了解类,可查看聚类质心的坐标。因为已经做了z-score标准化,所以负值表示低于总体均值,正值表示高于总体均值。

## Step 4: Evaluating model performance ----
# look at the size of the clusters
teen_clusters$size # look at the cluster centers
teen_clusters$centers

通过研究类在特征(兴趣)中的表现,可以构建有一个表来列出每组中的主要兴趣项:

5)提高模型性能

根据聚类结果,可以确定每个案例被分配到了哪一类中,再探究不同的类在原始数据中各特征的差异。

## Step 5: Improving model performance ----
# apply the cluster IDs to the original data frame
teens$cluster <- teen_clusters$cluster # look at the first five records
teens[1:5, c("cluster", "gender", "age", "friends")] # mean age by cluster
aggregate(data = teens, age ~ cluster, mean) # proportion of females by cluster
aggregate(data = teens, female ~ cluster, mean) # mean number of friends by cluster
aggregate(data = teens, friends ~ cluster, mean)

年龄、性别、朋友数量之间的关系表明,这些类是有用的预测因子,以这种方式来验证这些类的预测能力。


机器学习与R语言系列推文汇总:

【机器学习与R语言】1-机器学习简介

【机器学习与R语言】2-K近邻(kNN)

【机器学习与R语言】3-朴素贝叶斯(NB)

【机器学习与R语言】4-决策树

【机器学习与R语言】5-规则学习

【机器学习与R语言】6-线性回归

【机器学习与R语言】7-回归树和模型树

【机器学习与R语言】8-神经网络

【机器学习与R语言】9-支持向量机

【机器学习与R语言】10-关联规则

【机器学习与R语言】11-Kmeans聚类

【机器学习与R语言】12-如何评估模型的性能?

【机器学习与R语言】13-如何提高模型的性能?

【机器学习与R语言】11- Kmeans聚类的更多相关文章

  1. 数据分析与挖掘 - R语言:K-means聚类算法

    一个简单的例子!环境:CentOS6.5Hadoop集群.Hive.R.RHive,具体安装及调试方法见博客内文档. 1.分析题目--有一个用户点击数据样本(husercollect)--按用户访问的 ...

  2. 【机器学习与R语言】7-回归树和模型树

    目录 1.理解回归树和模型树 2.回归树和模型树应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理解回归树和模型树 决策树用于数值预测: 回归树:基于到达 ...

  3. 【机器学习与R语言】13- 如何提高模型的性能?

    目录 1.调整模型参数来提高性能 1.1 创建简单的调整模型 2.2 定制调整参数 2.使用元学习来提高性能 2.1 集成学习(元学习)概述 2.2 bagging 2.3 boosting 2.4 ...

  4. 【机器学习与R语言】12- 如何评估模型的性能?

    目录 1.评估分类方法的性能 1.1 混淆矩阵 1.2 其他评价指标 1)Kappa统计量 2)灵敏度与特异性 3)精确度与回溯精确度 4)F度量 1.3 性能权衡可视化(ROC曲线) 2.评估未来的 ...

  5. 【机器学习与R语言】10- 关联规则

    目录 1.理解关联规则 1)基本认识 2)Apriori算法 2.关联规则应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解关联规则 1)基本认识 购物 ...

  6. 【机器学习与R语言】9- 支持向量机

    目录 1.理解支持向量机(SVM) 1)SVM特点 2)用超平面分类 3)对非线性空间使用核函数 2. 支持向量机应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 ...

  7. 【机器学习与R语言】8- 神经网络

    目录 1.理解神经网络 1)基本概念 2)激活函数 3)网络拓扑 4)训练算法 2.神经网络应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 1.理解神经网络 1) ...

  8. 【机器学习与R语言】6-线性回归

    目录 1.理解回归 1)简单线性回归 2)普通最小二乘估计 3)相关系数 4)多元线性回归 2.线性回归应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理 ...

  9. 【机器学习与R语言】5-规则学习算法

    目录 1.分类规则原理 1.1 1R单规则算法 1.2 RIPPER算法 2. 规则学习应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估性能 5)提高性能 6)选择决策树中的分类规则 ...

随机推荐

  1. py3.8安装

    ubantu python3.8# 命令下载wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tar.xz#解压tar -xvJf P ...

  2. [no code][scrum meeting] Beta 10

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月25日15:00,主持者:伦泽标 下次例会时间:5月26日11:30,主持者: 一.工作汇报 ...

  3. [对对子队]会议记录4.21(Scrum Meeting12)

    今天已完成的工作 吴昭邦 ​ 工作内容:基本实现改变顺序合成 ​ 相关issue:实现流水线合成系统的逻辑 ​ 相关签入:4.21签入1 梁河览 ​ 工作内容:修改设置界面bug ​ 相关签入:4.2 ...

  4. Flutter的环境配置以及一些常见问题

    flutter & AndroidStudio flutter的下载与配置 flutter是Google推出的基于Dart语言开发的跨平台开源UI框架,能够支持安卓与iOS. flutter框 ...

  5. BUAA 软工 | 从计算机技术中探索艺术之路

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 掌握软件开发方法学和工程学知识 这个作业在哪个具体方面帮 ...

  6. 数组中重复的数字 牛客网 剑指Offer

    数组中重复的数字 牛客网 剑指Offer 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中 ...

  7. binary-tree-postorder-traversal leetcode C++

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

  8. Luogu P2982 [USACO10FEB]慢下来 Slowing down | dfs序、线段树

    题目链接 题目大意: 有一棵N个结点树和N头奶牛,一开始所有奶牛都在一号结点,奶牛们将按从编号1到编号N的顺序依次前往自己的目的地,求每头奶牛在去往自己目的地的途中将会经过多少已经有奶牛的结点. 题解 ...

  9. springboot使用之请求参数与基本注解

    @PathVariable 作用:@PathVariable是spring3.0的一个新功能:接收请求路径中占位符的值,将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariabl ...

  10. 监控框架 - prometheus - 参数指标

    基于SpringBoot2.0+ Actuator metrics的监控(基于Oracle JDK9,G1) 引言 SpringBoot2在spring-boot-actuator中引入了microm ...