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. 【二食堂】Alpha - Scrum Meeting 11

    Scrum Meeting 11 例会时间:4.21 18:00~18:20 进度情况 组员 进度 今日任务 李健 1. 登录注册页面前后端对接issue 1. 登录注册页面前后端对接issue2. ...

  2. BUAA_2020_软件工程_提问回顾与总结

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 提问回顾与总结作业要求 我在这个课程的目标 了解软件工程的技术,掌握工程化开发的能力 这个作业在哪 ...

  3. 计算机网络之网络层路由选择协议(自治系统AS、RIP、OSPF、BGP)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105313629 学习课程:<2019王道考研计算机网络> 学习目的 ...

  4. 像素反转 牛客网 程序员面试金典 C++ Python

    像素反转 牛客网 程序员面试金典 题目描述 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度. 给定 ...

  5. AGC036 A-Triangle | 构造

    题目链接 题意: 给出一个数$S(1\leqslant S \leqslant 10^{18})$. 要求在平面直角坐标系中找到三个点$(X_1,Y_1),(X_2,Y_2),(X_3,Y_3)$,满 ...

  6. docker使用redis过程出现的问题记录

    第一次使用docker搭建成功了单机版redis,但在使用过程中,还是遇到了不少问题,故而先把这些问题记录下来,以防后面再出现会忘记. 目前,只是在docker中搭建了三个单机版的容器,打算先捣鼓一周 ...

  7. gitbook的安装

    [前端工具]nodejs+npm+vue 安装 安装 npm install gitbook-cli -g gitbook命令: gitbook init //初始化目录文件 gitbook help ...

  8. VSCode PHP 开发环境配置 详细教程

    VSCode PHP 开发环境配置 详细教程 这篇文章主要介绍了VScode+PHPstudy配置PHP开发环境的步骤,整理了官方以及优秀第三方的内容,对于学习和工作有一定借鉴意义. 配置过程 第一步 ...

  9. NCF 中如何将Function升级到FunctionRender

    简介 历史的车轮在不断的向前推进,NCF也在不断的迭代更新,只为成为更好的NCF 如果你之前没有用过NCF可以跳过这个文档,直接去下载最新的NCF源码进行实践. NCF仓库地址:https://git ...

  10. js深拷贝你还不会吗

    js深拷贝 在讲正题之前我们要先了解数据存储的方式 数据存储方式 在讲之前我们要先知道值类型和引用类型的存储方式. 在JavaScript数据类型中有两种数据类型. 值类型:字符串(String).数 ...