KMeans

典型的划分聚类划分聚类划分聚类

使用场景

  1. KMeans算法属于无监督学习,解决聚类的问题
  2. 对于数据集D, 不需提供数据标记,大大减少工作量
  3. 数据集D必须是凸集,非凸数据集难以收敛
  4. 必须先指定聚类簇数k

k-means优点

  1. 原理简单,实现容易,可解释性较强
  2. 聚类效果较好
  3. 主要的调参只有k

k-means缺点

  1. k值的选择不好把握
  2. 只适用于凸集,非凸数据集难以收敛
  3. 损失函数非凸,易收敛于局部最优解
  4. 对于噪声和异常点比较敏感

基本思想

簇内尽量紧凑,簇间尽量分散

算法步骤

  1. 随机初始化kkk个聚类中心点:可以从样本集S中随机选择,也可以随机生成
  2. 遍历样本集S所有样本点,计算每个样本xix_ixi​到kkk个中心点的距离,将xix_ixi​分配给距离最近的中心点所在的簇(给xix_ixi​一个标记y^i\hat y_{i}y^​i​)
  3. 取各个簇内所有样本的均值样本作为新的聚类中心点
  4. 重复2,3过程,直到达到一定的迭代次数或者聚类中心不再改变

python实现

import numpy as np
from matplotlib import pyplot as plt
import logging
logging.basicConfig(level=logging.INFO,format="%(asctime)s %(message)s")
import os#计算欧式距离
def l2(x,y):"""x:样本点向量y:样本点向量return:距离标量"""return np.sqrt(np.sum(np.power(x-y,2)))#初始化聚类中心 函数
def init_centers(S,k,method="select"):"""S:样本数据集,np数组k:初始化聚类中心点的个数method:初始化的方式defaul,'select',random select k points from S'random',random generation of k pointsreturn np数值"""if method=="select":#select k points from Spoints=np.arange(S.shape[0])select_points=np.random.choice(points,k)return S[select_points]elif method=="random":#random generation#样本集S每一列特征的min,max之间随机生成一个数值#样本集的特征数n=S.shape[1]#初始化聚类中心点centers=np.empty((k,n))#生成聚类中心点每个特征的值for j in range(n):min_j,max_j=S[:,j].min(),S[:,j].max()range_j=max_j-min_j#生成第j特征的值,一维赋值centers[:,j]=(min_j+range_j*np.random.rand(k,1)).ravel()return centerselse:#待扩展功能passdef nearest_neighbors(x,centers):"""x:单个样本向量centers:聚类中心点,np数值return (min_index,min_dist)min_index:最近邻的索引min_dist:最近邻的距离"""#初始化最小距离及其索引min_index=-1min_dist=np.inf #正无穷#遍历中心点,计算距离for idx,center in enumerate(centers):x_center_dist=l2(x,center)if x_center_dist<min_dist:min_dist=x_center_distmin_index=idxreturn min_index,min_dist#定义KMeans聚类函数
def kmeans(S,k,dist_measure=l2,max_iter=10,min_threshold=0.05):"""S:样本集,np数组k:聚类簇数dist_measure:距离度量,默认欧式距离max_iter:最大迭代次数,intmin_threshold:聚类中心点变化的距离阈值,小于这个幅度则停止迭代return (tag,centers,sse_list)tag:样本标签centers:聚类中心点sse_list:误差平方和 list"""#样本总数,特征总数m,n=S.shapelogging.info("current samples shape:%d,%d"%(m,n))#1初始化k个聚类中心点cluster_centers=init_centers(X,k,method="random")#初始化样本标签 tagtag=np.zeros(m)#迭代过程中的ssesse_list=[]#控制迭代的轮数,只实现max_iteriter_times=0while max_iter and iter_times<max_iter:#初始化误差平方和sse=0#2 计算所有样本的  最近邻 聚类中心for i in range(m):min_index,min_dist=nearest_neighbors(S[i,:],cluster_centers)#样本i放入最近邻中心点所在簇tag[i]=min_indexsse+=min_dist**2sse_list.append(sse)#重新计算聚类中心点for idx in range(k):cluster_centers[idx,:]=np.mean(S[y_hat==idx],axis=0)iter_times+=1return tag,cluster_centers,sse_listif __name__=="__main__":X=np.loadtxt("kmeansSamples.txt")y_hat,centers,sse_list=kmeans(X,3,max_iter=6)print("cluster tag:",y_hat)print("sse list",sse_list)fig=plt.figure()plt.scatter(X[:,0],X[:,1],s=50,c=y_hat,label="samples")plt.scatter(centers[:,0],centers[:,1],s=300,c=np.unique(y_hat),marker="*",label="centers")plt.grid()plt.legend(loc="best",frameon=True,framealpha=0.7)plt.title("KMeans cluster")plt.axis("equal")fig.show()

sklearn库的实现

from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import numpy as np
from matplotlib import pyplot as plt
#实例化一个kmeans对象
kmeans=KMeans(n_clusters=3,random_state=9)
#加载数据
x=np.loadtxt("kmeansSamples.txt")
#数据归一化
ss=StandardScaler()
x_scale=ss.fit_transform(x)
#聚类拟合
kmeans.fit(x_scale)
#聚类标签
kmeans.labels_
#聚类中心点
kmeans.cluster_centers_
#对未知样本分簇
y_pred=kmeans.predict(x_new)

