K均值聚类是一种无监督学习分类算法。

介绍

  对于$n$个$m$维特征的样本,K均值聚类是求解最优化问题:

$\displaystyle C^*=\text{arg}\min\limits_{C}\sum\limits_{l = 1}^K\sum\limits_{x\in C_l}||x-x_l||^2$

  其中$C$表示某种样本的划分方式,$x\in C_l$表示被划分在第$l$类的样本,$x_l$表示被划分在第$l$类的所有样本的中心,也就是均值。所以上式表示最小化所有类别内样本到其对应的类别样本均值的距离之和。最优化这个问题是NP难问题,所以现实采用类似贪心的迭代算法来逼近最优解(不一定最优)。具体流程如下(每个样本只能属于一个类别):

  0、初始化$K$个类的均值为随机$m$维向量。

  1、将每个样本划分到与之距离最小的类别均值对应的类别中。

  2、根据划分进的样本,每个类别重新计算类别均值,并记录。

  3、比较连续两次的类别均值,如果差别小于一定阈值就结束,否则回到1。

  通过计算可以知道时间复杂度是$O(mnk)$。

代码实现

Numpy手动实现

  首先使用由正态分布生成的两簇点集来实验,每个簇各200个点。可能由于这两个点集比较靠近,所以分类完全错误,如图:

  重新生成5簇正态分布点集,这次每个集合之间相对较远,除了少数没有正确聚类外(两类交汇处),表现不错:

  代码如下:

#%%获取数据
import matplotlib.pyplot as plt
import numpy as np
import xlrd table = xlrd.open_workbook('test.xlsx').sheets()[0]#读取Excel数据
data = []
for i in range(0,table.nrows):#假设第一行是表头不读入
data.append(table.row_values(i))
data = np.array(data)
#%%聚类
def distance(a,b):
d = a-b
return np.dot(d,d)
def clusterize(data,class_m):#关于类均值对样本分类
for i in data:
min_dis = np.inf
for j in range(len(class_m)):
t = distance(i[:-1],class_m[j])
if t<min_dis:
min_dis=t
i[-1]=j def calc_mean(data,class_m):#以类中样本计算均值
class_m -= class_m
num = np.zeros([len(class_m)])
for i in data:
num[int(i[-1])]+=1
class_m[int(i[-1])]+=i[:-1]
for i in range(len(class_m)):
class_m[i]/=num[i]
def updated_mean(dif):#计算前后两次更新的均值距离,传入前后差值
sum_ = 0
for i in dif:
sum_ += np.dot(i,i)
return sum_
def k_means_cluster(data,K):
class_mean = data[0:K,:-1]
class_mean_old = -class_mean
t = updated_mean(class_mean-class_mean_old)
ii = 0
while t>0.0001:
class_mean_old = class_mean.copy()
clusterize(data,class_mean)
print(class_mean)
print(class_mean_old)
calc_mean(data,class_mean)
print(class_mean)
print(class_mean_old)
t = updated_mean(class_mean-class_mean_old)
print(t)
ii+=1
print(ii)
data1 = data.copy()
np.random.shuffle(data1)
k_means_cluster(data1,5) #要分几类直接这里设置################################## #%%绘制结果
import matplotlib.pyplot as plt fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.scatter(data1[:,0],data1[:,1],c = data1[:,-1])
ax1.set_title("K-Means")
ax2.scatter(data[:,0],data[:,1],c = data[:,-1])
ax2.set_title("Should be")
plt.show()

Sklearn

  使用封装好的Sklearn,代码如下:

#%%获取数据
import matplotlib.pyplot as plt
import numpy as np
import xlrd table = xlrd.open_workbook('test.xlsx').sheets()[0]#读取Excel数据
data = []
for i in range(0,table.nrows):#假设第一行是表头不读入
data.append(table.row_values(i))
data = np.array(data)
#%%聚类
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=5)
kmeans.fit(data[:,:-1])
y = kmeans.predict(data[:,:-1])
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.scatter(data[:,0],data[:,1],c = y)
ax1.set_title("K-Means")
ax2 = fig.add_subplot(122)
ax2.scatter(data[:,0],data[:,1],c=data[:,-1])
ax2.set_title("Should be")
plt.show()

  结果图:

K均值聚类和代码实现的更多相关文章

  1. 5-Spark高级数据分析-第五章 基于K均值聚类的网络流量异常检测

    据我们所知,有‘已知的已知’,有些事,我们知道我们知道:我们也知道,有 ‘已知的未知’,也就是说,有些事,我们现在知道我们不知道.但是,同样存在‘不知的不知’——有些事,我们不知道我们不知道. 上一章 ...

  2. 机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

    k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定 ...

  3. Python实现kMeans(k均值聚类)

    Python实现kMeans(k均值聚类) 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=> ...

  4. 机器学习理论与实战(十)K均值聚类和二分K均值聚类

    接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...

  5. ML: 聚类算法-K均值聚类

    基于划分方法聚类算法R包: K-均值聚类(K-means)                   stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...

  6. 机器学习算法与Python实践之(六)二分k均值聚类

    http://blog.csdn.net/zouxy09/article/details/17590137 机器学习算法与Python实践之(六)二分k均值聚类 zouxy09@qq.com http ...

  7. 机器学习之路:python k均值聚类 KMeans 手写数字

    python3 学习使用api 使用了网上的数据集,我把他下载到了本地 可以到我的git中下载数据集: https://github.com/linyi0604/MachineLearning 代码: ...

  8. k均值聚类算法原理和(TensorFlow)实现

    顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...

  9. SciPy k均值聚类

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  10. 聚类之K均值聚类和EM算法

    这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...

随机推荐

  1. Redisson 源码分析及实际应用场景之实现延迟队列

    redis 参考目录: 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现 https://www.cnblogs.com/yizhiamumu/p/16556153.html 生产级Re ...

  2. CIIS 2023 丨聚焦文档图像处理前沿领域,合合信息 AI 助力图像处理与内容安全保障

    近日,2023第十二届中国智能产业高峰论坛(CIIS 2023)在江西南昌顺利举行.大会由中国人工智能学会.江西省科学技术厅.南昌市人民政府主办,南昌市科学技术局.中国工程科技发展战略江西研究院承办. ...

  3. Spring —— bean配置

    基础配置      别名配置    作用范围配置      适合交给容器进行管理的bean   (复用性的对象,无需重复创建的对象) 表现层对象 业务层对象 数据层对象 工具对象   不适合交给容器管 ...

  4. Adobe Acrobat XI Pro 打开pdf报错 109

    事件起因: 某同事在使用 Adobe Acrobat XI Pro 打开pdf文件时,会偶发性的报错 "处理页面时发生错误.读取本文当时出现问题(109)."   解决办法: 在网 ...

  5. 离线安装Redis

    redis 直接去官网下载tar包就可以 主要是gcc 环境的安装包不太好找,我下载的还缺少 make 如果服务器比较干净,还得预装一下lrzsz-0.12.20.tar.gz 上传下载文件,unzi ...

  6. 【赵渝强老师】使用Weblogic的WLST工具

    一.什么是Weblogic WLST? WebLogic 脚本工具 (WebLogic Scripting Tool , WLST) 是一种命令行脚本界面,系统管理员和操作员用它来监视和管理 WebL ...

  7. form data 与request payload的区别以及php接收这些数据的方法

    form data 与request payload的区别以及php接收这些数据的方法 以前与前端交互一直都是POST.GET的,PHP端就直接$_POST,$_GET来接收,从来没有出现过以外. 最 ...

  8. windows下配置pytorch环境

    借鉴了B站大佬的视频,自己总结安装如下. 首先安装anaconda 按照操作顺序,依次安装,按照我个人习惯,不喜欢讲文件安装在C盘,你们自己决定. 安装完毕之后. 之后打开Anaconda Promp ...

  9. 63.CDN优化

    虽然CDN引入组件库可以优化项目,减轻服务器负载,但是在真实的项目开发中不推荐使用CDN : 因为: 1. 使用第三方服务器不稳定 2. 需要后端配置 3. 要知道组件库的全局变量名

  10. Oracle问题:alter update modify 的区别是什么?

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247486480&idx=1 ...