r语言kmodes_聚类分析——k-means算法及R语言实现

我们知道『物以类聚,人以群分』,这里并不是分类问题,而是聚类问题。

两者主要区别在于,分类是将一组数据根据不同的类区分,已经知道有哪些类,也就是数据已经有了类的标签。而聚类是一种事先不知道有多少类,通过算法学习,分出来了一些类别。

分类跟聚类也分别是有监督学习和无监督学习的范畴。

k-means算法

k-means是聚类算法中最简单的,也是最常用的一种方法。

这里的

equation?tex=k 指的是初始规定要将数据集分成的类别,means是各类别数据的均值作为中心点。

算法步骤:

1.初始设置要分成的类别

equation?tex=k ,及随机选取数据集中

equation?tex=k 个点作为初始点

2.根据相似性度量函数将其他点与初始点做比较,离哪个值近就分到哪一个类

3.将分出来的

equation?tex=k 类求取平均值,作为新的中心点

4.重复步骤,直到中心点不变或者变化不大(即收敛)或者达到规定的迭代次数则停止

相似性度量有多种函数,一般使用欧式距离。相似性度量函数

补充:为什么会使用均值作为中心点的选择呢?

这主要是因为目标函数的设置决定的。我们使用误差平方和作为聚类的目标函数,即

equation?tex=SSE

equation?tex=SSE+%3D+%5Csum_%7Bi+%3D+1%7D%5E%7BK%7D%7B%5Csum_%7Bx%5Cin+C_i%7D%7Bdist%28c_i%2C+x%29%7D%7D

这里的

equation?tex=K 表示

equation?tex=K 个类,

equation?tex=c_i 表示第

equation?tex=i 个中心,

equation?tex=i+%3D+1%2C+2%2C+...%2C+K

equation?tex=dist 是欧几里得距离。

对第

equation?tex=k 个中心

equation?tex=c_k 求解,最小化上述公式。对上述公式求导并令导数等于0,得到如下公式:

可以看到,每个簇中能够让目标函数达到最小的中心点就是这个簇的均值。

举例说明

下面以一个具体例子来说明k-means算法步骤。数据集如下。

因为是二维的,可以画下散点图看下。

直观来看,这个数据集是有两类的,也就是两个簇,一个是在右上角,一个是在左下角。可以使用算法看下是否符合预判。

Step1:

那我们可以设置

equation?tex=k 为2,初始中心值就选

equation?tex=P1%2C+P2

Step2:

下面就是计算剩下的点到中心点的距离,使用欧氏距离。

比较之后,发现剩下的点到

equation?tex=P2 距离更近,那现在有了两类:

equation?tex=P1

equation?tex=P2%2C+P3%2C+P4%2C+P5%2C+P6

Step3:

然后重新选择中心点,第一类只有一个值,则仍然为

equation?tex=P1 。第二类按照5个点的均值作为中心点

equation?tex=P%2A : ((1+3+8+9+10)/5, (2+1+8+10+7)/5) = (6.2,5.6)。重新计算距离。

现在分成的两类为

equation?tex=P1%2C+P2%2C+P3

equation?tex=P4%2C+P5%2C+P6

Step4:

Step2和Step3中心点相差较大,重新选择中心点。

这次就是两个类中数据的均值作为新的中心点了。分别为

equation?tex=P%2A%2A+%3D+%281.33%EF%BC%8C1%29%2C+P%2A%2A%2A+%3D+%289%EF%BC%8C8.33%29

现在仍然是两类

equation?tex=P1%2C+P2%2C+P3

equation?tex=P4%2C+P5%2C+P6

继续下去,中心点不变,也就是达到收敛了。分成的两类就是上面两组,与散点图观察到的一致。

R语言实现

使用R语言自带的函数及可视化包。

数据及包的准备

# 载入数据

data("USArrests")

# 数据标准化

data

head(data)

# 可视化包

library(factoextra)

确定最佳聚类数,选择坡度不明显的点作为聚类数。

# 确定聚类数

fviz_nbclust(data, kmeans, method = "wss") + geom_vline(xintercept = 4, linetype = 2)

# 另一种方法

wss

for (i in 2:15)

wss[i]

plot(1:15, wss, type="b", xlab="Number of Clusters",ylab="Within groups sum of squares")

可以选择4个类别。下面进行聚类。

#利用k-mean是进行聚类

km

# 查看结果

print(km)

查看结果并分析数据:print(km)

K-means clustering with 4 clusters of sizes 13, 16, 8, 13

Cluster means:

