我们之前经常提起的K-means算法虽然比较经典,但其有不少的局限,为了改变K-means对异常值的敏感情况,我们介绍了K-medoids算法,而为了解决K-means只能处理数值型数据的情况,本篇便对K-means的变种算法——K-modes进行简介及Python、R的实现:

K-modes是数据挖掘中针对分类属性型数据进行聚类采用的方法,其算法思想比较简单,时间复杂度也比K-means、K-medoids低,大致思想如下:

假设有N个样本,共有M个属性,均为离散的,对于聚类数目标K:

step1:随机确定k个聚类中心C1,C2...Ck,Ci是长度为M的向量,Ci=[C1i,C2i,...,CMi]

step2:对于样本xj(j=1,2,...,N),分别比较其与k个中心之间的距离(这里的距离为不同属性值的个数,假如x1=[1,2,1,3],C1=[1,2,3,4]x1=[1,2,1,3],C1=[1,2,3,4],那么x1与C1之间的距离为2)

step3:将xj划分到距离最小的簇,在全部的样本都被划分完毕之后,重新确定簇中心,向量Ci中的每一个分量都更新为簇i中的众数

step4:重复步骤二和三,直到总距离(各个簇中样本与各自簇中心距离之和)不再降低,返回最后的聚类结果

下面对一个简单的小例子在Python与R中的K-modes聚类过程为例进行说明:

Python

我们使用的是第三方包kmodes中的方法,具体过程如下:

import numpy as np
from kmodes import kmodes '''生成互相无交集的离散属性样本集'''
data1 = np.random.randint(1,6,(10000,10))
data2 = np.random.randint(6,12,(10000,10)) data = np.concatenate((data1,data2)) '''进行K-modes聚类'''
km = kmodes.KModes(n_clusters=2)
clusters = km.fit_predict(data) '''计算正确归类率'''
score = np.sum(clusters[:int(len(clusters)/2)])+(len(clusters)/2-np.sum(clusters[int(len(clusters)/2):]))
score = score/len(clusters)
if score >= 0.5:
print('正确率:'+ str(score))
else:
print('正确率:'+ str(1-score))

R

在R中进行K-modes聚类的包为klaR,用其中的kmodes(data,modes=k)进行聚类,其中modes为指定的类数目k,具体示例如下:

> library(klaR)
>
> data1 <- matrix(sample(1:3,size=1000,replace = T),nrow=100)
> data2 <- matrix(sample(4:6,size=1000,replace = T),nrow=100)
> data <- rbind(data1,data2)
>
> km <- kmodes(data, modes=2)
> s <- km$cluster
> if(mean(s[1:100] < 1.5)){
+ score <- sum(s[1:100])+sum(s[101:200]-1)
+ score <- score/200
+ cat('正确率:',score)
+ }else{
+ score <- sum(s[1:100]-1)+sum(s[101:200])
+ score <- score/200
+ cat('正确率:',round(score,3))
+ }
正确率: 0.995

以上便是关于K-modes聚类的简要介绍,如有错误望指出。

最新文章

  1. Sublime插件:
  2. 深入理解DOM事件机制系列第一篇——事件流
  3. 解决: maven编译项目报“非法字符: \65279 ”错误
  4. [NOIP2010] 提高组 洛谷P1514 引水入城
  5. 【QT】找茬外挂制作
  6. C#多线程与UI响应 跨线程更新UI
  7. iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):4 同步编码
  8. boost库在windows下的编译和使用
  9. java学习笔记 (6) —— 文件上传
  10. MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法
  11. Core Graphics 和Quartz 2D的区别
  12. SEO页面优化以及如何对单页面应用进行SEO优化
  13. leetCode刷题(找到两个数组拼接后的中间数)
  14. [Swift]LeetCode259.三数之和较小值 $ 3Sum Smaller
  15. sass进阶—函数
  16. vue中路由懒加载实现amd加载文件
  17. spring中BeanFactory和FactoryBean的区别
  18. Angular2入门:TypeScript的类 - 定义、继承和作用域
  19. gbk文件转为utf8文件
  20. 远程调试Hadoop

热门文章

  1. django视图函数解析(三)
  2. 调试一个Ext打开的window窗口内嵌Iframe的form提交问题
  3. MAVEN本地下载、安装
  4. JVM 虚拟机内存深入探究
  5. centos7 编译安装nginx1.16.0( 完整版 )
  6. 【洛谷P2921】[USACO08DEC]在农场万圣节
  7. pdf.js 在线阅读PDF
  8. SpringBoot非官方教程 | 第十九篇: 验证表单信息
  9. Python基础—08-函数使用(02)
  10. c#冒泡排序算法和快速排序算法