【机器学习与R语言】11- Kmeans聚类
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聚类的更多相关文章
- 数据分析与挖掘 - R语言:K-means聚类算法
一个简单的例子!环境:CentOS6.5Hadoop集群.Hive.R.RHive,具体安装及调试方法见博客内文档. 1.分析题目--有一个用户点击数据样本(husercollect)--按用户访问的 ...
- 【机器学习与R语言】7-回归树和模型树
目录 1.理解回归树和模型树 2.回归树和模型树应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理解回归树和模型树 决策树用于数值预测: 回归树:基于到达 ...
- 【机器学习与R语言】13- 如何提高模型的性能?
目录 1.调整模型参数来提高性能 1.1 创建简单的调整模型 2.2 定制调整参数 2.使用元学习来提高性能 2.1 集成学习(元学习)概述 2.2 bagging 2.3 boosting 2.4 ...
- 【机器学习与R语言】12- 如何评估模型的性能?
目录 1.评估分类方法的性能 1.1 混淆矩阵 1.2 其他评价指标 1)Kappa统计量 2)灵敏度与特异性 3)精确度与回溯精确度 4)F度量 1.3 性能权衡可视化(ROC曲线) 2.评估未来的 ...
- 【机器学习与R语言】10- 关联规则
目录 1.理解关联规则 1)基本认识 2)Apriori算法 2.关联规则应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解关联规则 1)基本认识 购物 ...
- 【机器学习与R语言】9- 支持向量机
目录 1.理解支持向量机(SVM) 1)SVM特点 2)用超平面分类 3)对非线性空间使用核函数 2. 支持向量机应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 ...
- 【机器学习与R语言】8- 神经网络
目录 1.理解神经网络 1)基本概念 2)激活函数 3)网络拓扑 4)训练算法 2.神经网络应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 1.理解神经网络 1) ...
- 【机器学习与R语言】6-线性回归
目录 1.理解回归 1)简单线性回归 2)普通最小二乘估计 3)相关系数 4)多元线性回归 2.线性回归应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理 ...
- 【机器学习与R语言】5-规则学习算法
目录 1.分类规则原理 1.1 1R单规则算法 1.2 RIPPER算法 2. 规则学习应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估性能 5)提高性能 6)选择决策树中的分类规则 ...
随机推荐
- [no code][scrum meeting] Alpha 15
项目 内容 会议时间 2020-04-23 会议主题 OCR紧急会议 会议时长 45min 参会人员 PM + OCR组(赵涛,黎正宇) 项目 内容 会议时间 2020-04-24 会议主题 全体测试 ...
- FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2
OAuth2 规定在使用(我们打算用的)「password 流程」时,客户端/用户必须将 username 和 password 字段作为表单数据发送.我们看下在我们应该去如何实现呢. 我们写一个登录 ...
- 单片机入门stm32知识学习的先后顺序
这里大概的罗列了一些学习STM32的内容,以及学习顺序.如果是新手的话,建议边看中文手册和学习视频;如果是已经入门的,个人建议自己做一个项目,不论项目大小,当然里面会涉及到自己已经学习过的,或者是自己 ...
- Nginx(一):初识Nginx
一.什么是Nginx? Nginx 是异步框架的Web服务器,也可以用作反向代理.负载平衡器和HTTP缓存.选择Nginx的一些优点:可以高并发连接.内存消耗少.成本低廉.配置文件简单.节省带宽.稳定 ...
- centos7 二进制安装mysql-8.0.19
安装包下载地址:https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz 1.检 ...
- 完美解决Github网页打开超慢的问题
由于某些原因,国内访问Github会异常缓慢,在clone仓库时甚至只有10k以下的速度,下载半天有时还会失败需要从头再来,甚是让人恼火.本文介绍通过修改系统hosts文件的办法,绕过国内dns解析, ...
- webpack 配置devServer 服务器
webpack 配置devServer 服务器 /** * loader: 1. 下载 2. 使用(配置) * plugins:1. 下载 2. 引入 3.使用 */ // 用来拼接绝对路径的方法 c ...
- pyinstaller打包:AttributeError: module ‘win32ctypes.pywin32.win32api’ has no attribute ‘error’
pyinstaller打包:AttributeError: module 'win32ctypes.pywin32.win32api' has no attribute 'error' 是因为pyin ...
- JDK 之 Arrays.asList - 源码分析
Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List . 其源代码如下: @SafeVarargs public static <T> Lis ...
- VM的三种连接方式(转载)
概述: VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模 ...