Murder Assault UrbanPop Rape

1 0.6950701 1.0394414 0.7226370 1.27693964

2 -0.4894375 -0.3826001 0.5758298 -0.26165379

3 1.4118898 0.8743346 -0.8145211 0.01927104

4 -0.9615407 -1.1066010 -0.9301069 -0.96676331

Clustering vector:

Alabama Alaska Arizona Arkansas

3 1 1 3

California Colorado Connecticut Delaware

1 1 2 2

Florida Georgia Hawaii Idaho

1 3 2 4

Illinois Indiana Iowa Kansas

1 2 4 2

Kentucky Louisiana Maine Maryland

4 3 4 1

Massachusetts Michigan Minnesota Mississippi

2 1 4 3

Missouri Montana Nebraska Nevada

1 4 4 1

New Hampshire New Jersey New Mexico New York

4 2 1 1

North Carolina North Dakota Ohio Oklahoma

3 4 2 2

Oregon Pennsylvania Rhode Island South Carolina

2 2 2 3

South Dakota Tennessee Texas Utah

4 3 1 2

Vermont Virginia Washington West Virginia

4 2 2 4

Wisconsin Wyoming

4 2

Within cluster sum of squares by cluster:

[1] 19.922437 16.212213 8.316061 11.952463

(between_SS / total_SS = 71.2 %)

Available components:

[1] "cluster" "centers" "totss" "withinss"

[5] "tot.withinss" "betweenss" "size" "iter"

[9] "ifault"

第一行结果是4类,每个类别的数据个数。

下面是聚类的中心点。

然后是每个值所属哪个类别。

Within cluster sum of squares by cluster:是组间距离平方和。

聚类的目的是组内距离小,组间距离大。between_SS / total_SS就是组间距离占总距离的占比,越接近1越好。

聚类可视化

fviz_cluster(km, data = data,

palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),

ellipse.type = "euclid",

star.plot = TRUE,

repel = TRUE,

ggtheme = theme_minimal()

)

k-means不足

①需要确定分类数

equation?tex=k ,一般根据经验或者已经有预判,其次是根据上面的方法确定分类数量。

②初始值的选取会影响最终聚类效果,并且目标函数

equation?tex=SSE 可能会达到局部最优解。这个有相应的改进方法,包括k-means++和二分k-means。

③对于类似下面圆形的数据集,聚类效果很差,主要是算法原因。所以还有其他的聚类算法,比如基于密度的方法等。

不过k-means实现简单,易于理解,应用很广泛。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode安装jshint插件报错

Mac电脑上使用VSCode安装jshint插件时提示如下错误: Failed to load jshint library. Please install jshint in your workspace folder using npm install jshint or globally using npm install -g jshint and then press Retry. 按照提示,使用np…

集合框架总结

2019作为新的一年开始,我也着手面试的准备。这篇的博客的主角集合--面试中都会出现的,所以今天特作此总结,也算是复习的成果的一个展示。在查看了许多的博客和源码后我决定将其分成3部分来总结。 三个部分分别是:集合的分类、各个…

调查内存泄漏第2部分–分析问题

