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. Java继承中父类和子类构造函数的问题

    父类有无参构造函数时(显示或隐式),子类的有参和无参构造函数都是默认调用父类的无参构造函数:当父类只有有参构造函数时,子类可以有有参和无参构造函数,子类有参构造函数必须显式调用父类的有参构造函数,子类 ...

  2. Coursera Deep Learning笔记 结构化机器学习项目 (上)

    参考:https://blog.csdn.net/red_stone1/article/details/78519599 1. 正交化(Orthogonalization) 机器学习中有许多参数.超参 ...

  3. Noip模拟17 2021.7.16

    我愿称这场考试为STL专练 T1 世界线 巧妙使用$bitset$当作vis数组使用,内存不会炸,操作还方便,的确是极好的. 但是这个题如果不开一半的$bitset$是会炸内存的,因为他能开得很大,但 ...

  4. IDEA插件开发,我是如何把公司的发布系统搬到IDEA里的

    不得不说JetBrains公司直的非常的牛B,每一个程序员都能在JetBrains的官方网站找到一款属于自己的开发工具.这些开发工具在工作中给我们带来了巨大的便利.各种各样的基础插件,第三方插件,真是 ...

  5. Netty:Netty的介绍以及它的核心组件(一)—— Channel

    1. Netty 介绍 Netty 是一个无阻塞的输入/输出(NIO)框架,它使开发低级网络服务器和客户端变得相对简单.Netty为需要在套接字级别上工作的开发人员提供了令人难以置信的强大功能,例如, ...

  6. reorder-list leetcode C++

    Given a singly linked list L: L 0→L 1→-→L n-1→L n, reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→- You ...

  7. Docker+nginx搭建tomcat集群

    1.环境准备: a.宿主机CentOS7 b.连接工具FinalShell c.镜像nginx1.20.1,tomcat (镜像拉取:docker pull 镜像名称) 2.创建nginx文件夹,to ...

  8. JMH 使用指南

    简介 JMH(Java Microbenchmark Harness)是用于代码微基准测试的工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级.该工具是由 Oracle 内部实现 JIT 的大 ...

  9. Java-基础-HashMap

    1. 简介 Java8 HashMap结构(数组 + 列表 + 红黑树)如图: 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和 ...

  10. MSSQL SQL注入 总结

    0x00 MSSQL 基础 MSSQL系统自带库和表 系统自带库 MSSQL安装后默认带了6个数据库,其中4个系统级库:master,model,tempdb和msdb:2个示例库:Northwind ...