改进的kmeans

  1. 二分k-means:对每个簇进行k=2的kmeans聚类分簇,对SSE减少最多的簇优先二分聚类,促使算法收敛于全局最优解
  2. k-means++:初始化距离较远的聚类中心点(避免初始化中心点的扎堆),促使算法收敛于全局最优解
  3. k-mediods:重新选择聚类中心,而不是取每个簇的均值,让本簇所有其他样本点到该点的距离和最小,减少噪声的干扰
  4. mini batch kmeans:对大数据集时,采用抽样部分数据集做kmeans聚类,利用找到的聚类中心,对整个数据集分簇,从而降低kmeans的时间复杂度,但是以降低部分优化质量为代价。

基于kmeans项目

KMeans总结

Kmeans 聚类算法相关推荐

  1. java iris_利用K-Means聚类算法实现对iris.data.ulab

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 利用K-Means聚类算法实现对iris.data.ulabel数据的聚类,这是在网上找到如果要换成我的iris.date iris.date.ulabl ...

  2. k-means聚类算法从入门到精通

    k-means算法是非监督聚类最常用的一种方法,因其算法简单和很好的适用于大样本数据,广泛应用于不同领域,本文详细总结了k-means聚类算法原理 . 目录 1. k-means聚类算法原理 2. k ...

  3. 基于K-Means聚类算法的主颜色提取

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01.简介 本期我们将一起实现基于K-Means聚类算法的主色提取 ...

  4. K-means聚类算法和模糊C-means聚类算法

    K-means聚类算法和模糊C-means聚类算法 1.K-means聚类算法 K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数, ...

  5. 基于Kmeans聚类算法的图像分割(色彩分割)实战

    基于Kmeans聚类算法的图像分割(色彩分割)实战 图像分割是将一幅图像分割成多个像素区域的任务.属于同一对象类型的所有像素都被分配到同一类别下.图像分类是给一副完整的图像一个类别,目标检测是检测到图 ...

  6. 基于经典的机器学习k-means聚类算法实现对三通道图片的压缩操作

    https://www.toutiao.com/a6573221465104056846/ 压缩图片的原理 k-means算法实现图像的压缩是k-means聚类算法的一个经典的应用,它把一个彩色图压缩 ...

  7. K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

    原文:http://www.cnblogs.com/yixuan-xu/p/6272208.html K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means ...

  8. K-Means聚类算法进行压缩图片

    K-Means聚类算法(二):算法实现及其优化 清雨影 2 年前 (最近在车间干活的时候把手砸伤了,所以打字还是有点不便,大家原谅我更新的慢,加上赞比较少,心情比较低落TAT) 首先介绍一下题图,这个 ...

  9. 【数据挖掘】数据挖掘总结 ( K-Means 聚类算法 | 二维数据的 K-Means 聚类 ) ★

    文章目录 一. K-Means 聚类算法流程 二. 二维数据的 K-Means 聚类 1. 第一次迭代 2. 第二次迭代 参考博客 : [数据挖掘]聚类算法 简介 ( 基于划分的聚类方法 | 基于层次 ...

  10. 机器学习算法精讲20篇(一)-k-means聚类算法应用案例(附示例代码)

    前言 k-means算法是非监督聚类最常用的一种方法,因其算法简单和很好的适用于大样本数据,广泛应用于不同领域,本文详细总结了k-means聚类算法原理 . 以下是我为大家准备的几个精品专栏,喜欢的小 ...

最新文章

  1. 基于NB-IoT的智慧路灯监控系统(NB-IoT专栏—实战篇4:PC应用开发)
  2. cocos2d-x android 入门
  3. eclipse对maven项目进行打war包
  4. 什么是覆盖索引?如何利用覆盖索引进行SQL语句优化?
  5. aspnetdb生成
  6. html5 数据初始化,使用HTML5中的element.dataset操作自定义data-*数据
  7. 矩阵分析 (五) 矩阵的分解
  8. 2013华为校园招聘机试题9月10日题(杭州)
  9. 一文弄清传统软件开发与互联网软件开发的异同
  10. python爬虫获取网易云音乐歌单
  11. 数模(8)——排队论模型
  12. 【LCD1602----LiquidCrystal库的使用1
  13. Linux系统下搭建域名服务器 (转http://elaine.blog.51cto.com/336598/65449)
  14. 聚合支付服务商“利楚扫呗”完成5000万元A轮融资 富友集团领投
  15. 树莓派自己加内存条_拔掉MacBookPro,用8GB树莓派4工作一天,体验原来是这样的...
  16. 一夜爆红吸粉千万“四位超级网红”背后的四大真相是什么呢?
  17. 美的美少年计划(Java开发工程师)实习面经
  18. 技术分享| anyRTC服务单端口设计
  19. 赛效:WPS(word)文档怎样在方框里打钩
  20. DS18B20传感器的原理

热门文章

  1. 如何用邮编查询API快速开发
  2. 【HUSTOJ】1054: 字符图形10-字母三角
  3. Sopcast软件中凤凰卫视频道列表代码
  4. 百度网盘Python客户端bypy
  5. 基于python的交通_基于Python的交通流数据清洗
  6. 使用Androidkiller或APKIDE编译APK文件时出现libpng error: Not a PNG file的错误
  7. 计算机电子商务o2o,电商o2o模式
  8. layabox 打印_LayaBox开发实战之实现一个简单的模板类
  9. EXP-00091: Exporting questionable statistics.问题解决!(转)
  10. libcurl官方手册