这个小型系列的第一个博客介绍了如何创建一个非常泄漏的示例应用程序,以便我们可以研究解决服务器应用程序上基于堆的问题的技术。 它展示了Producer-Consumer模式的一个大问题,即消费者代码必须能够至少与生产者一样快(如果不是更快&#xf…

调查内存泄漏第1部分–编写泄漏代码

前几天,我发现了这个小问题:该服务器运行了一段时间,然后掉下来了。 然后通过启动脚本重新启动,整个过程重复进行。 这听起来并不那么糟糕,尽管对数据的损失很大,但对业务的重要性并不重要,因此…

[NOIP2013]火柴排队

嘟嘟嘟 首先可以想到,最小距离一定是a中第 i 大的和b中第 i 大的在同一行。 然后先把a,b分别离散化,然后开一个标记数组,map[i]记录a中第 i 小的数在哪一个位置出现,然后对b数组处理一遍。 题中说交换次数,…

2018秋季C语言学习总结

转载于:https://www.cnblogs.com/noacgnnolife/p/10413255.html

解决Charles手机安装SSL证书后,获取到的接口为unknown,且乱码问题

按照正常流程将Charles安装并设置代理后,手机添加完代理并安装SSL证书,尝试抓取接口时,获取到的接口为unknown且返回内容乱码,如下图所示 解决办法: 在Proxy-SSL Proxying Settings-SSL Proxying下添加想要抓取的服务地…

Sum of Even Numbers After Queries

Solution: 转载于:https://www.cnblogs.com/Julietma/p/10414394.html

Python学习week7-文件操作

1、文件IO常用操作 # 文件操作命令 2、打开操作open # open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone) 创建并打开一个文件test,然后关闭;打开一个文件,返回一个文件对象(流对…

风险定量分析工具 龙卷风图 决策树形图 蒙特卡洛模拟

龙卷风图:是项目管理中用于在风险识别和定性分析之后,进行定量风险分析的技术----敏感性分析技术中最常用的一种图表技术。 敏感性分析:敏感性分析有助于确定哪些风险对项目具有最大的潜在影响。它把所有其他不确定因素保持在基准值的条件下…

推土机:将JAXB对象映射到业务/域对象

Dozer是开放源代码( Apache 2许可 )“ Java Bean到Java Bean映射器,可将数据从一个对象递归复制到另一个对象”。 正如从其主页上的描述所描述的那样,它用于映射两个JavaBeans实例,以在实例之间进行自动数据复制。 尽管…

openssl不是内部或外部命令_OpenSSL新架构蓝图

概述日前OpenSSL官网公布了未来OpenSSL的架构蓝图。作为战略性的架构目标,需要大量的版本迭代本文档概述了OpenSSL战略架构。它需要多个版本的迭代从目前最新的版本1.1开始直到3.0甚至是4.0最终实现。由于版本架构变动非常大,涉及大量的变化和迭代&#…

休眠事实:始终检查Criteria API SQL查询

Criteria API对于动态构建查询非常有用,但这是我使用它的唯一用例。 每当您有一个带有N个过滤器且可以以任意M个组合到达的UI时,都有一个API动态构造查询是有意义的,因为串联字符串始终是我所不愿使用的路径。 问题是,您是否知道…

treegrid,可以展开的jqgrid树

效果图 html部分 <div class"padding20 bgWhite marginTop20"> <div class"cus-grid row" id"grid-wrap"> <div class"col-lg-12"> <table id"list2"></table> …

winfrom软件开发汽车测试_ETci — 全自动软件测试调度(持续集成)平台

ETci 提供了编译- 测试- 发布解决方案&#xff0c;包括&#xff1a;自动提取配置库代码进行自动构建, 自动调度静态测试工具(如QAC)进行静态测试&#xff0c;自动调度单元测试工具(如Tessy)开展动态测试&#xff0c;自动调度HIL 自动化测试系统等。使得开发、测试团队在软件开发…

在POJO中使用ThreadLocal的Java嵌套事务

大多数嵌套事务是使用EJB实现的&#xff0c;现在我们尝试在POJO上实现嵌套事务。 在这里&#xff0c;我们使用了ThreadLocal的功能。 了解嵌套事务 事务可以嵌套在另一个内部。 因此&#xff0c;内部事务或外部事务可以回滚或提交&#xff0c;而不会影响其他事务。 创建新事务…

HTML存储详解

和大家一起先来了解一下H5之前的存储方式&#xff1a; cookies的诞生&#xff1a; http请求头上带着数据大小只能为4K主Domain的污染 下面是百度的一些Cookies HTTP中带√的表示&#xff0c;只能被服务器端修改的数据&#xff0c;一般用来存储身份验证等信息 cookies造成了…

springboot 工程启动报错之Consider defining a bean of type ‘XXX’ in your configuration.

一、前言&#xff1a; 使用springboot自动注入的方式搭建好了工程&#xff0c;结果启动的时候报错了&#xff01;&#xff01;&#xff01;&#xff0c;错误如下图&#xff1a; Description:Field userEntityMapper in com.xxx.xxx.service.UserService required a bean of typ…

java 自定义报表_灵活数据分析 | 自定义数据分析_集力数据系统平台_Java报表系统软件...

灵活数据分析集力数据系统数据分析是立足于让终端用户即使不懂专业计算机技术也能即时定义报表和分析数据的工具。用户只需关心业务需要&#xff0c;无需关心技术实现&#xff0c;通过拖拖拽拽、点点选选即可轻松制作列表式报表、分组报表、交叉报表、自由报表、组合报表等并进…

(1-1)line-height的定义和行内框盒子模型

&#xff08;1-1&#xff09;line-height的定义和与行内框盒子模型的关系 一、line-height的定义 line-height的定义&#xff1a; 行高&#xff0c;又称为两基线的距离。默认基线对齐&#xff08;因为CSS所有*线&#xff1a;总之就是各种定义的线都是和基线对齐的&#xff09…