K均值(Kmeans)是最基本的聚类算法。优点是简单易实现,缺点是需要预先指定簇的个数,并且聚类效果不稳定, 易受初始化质心的影响

核心思想

将样本点指派到最近的质心所在簇,逐步更新簇的质心。

算法流程

  • Input: 训练数据集data, 簇的个数, MSE阈值epsilon, 最大迭代次数maxstep
  • Out: 簇的质心坐标以及样本点簇标记
  • Step1:初始化质心。
  • Step2: 将样本点指派到最近的质心所在簇。
  • Step3: 计算样本的MSE(所有样本到其归属簇质心的距离平方的均值,也称为各个类畸变程度之和)。 若小于epsilon,则终止迭代,反之转步骤4
  • Step4: 更新簇质心(即该簇包含所有样本的坐标均值)。转步骤2

代码

"""
K均值聚类算法
给定初始簇的个数,迭代更改样本与簇的隶属关系,更新簇的中心为样本的均值
"""
from collections import defaultdict
import numpy as np
import copyclass KMEANS:def __init__(self, n_cluster, epsilon=1e-2, maxstep=2000):self.n_cluster = n_clusterself.epsilon = epsilonself.maxstep = maxstepself.N = Noneself.centers = Noneself.cluster = defaultdict(list)def init_param(self, data):# 初始化参数, 包括初始化簇中心self.N = data.shape[0]random_ind = np.random.choice(self.N, size=self.n_cluster)self.centers = [data[i] for i in random_ind]  # list存储中心点坐标数组for ind, p in enumerate(data):self.cluster[self.mark(p)].append(ind)returndef _cal_dist(self, center, p):# 计算点到簇中心的距离平方return sum([(i - j) ** 2 for i, j in zip(center, p)])def mark(self, p):# 计算样本点到每个簇中心的距离,选取最小的簇dists = []for center in self.centers:dists.append(self._cal_dist(center, p))return dists.index(min(dists))def update_center(self, data):# 更新簇的中心坐标for label, inds in self.cluster.items():self.centers[label] = np.mean(data[inds], axis=0)returndef divide(self, data):# 重新对样本聚类tmp_cluster = copy.deepcopy(self.cluster)  # 迭代过程中,字典长度不能发生改变,故deepcopyfor label, inds in tmp_cluster.items():for i in inds:new_label = self.mark(data[i])if new_label == label:  # 若类标记不变,跳过continueelse:self.cluster[label].remove(i)self.cluster[new_label].append(i)returndef cal_err(self, data):# 计算MSEmse = 0for label, inds in self.cluster.items():partial_data = data[inds]for p in partial_data:mse += self._cal_dist(self.centers[label], p)return mse / self.Ndef fit(self, data):self.init_param(data)step = 0while step < self.maxstep:step += 1self.update_center(data)self.divide(data)err = self.cal_err(data)if err < self.epsilon:breakreturnif __name__ == '__main__':from sklearn.datasets import make_blobsfrom itertools import cycleimport matplotlib.pyplot as pltdata, label = make_blobs(centers=4, cluster_std=1.2)km = KMEANS(4)km.fit(data)cluster = km.clusterdef visualize(data, cluster):color = 'bgrym'for col, inds in zip(cycle(color), cluster.values()):partial_data = data[inds]plt.scatter(partial_data[:, 0], partial_data[:, 1], color=col)plt.show()returnvisualize(data, cluster)

我的GitHub
注:如有不当之处,请指正。

