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

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

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

k-means算法

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

这里的

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

算法步骤:

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

,及随机选取数据集中

个点作为初始点

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

3.将分出来的

类求取平均值,作为新的中心点

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

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

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

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

这里的

表示

个类,

表示第

个中心,

是欧几里得距离。

对第

个中心

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

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

举例说明

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

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

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

Step1:

那我们可以设置

为2,初始中心值就选

Step2:

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

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

距离更近,那现在有了两类:

Step3:

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

。第二类按照5个点的均值作为中心点

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

现在分成的两类为

Step4:

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

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

现在仍然是两类

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

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不足

①需要确定分类数

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

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

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

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

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

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

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  3. k近邻算法原理c语言,实验二 K-近邻算法及应用

    作业信息 一.[实验目的] 理解K-近邻算法原理,能实现算法K近邻算法: 掌握常见的距离度量方法: 掌握K近邻树实现算法: 针对特定应用场景及数据,能应用K近邻解决实际问题. 二.[实验内容] 实现曼 ...

  4. 判断魔方阵c语言程序设计_魔方阵算法及C语言实现

    1 魔方阵概念 2填充的,每一行.每一列.对角线之和均相等的方阵,阶数n = 3,4,5-.魔方阵也称为幻方阵. 例如三阶魔方阵为: 魔方阵有什么的规律呢? 魔方阵分为奇幻方和偶幻方.而偶幻方又分为是 ...

  5. 分类算法——K近邻算法及其R实现

    原理:已知样本集中每一个数据与所属分类的对应关系,输入没有标签的新数据后,将新数据与训练集的数据对应特征进行比较,找出"距离"最近的k(通常k<20)数据,选择这k个数据中出 ...

  6. python 聚类分析 k means

    Kmeans 是一种动态聚类方法,其基本思想是:首先随机选取 K 个点作为初始凝聚点,按照距离最近原则划分为 K 类:然后重新计算 K 个类的重心作为新的凝聚点,再按照距离最近原则重新分类:重复这一过 ...

  7. 最短路径迪杰斯特拉算法 c语言,Dijkstra第K最短路径算法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //运筹学之最短路径 #include #include #define M 99999 int main() { int G[100][100]; in ...

  8. 滑动窗口滤波 c语言,关于中值滤波算法 以及C语言实现

    1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护 ...

  9. lfu算法实现c语言_哈希查找算法(C语言实现)

    上一节介绍了有关哈希表及其构造过程的相关知识,本节将介绍如何利用哈希表实现查找操作.在哈希表中进行查找的操作同哈希表的构建过程类似,其具体实现思路为:对于给定的关键字 K,将其带入哈希函数中,求得与该 ...

最新文章

  1. 腾讯云主机安全防护(云镜卸载)--/usr/local/qcloud/YunJing/YDEyes/YDService
  2. 数列分块入门2(区间小于c的个数)
  3. [C#参考]锁定lock
  4. resultSet.next() 位置处报错:java.lang.OutOfMemoryError: Java heap space
  5. shell脚本学习(3)文件判断
  6. 在Vue项目中引入echarts图表的方法(引入cdn)
  7. 高等代数--线性方程组
  8. k3梅林和官改哪个稳定_要功能还是要稳定 — 斐讯 K3 由LEDE 转战官改ROOT版
  9. 最小平方误差算法(LMSE) python实现
  10. 一张图看懂零维到十维空间
  11. Oralce ERP中AP模块Vender银行信息查询语句
  12. 【转】如何成为一名黑客--Eric Steven Raymond
  13. 36岁大数据人被中台问倒,没点架构思维,连面试都过不了?
  14. Puzzle(自认为是模拟)
  15. 我的博客在百度:http://hi.baidu.com/sunmoonzhangli
  16. 58集团2017校招(第一次正规的笔试)
  17. shell脚本之sed编辑器
  18. 2018最新(传智播客)黑马WEB前端36期全套
  19. 链表-单向链表的实现
  20. 《淘宝店铺设计装修一册通》一2.6 光影魔术手——简单方便的修图工具

热门文章

  1. 无线ap软件_无线WIFI网络干扰优化,不懂必看!新手在家里也能用的网络知识
  2. python seed()
  3. 用python实现远程复制 (scp + expect )
  4. MFC标签页控件的使用
  5. epic转移游戏_Epic游戏商城更改退款政策 和steam一模一样
  6. 深入了解区块链技术及其常见误区
  7. expr命令 linux,Shell expr命令进行整数计算的实现
  8. php js 图片旋转,jQuery实现可以控制图片旋转角度效果
  9. js 提取某()特殊字符串长度
  10. 支援一波 《面试数十人有感》