聚类——K均值简介及Python实现相关推荐

  1. 算法-聚类-K均值与模糊K均值:原理+python代码

    这篇文章是根据作业修改后得到的,个人感觉写的比较详细了.但还有许多不足,希望大家评论指出. K均值聚类与模糊K均值 1. 算法原理及流程 相关名词解释如表1. 表1-相关名词解释 1.1 K均值算法原 ...

  2. 图像聚类-K均值聚类

    最近做的一个东西跟这个相关,本来希望是用深度学习对于没有标签的图像数据进行分类,但是通常情况下,深度学习是对有标签的数据进行学习,目的是用来自动提取特征,代替传统的手工提取特征.因此,比较容易想到,对 ...

  3. 聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

    import numpy as np x=np.random.randint(1,100,[20,1]) #在1-100范围中产生20行1列的随机数组 y=np.zeros(20) k=3 #取数据中 ...

  4. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

  5. K均值 - 案例实现(python)

    K均值 K均值案例(python) 背景介绍 算法定义 K值的选取 案例实现(python) 数据集 代码实现 运行结果 总结 参考文献 K均值案例(python) k均值聚类算法(k-means c ...

  6. (学习笔记)聚类算法 - k均值算法(k-means)

    聚类之K均值算法 聚类介绍 k均值算法步骤 Python实现 参考文献 聚类介绍 聚类是一种经典的无监督学习方法. 聚类的目的是将数据集中的样本划分为若干个通常是不相交的子集,每个子集被称为簇,以此来 ...

  7. EM算法应用:k均值聚类(k-means)和高斯混合模型(GMM)

    文章目录 k-means聚类 EM角度的理解 算法流程 特点 k值选择 局限性 高斯混合模型 GMM的问题描述 1,明确隐变量 2.EM算法的E步:确定Q函数 3. EM算法的E步 4. 停止条件 上 ...

  8. 多元统计分析--聚类分析(系统性聚类、K均值聚类)

    摘要 系统聚类分为Q型聚类与R型聚类.前者对样品进行聚类,后者对变量进行聚类.在本文中,我们探讨对样品的分类. 文章目录 摘要 主要思想 相似性的度量 系统聚类 K均值聚类 主要思想 聚类,在样品没有 ...

  9. 非监督学习: K 均值聚类(原理、步骤、优缺点、调优)

    支持向量机.逻辑回归.决策树等经典的机器学习算法主要用于分类问题,即根据一些己给定类别的样本, 训练某种分类器,使得它能够对类别未知的样本进行分类.与分类问题不同,聚类是在事先并不知道任何样本类别标签 ...

  10. 无监督分类:聚类分析(K均值)

    1.K均值聚类 K均值聚类是最基础的一种聚类方法.K均值聚类,就是把看起来最集中.最不分散的簇标签分配到输入训练样本{xi}中.具体而言就是通过下式计算簇y的分散状况: 在这里,∑i,yi=y表示的是 ...

最新文章

  1. win32汇编--加载位图(bmp)资源
  2. 推荐JQuery学习简介
  3. 计算机课玩手机检讨500,玩手机检讨书500字
  4. 【解决问题】useBean类属性[com.cheng.pojo.People]的值无效导致HTTP500问题
  5. [jQuery原理] jQuery属性操作相关方法
  6. 【Flink】Flink TaskManager 一直 User file cache uses directory
  7. 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子
  8. 从Nest到Nesk -- 模块化Node框架的实践
  9. ARM嵌入式系统网络驱动中的重要数据结构
  10. 写一个控制gpio的驱动
  11. XUI 一个简洁而优雅的Android原生UI框架,解放你的双手!
  12. win10系统cf玩一局就服务器断开,win10系统玩cf游戏经常自动退出的详细步骤
  13. 华为事件对我们个人成功的启示:为什么自强自立不是出路?
  14. JAWS模块分析(小东子)
  15. 在金山云上,“雷布斯”有这些野心
  16. win7/win10上安装谷歌官方无广告的安卓模拟器 - Android Studio - 下载安装AVD虚拟机
  17. 解决:Error: geom_point requires the following missing aesthetics: y Run `rlang::last_error()`
  18. 【1034】计算三角形面积
  19. Mp4视频首帧加载时间过长问题分析
  20. antdvue upload组件的customRequest自定义上传事件一直uploading处理方法

热门文章

  1. 基金投资入门 5:基金的业务类型及交易中的费用
  2. 常见手机病毒学习总结
  3. 百度搜索引擎排名规则,最新排名与优化的因素有哪些?
  4. SpringBoot 访问web中的静态资源
  5. 如何解决“应用程序无法启动,因为应用程序的并行配置不正确“问题
  6. 面试官问我 RabbitMQ 消息如何插队?
  7. 明确数据分析目标的 3 个步骤
  8. 银河麒麟SP1解压压缩包后文件名称乱码
  9. 惊喜! UE4 + ftrack开源了!
  10. BZOJ4134 : ljw和lzr的hack比赛